Java - 是否可以逐行读取文件,停止,然后立即开始读取停止的字节?

问题描述:

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

这个文件有多大?我的第一个想法是将整个事件读入ByteBuffer或ByteArrayOutputStream而不尝试处理它,然后通过比较字节值来定位标记。一旦您知道文本部分结束并开始二进制部分,就会适当地处理每个部分。

+0

不是很大的文件;我喜欢这个简单。我会试试看。 – sepiroth 2009-08-27 18:43:47

+0

其实我真的很喜欢这个,现在我读了它。所以这个计划是将漏洞读入一个字节缓冲区(我知道文件有多大,以字节为单位,所以这个缓冲区将是正确的大小)。然后我搜索我的结束标记的字节缓冲区,然后我在那里切分缓冲区。那会有用吗?我想想搜索我的结束标签将涉及搜索第一个字节,如果找到,检查第二,第三等确认。 – sepiroth 2009-08-27 18:48:30

+0

这就是我的想法。 – 2009-08-27 18:55:56

是的,你是正确的逐字节。抽象有其缺点。

+0

@crimson:AAAAAAARRRRRRRRRRRRGGGGGGGGGGGGGG – sepiroth 2009-08-27 14:22:03

+0

Java的性格和字节流之间的强区别,同时确保您始终正确处理数据和字符串和编码区分它们有用,确实让这个有点困难。 – 2009-08-27 14:23:02

这是可能的,但据我所知不是从API的类。

您可以手动完成 - 将其打开为BufferedInputStream,它支持mark/reset。您逐块读取(byte[]),并将其解析为ASCII。最终你将它累积在一个缓冲区中,直到你点击标记。 但在此之前read请致电mark。如果您确信自己读取了ASCII中所需的所有内容,则可致电reset,然后致电read转储剩余的ASCII部分。现在你有一个BufferedInputStream(这是一个InputStream)准备好读取文件的二进制部分。

+0

等待,这将如何工作?我不知道结束标记有多远,所以我能想到的唯一数据结构就是一个数组列表。看着缓冲区,似乎我需要知道分配给它多少,我不知道。是处理这个东西的最佳方式一个数组列表? – sepiroth 2009-08-27 17:10:07

+0

您读取100个字节。它是否包含结束标记(由于ASCII编码,易于测试)?不,那是它的一部分。记住它在某处(将其解析为字符串)。你读下一个块。再次,它不包含结束标记,您可以跟踪它。等等。有一次,你读了一个有结束标记的块。您剪下拳头部分(在标记之前),将其存储为字符串解析。您回滚到块的开头,您读取/跳过字节,直到标记之后,并且您拥有正确的二进制输入流。 您连接累积的部分并使用'Reader'。 TBC – Marian 2009-08-27 18:25:38

+0

您需要注意横跨两个连续块的结束标记。 您可以在连接之前将'byte []'作为'List '存储,以避免重复'System。arraycopy's 顺便说一句,那100是坏的。你应该使用类似4096或16384的东西。 – Marian 2009-08-27 18:26:30

我认为最好的想法是放弃“线条”的概念。要查找结束标记,请创建一个大小足以容纳结束标记的ring buffer,逐字节读入,并在每个字节后检查它是否包含标记。

还有更复杂和高效的搜索算法,但区别只在于较长的搜索条件(可能您的结束标记很短)。

+0

我不认为他可以选择文件格式。 我看到了他描述的那种文件。例如,我相信用于Linux的Java2SE安装工具包以相同的方式存储。 – Marian 2009-08-27 14:27:01

+0

我并不是说他必须改变文件格式,只是他不应该尝试一次读取一个字节,而不是依赖于“行”的概念。 – 2009-08-27 14:29:54

+0

@michael:有没有一个标准的java类环缓冲区?搜索“环形缓冲区java”后找不到相应的java网站 – sepiroth 2009-08-27 14:33:59

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

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

+0

它是静态的,但我没有看到mappedbytebuffer为了读取数组中的所有字节等等而如何为我提供比普通的bytebuffer更多的功能。 – sepiroth 2009-08-28 08:52:50