2

我在尝试解析文件的 ascii 部分时遇到问题,一旦我点击结束标记,立即开始从该点开始读取字节。我在 Java 中所知道的读取一行或整个单词的所有内容都会创建一个缓冲区,这会破坏在我的停止点之后立即获取字节的任何机会。这样做的唯一方法是逐字节读取,找到换行符,在换行符之前重建所有内容,看看它是否是我的结束标签,然后从那里开始?

4

5 回答 5

2

这是可能的,但据我所知,API 中的类没有。

您可以手动进行 - 将其打开为支持/的BufferedInputStream。您逐块读取 ( ) 并将其解析为 ASCII。最终,您将其累积在缓冲区中,直到您击中标记。但在你打电话之前。如果你认为你已经阅读了所有你需要的 ASCII,你打电话,然后你打电话转储剩下的 ASCII 部分。现在你已经准备好读取文件的二进制部分了。markresetbyte[]readmarkresetreadBufferedInputStreamInputStream

于 2009-08-27T14:23:47.447 回答
2

我认为最好的想法是放弃“线条”的概念。要找到结束标记,请创建一个足够大以包含结束标记的环形缓冲区,逐字节读取它,并在每个字节后检查它是否包含该标记。

有更复杂和更有效的搜索算法,但区别只与较长的搜索词相关(大概你的结束标签很短)。

于 2009-08-27T14:25:34.263 回答
1

这个文件有多大?我的第一个想法是在不尝试处理的情况下将整个内容读入 ByteBuffer 或 ByteArrayOutputStream,然后通过比较字节值来定位标签。一旦您知道文本部分的结束位置和二进制部分的开始位置,您就可以适当地处理每个部分。

于 2009-08-27T17:52:26.577 回答
0

是的,你是对的。抽象有其缺点。

于 2009-08-27T14:19:47.673 回答
0

文件是在增长还是静态的?

如果它是静态的,请参阅http://java.sun.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

于 2009-08-27T22:37:57.000 回答