我有一个 Java 代码,它使用缓冲区读取器读取输入文件,直到readLine()
方法返回null
。我需要无限次地再次使用文件的内容。我怎样才能从头开始读取这个文件?
9 回答
您可以关闭并重新打开它。另一种选择:如果它不是太大,则将其内容放入一个列表中。
Reader
应该使用一次来读取文件。如果您想再次读取该文件,请Reader
在此基础上创建一个新文件。
使用Guava的 IO 实用程序,您可以创建一个很好的抽象,让您可以使用Files.newReaderSupplier(File, Charset)多次读取文件。这为您提供了一个InputSupplier<InputStreamReader>Reader
,您可以随时通过调用从中检索一个新的getInput()
。
更好的是,Guava 有许多InputSupplier
直接使用 s 的实用方法……这使您不必担心自己关闭提供的内容Reader
。CharStreams类包含大多数与文本相关的 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
}
}
给定 a File
,您可以像这样调用此方法:
File file = ...;
doSomeStuff(Files.newReaderSupplier(file, Charsets.UTF_8)); // or whatever charset
如果您想在不先将每一行读入内存的情况下对每一行进行一些处理,您也可以使用readLines
采用LineProcessor的重载。
缓冲区读取器仅支持 reset() 到缓冲数据的位置。但这不能转到文件的开头(假设该文件大于缓冲区)。
解决方案:
1.重新打开
2.使用 RandomAccessFile
在检查是否无法读取更多行之后,您可以通过递归调用 run() 函数来执行此操作 - 这是一个示例
// Reload the file when you reach the end (i.e. when you can't read anymore strings)
if ((sCurrentLine = br.readLine()) == null) {
run();
}
如果你想这样做,你可能需要考虑一个随机访问文件。有了它,您可以明确地将位置设置回开头并从那里重新开始阅读。
我建议使用公共图书馆
http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html
我认为有一个调用只是将文件读入 byteArray 这可能是另一种方法
不确定您是否考虑过BufferedReadermark()
上的和reset()
方法
如果您的文件只有几 MB 大小,并且您可以在文件开头设置标记并在到达文件末尾时保持 reset() ,这可能是一个选项。看来,对同一文件的后续读取将完全从缓冲区提供,而无需转到磁盘。
我面临同样的问题,并徘徊在这个问题上。
1.使用mark()和reset()方法:
可以使用 FileReader 和 FileInputStream 创建 BufferedReader。FileReader 不支持 Mark 和 Reset 方法。当我尝试这样做时,我遇到了一个例外。即使我尝试使用 FileInputStream 我也无法做到,因为我的文件很大(我猜你的文件也是如此)。如果文件长度大于缓冲区,则标记和重置方法既不适用于 FileReader,也不适用于 FileInputStream。在@jtahlborn的这个答案中了解更多信息。
2. 关闭和重新打开文件
当我关闭并重新打开文件并创建一个新的 BufferedReader 时,它运行良好。我猜理想的方法是再次重新打开文件并构造一个新的 BufferedReader 作为 FileReader 或 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());
}
}