[英]How do I read a file again using buffered reader in Java?
我有一个Java代码,使用缓冲区读取器读取输入文件,直到readLine()
方法返回null
。 我需要无限次地再次使用该文件的内容。 如何从头开始阅读此文件?
您可以再次关闭并重新打开它。 另一种选择:如果它不是太大,请将其内容放入List中。
缓冲读取器仅支持reset()到缓冲数据的位置。 但这不能转到文件的开头(假设文件大于缓冲区)。
解决方案:
1.Reopen
2.使用RandomAccessFile
应该使用一个Reader
来读取文件。 如果要再次读取该文件,请根据它创建一个新的Reader
。
使用Guava的IO实用程序,您可以创建一个很好的抽象,让您可以使用Files.newReaderSupplier(File,Charset)多次读取文件。 这为您提供了一个InputSupplier <InputStreamReader> ,您可以随时通过调用getInput()
来检索新的Reader
。
更好的是,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
如果你想为每一行做一些处理而不先将每一行都读入内存,你可以选择使用带有LineProcessor的readLines
重载。
我遇到了同样的问题,并且徘徊在这个问题上。
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());
}
}
如果要执行此操作,您可能需要考虑随机访问文件 。 有了它,你可以明确地将位置设置回到开头并从那里再次开始阅读。
我建议使用公共图书馆
http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html
我认为有一个调用只是将文件读入byteArray可能是一种替代方法
不确定您是否考虑过BufferedReader上的mark()
和reset()
方法
如果您的文件大小只有几MB,则可以选择此选项,您可以在文件开头设置标记,并在文件结束时保持reset()。 同样看来,对同一文件的后续读取将完全从缓冲区提供,而不必转到磁盘。
你通过在检查是否可以读取更多行之后递归调用run()函数来执行此操作 - 这是一个示例
// Reload the file when you reach the end (i.e. when you can't read anymore strings)
if ((sCurrentLine = br.readLine()) == null) {
run();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.