我在尝试解析文件的ascii部分时遇到问题,一旦我点击结束标记,IMMEDIATELY会从该点开始读取字节。我用Java知道读取一行或整个单词的所有内容都会创建一个缓冲区,这会破坏在我的停止点之后立即获取字节的任何机会。是唯一的方法是逐字节读取,找到新行,重新构建换行符之前的所有内容,看看它是否是我的结束标记,然后从那里开始?
答案 0 :(得分:2)
这是可能的,但据我所知,不是API中的类。
您可以手动执行此操作 - 以BufferedInputStream打开,支持mark
/ reset
。您逐块读取(byte[]
)并将其解析为ASCII。最后,您将它累积在一个缓冲区中,直到您点击标记。
但在你read
之前,你致电mark
。如果您认为自己阅读了ASCII中所需的全部内容,则可以调用reset
然后调用read
来转储剩余的ASCII部分。现在你有一个BufferedInputStream
(这是一个InputStream
)准备好读取文件的二进制部分。
答案 1 :(得分:2)
我认为最好的想法是放弃“线条”的概念。要查找结束标记,请创建一个足够大的ring buffer来包含结束标记,逐字节读取,并在每个字节后检查它是否包含标记。
有更复杂和有效的搜索算法,但区别仅在于较长的搜索字词(可能是您的结束标记很短)。
答案 2 :(得分:1)
这个档案有多大?我的第一个想法是将整个事物读入ByteBuffer或ByteArrayOutputStream而不尝试处理它,然后通过比较字节值来定位标记。一旦知道文本部分的结束位置和二进制部分的开始,就会根据需要处理每个部分。
答案 3 :(得分:0)
是的,你是逐字节的。抽象有其缺点。
答案 4 :(得分:0)
文件是否在增长,还是静止?
如果是静态的,请参阅http://java.sun.com/javase/6/docs/api/java/nio/MappedByteBuffer.html