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

时间:2010-10-04 01:17:38

标签: java bufferedreader

我有一个Java代码,它使用缓冲区读取器读取输入文件,直到readLine()方法返回null。我需要无限次地再次使用该文件的内容。如何从头开始阅读此文件?

9 个答案:

答案 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 ...这样可以避免担心自己关闭提供的ReaderCharStreams类包含大多数与文本相关的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());

        }
}