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