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

Java—是否可以逐行读取文件,停止,然后立即开始读取我停止的字节?,java,ascii,buffer,byte,filereader,Java,Ascii,Buffer,Byte,Filereader,我在解析文件的ascii部分时遇到了一个问题,一旦我点击了end标记,就立即开始从该点开始读取字节。在Java中,我所知道的读取一行或整个单词的所有内容都会创建一个缓冲区,这会破坏在我的停止点之后立即获取字节的任何机会。这样做的唯一方法是逐字节读入、查找新行、在新行之前重建所有内容、查看它是否是我的结束标记并从那里开始?是的,逐字节的说法是正确的。抽象有它的缺点。这是可能的,但据我所知,API中的类是不可能的 您可以手动执行此操作-将其作为一个文件打开,它支持标记/重置。您逐块读取(字节[]),

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

是的,逐字节的说法是正确的。抽象有它的缺点。

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

您可以手动执行此操作-将其作为一个文件打开,它支持
标记
/
重置
。您逐块读取(
字节[]
),并将其解析为ASCII。最终,你会把它积累在一个缓冲区中,直到你碰到标记。
但是在您阅读
之前,请先调用
标记
。如果您认为您已经用ASCII读取了所有需要的内容,那么可以调用
reset
,然后调用
read
转储ASCII部分的其余部分。现在您有了一个
BufferedInputStream
(这是一个
InputStream
)可以读取文件的二进制部分。

我认为最好的办法是放弃“行”的概念。要查找结束标记,请创建一个大小刚好足以包含结束标记的文件,逐字节读取该文件,并在每个字节后检查该文件是否包含该标记


有更复杂、更高效的搜索算法,但区别仅与较长的搜索词有关(可能您的结束标记较短)。

此文件有多大?我的第一个想法是将整个内容读入ByteBuffer或ByteArrayOutputStream,而不尝试对其进行处理,然后通过比较字节值来定位标记。一旦知道文本部分的结束位置和二进制部分的开始位置,您就可以根据需要处理每个部分。

文件是在增长还是静止


如果它是静态的,请参见

@crimson:aaaaaaaaa rrrrrrrrrrrrrrrrrrrrrrrr gggggggggggggggg Java在字符流和字节流之间的强大区别,虽然它对于确保您始终正确处理数据以及区分字符串和编码非常有用,但这确实有点困难。我认为他无法选择文件格式。我看到了他描述的那种文件。例如,我相信Linux的Java2SE安装工具包也是以同样的方式存储的。我不是说他必须更改文件格式,只是说他不应该试图一次读取一个字节,而不是依赖于“行”的概念。@michael:是否有用于环形缓冲区的标准java类?在谷歌搜索“ring buffer java”后找不到相应的java站点不,标准API中没有实现。但这是一个非常简单的数据结构,可以自己实现。或者,如果每个add()的长度等于end标记的长度,则可以为此滥用ArrayQue,方法是为每个add()调用removeFirst()?我不知道end标记到底有多远,所以我能想到的唯一数据结构就是arraylist。看看缓冲区,我似乎需要知道分配多少,但我不知道。处理这些东西的最好方法是arraylist吗?你可以读取100字节。它是否包含结束标记(由于ASCII编码,易于测试)?不,那它就是绳子的一部分。在某个地方记住它(将其解析为字符串)。你读下一个街区。同样,它不包含结束标记,您可以跟踪它。等等在某一点上,您读取了具有结束标记的块。切割第一部分(在标记之前),然后将其存储以进行字符串解析。您倒回到块的开头,读取/跳过字节,直到标记之后,您就有了正确的二进制输入流。您可以连接累积的片段并使用
读取器
。TBCYou将需要小心在两个连续块上生成结束标记。在连接之前,您可以将
字节[]
s存储为
列表
,以避免重复
系统。arraycopy
s顺便说一句,100是坏的。您应该使用类似4096或16384的文件。不是很大的文件;我喜欢这个简单。我会试试看。事实上,我现在读到这篇文章后真的很喜欢。因此,我们的计划是将这个洞读入一个bytebuffer(我知道文件有多大,以字节为单位,所以这个缓冲区的大小合适)。然后我在bytebuffer中搜索我的end标记,然后在那里切片缓冲区。这样行吗?我想搜索我的结束标记将涉及搜索第一个字节,如果找到,请检查第二个、第三个等以确认。在处理字节方面,将两个部分读入单独的字节数组(字节[])是最灵活的选择吗?是否有某种方法可以代替将fileinputstream传递到我传递字节数组的文件读取器?其中一个字节数组将充满ascii编码的文本,如果可能,我希望对其进行缓冲并读取行(如使用BufferedReader或Scanner)。这样的精简是可能的吗?啊,我可以把我的字节数组传递到ByteArrayInputStream中,我可以把它传递到我的InputStreamReader中,将字节转换成字符,对吗?从那里到一个文件阅读器,再到一个BufferedReader?事实上,我决定我不需要比bufferedinputstream更多的东西来做这些。我会找到结束标记,将所有其他内容读入字节数组,重置缓冲区,然后将第一部分正常读入扫描器或bufferedreader,以便轻松地取出ascii。它是静态的,但我看不出MappedBytebytebuffer如何真正为我提供比普通bytebuffer更多的功能,只需将所有字节读入数组等等。