繁体   English   中英

如何使用Java中的缓冲读取器再次读取文件?

[英]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

如果你想为每一行做一些处理而不先将每一行都读入内存,你可以选择使用带有LineProcessorreadLines重载。

我遇到了同样的问题,并且徘徊在这个问题上。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM