如何在Java中使用缓冲读取器再次读取文件?
我有一个Java代码,它使用缓冲区读取器读取输入文件,直到readLine方法返回null。我需要无限次地再次使用该文件的内容。我怎样才能从头再读取此文件如果你想这样做,你可能想考虑一下。这样,您就可以明确地将位置重新设置为开始,并从那里重新开始阅读。如何在Java中使用缓冲读取器再次读取文件?,java,bufferedreader,Java,Bufferedreader,我有一个Java代码,它使用缓冲区读取器读取输入文件,直到readLine方法返回null。我需要无限次地再次使用该文件的内容。我怎样才能从头再读取此文件
如果您想这样做,您可能需要考虑一下。有了它,您可以显式地将位置设置回开头,然后从那里重新开始阅读。
我建议使用commons库我认为有一种方法可以将文件读入byteArray,这可能是另一种方法我建议使用commons库
我认为有一个调用,可以将文件读入byteArray,这可能是另一种方法您可以关闭并重新打开它。另一种选择是:如果它不是太大,把它的内容放到一个列表中。你可以关闭它,然后重新打开它。另一种选择:如果不是太大,将其内容放入列表中。不确定您是否考虑了屏幕上的标记和重置方法
如果您的文件大小只有几MB,并且您可以在文件开头设置标记,并在到达文件末尾后继续重置,则可以选择此选项。另外,对同一文件的后续读取似乎将完全从缓冲区提供,而无需转到磁盘。不确定您是否考虑了磁盘上的标记和重置方法
如果您的文件大小只有几MB,并且您可以在文件开头设置标记,并在到达文件末尾后继续重置,则可以选择此选项。同样,对同一文件的后续读取似乎将完全从缓冲区进行,而无需进入磁盘。缓冲区读取器仅支持重置为缓冲数据的位置。但如果文件大于缓冲区,则无法转到文件的开头。 解决: 1.重新开放
2.使用RandomAccessFile缓冲区读取器仅支持重置为缓冲数据的位置。但如果文件大于缓冲区,则无法转到文件的开头。 解决: 1.重新开放 2.使用RandomAccessFile应使用一个读卡器读取文件一次。如果要再次读取该文件,请基于该文件创建一个新读取器 使用的IO实用程序,您可以创建一个很好的抽象,让您可以根据需要多次读取文件。这为您提供了一个可以通过随时调用getInput从中检索新读取器的方法 更好的是,番石榴有许多实用的方法,可以直接利用输入供应商。。。这使您不用担心自己关闭提供的读卡器。该类包含大多数与文本相关的IO实用程序。一个简单的例子:
public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
boolean needToDoMoreStuff = true;
while (needToDoMoreStuff) {
// this handles creating, reading, and closing the Reader!
List<String> lines = CharStreams.readLines(readerSupplier);
// do some stuff with the lines you read
}
}
如果您想对每一行执行一些处理,而不首先将每一行读入内存,您也可以使用readLines重载,该重载会占用一个时间。一个读卡器应该用于读取文件一次。如果要再次读取该文件,请基于该文件创建一个新读取器
使用的IO实用程序,您可以创建一个很好的抽象,让您可以根据需要多次读取文件。这为您提供了一个可以通过随时调用getInput从中检索新读取器的方法
更好的是,番石榴有许多实用的方法,可以直接利用输入供应商。。。这使您不用担心自己关闭提供的读卡器。该类包含大多数与文本相关的IO实用程序。一个简单的例子:
public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
boolean needToDoMoreStuff = true;
while (needToDoMoreStuff) {
// this handles creating, reading, and closing the Reader!
List<String> lines = CharStreams.readLines(readerSupplier);
// do some stuff with the lines you read
}
}
如果您想对每一行进行一些处理,而不首先将每一行读取到内存中,您也可以使用readLines重载,该重载需要一个时间。在检查是否不能读取更多行后,通过递归调用run函数来完成此操作-下面是一个示例
// Reload the file when you reach the end (i.e. when you can't read anymore strings)
if ((sCurrentLine = br.readLine()) == null) {
run();
}
在检查是否不能读取更多的行之后,通过递归调用run函数来实现这一点——下面是一个示例
// Reload the file when you reach the end (i.e. when you can't read anymore strings)
if ((sCurrentLine = br.readLine()) == null) {
run();
}
我也面临着同样的问题,并开始徘徊在这个问题上 一,。使用标记和重置方法: BufferedReader可以使用FileReader和FileInputStream创建。FileReader不支持标记和重置方法。我尝试这样做时遇到了一个异常。甚至当我尝试使用FileInputStream时,我也没能做到,因为我的文件很大,我想即使是你的也是如此。如果文件长度大于缓冲区,则标记和重置方法对FileReader和FileInputStream都不起作用。更多关于这方面的信息,请访问@jtahlborn 二,。关闭并重新打开文件 当我关闭并重新打开文件并创建一个新的BufferedReader时,它工作得很好。
我想理想的方法是重新打开文件,并构造一个新的BufferedReader作为文件读取器,或者FileInputStream只应用于读取文件一次 我也面临同样的问题
try {
BufferedReader br = new BufferedReader(new FileReader(input));
while ((line = br.readLine()) != null)
{
//do somethng
}
br.close();
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}
然后开始徘徊在这个问题上
一,。使用标记和重置方法:
BufferedReader可以使用FileReader和FileInputStream创建。FileReader不支持标记和重置方法。我尝试这样做时遇到了一个异常。甚至当我尝试使用FileInputStream时,我也没能做到,因为我的文件很大,我想即使是你的也是如此。如果文件长度大于缓冲区,则标记和重置方法对FileReader和FileInputStream都不起作用。更多关于这方面的信息,请访问@jtahlborn
二,。关闭并重新打开文件
当我关闭并重新打开文件并创建一个新的BufferedReader时,它工作得很好。
我想理想的方法是重新打开文件,并构造一个新的BufferedReader作为文件读取器,或者FileInputStream只应用于读取文件一次 你为什么要这样做?原因可能会改变答案或提示不同的解决方案。另外,您是说您实际上不想再次读取文件的内容,只是读取第一次读取的相同缓冲数据?你没有说清楚。我想从中读取的文件是一个很长的人员列表,请检查用户输入的人员列表是否存在于列表中。包含列表的文件大约为1.9MB,用户会输入十几个名称……为什么要这样做?原因可能会改变答案或提示不同的解决方案。另外,您是说您实际上不想再次读取文件的内容,只是读取第一次读取的相同缓冲数据?你没有说清楚。我想从中读取的文件是一个很长的人员列表,请检查用户输入的人员列表是否存在于列表中。包含列表的文件约为1.9MB,用户将输入十几个名称…您的代码可能需要更正-如果出现任何错误,并从try-catch块中引发异常,BufferedReader保持打开状态。是否建议添加finally?您的代码可能需要更正-如果出现任何错误并且从try-catch块中引发异常,BufferedReader将保持打开状态。是否建议添加finally?
try {
BufferedReader br = new BufferedReader(new FileReader(input));
while ((line = br.readLine()) != null)
{
//do somethng
}
br.close();
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}