【问题标题】:How does the BufferedReader know which file to read?BufferedReader 如何知道要读取哪个文件?
【发布时间】:2016-05-12 06:44:17
【问题描述】:

假设我有

try (FileWriter fw = new FileWriter("test.txt",false)) {
    BufferedReader bw=new BufferedReader(new InputStreamReader(System.in));
    do {
        str = bw.readLine();
        if (str.compareTo("stop") == 0) break;
        str = str + " ";
        fw.write(str);
    } while(str.compareTo("stop")!=0);
} catch(IOException e) {

}

我的 BufferedReader 如何知道要读取的输入流?在bw.readLine()的情况下? 在我的 FileReader 的情况下?那为什么我必须指定从哪个文件读取?还是这样

String s;
//create a BufferedReader that reads a stream of characters
//FileReader Writes character Values 
try (FileReader decodeFile = new FileReader("test.txt")) {
    BufferedReader readFile=new BufferedReader(decodeFile);

    //first check to see if br has a null value
    while ((s=readFile.readLine()) != null) {
        System.out.println(s);
    }
} catch (IOException e) {
    e.printStackTrace();
}

我对此感到非常困惑,有人可以对此有所了解吗?是的,我已经阅读了文档,所以我知道两者都做了什么

【问题讨论】:

    标签: java eclipse bufferedreader filereader writer


    【解决方案1】:

    流只是传入的连续数据流。Java 中的大多数 Reader 类子类在构造函数中声明流的来源。

    1. 对于第一种情况,InputStreamReaderSystem.in 获取输入。 System.in 是用户输入提供的数据流。尝试运行 java 文件并键入几个字符,然后在终端按 enter。

    2. BufferedReader 是专门高效阅读文本的阅读器。它从另一个流源获取数据的内容。在这种情况下,BufferedReader(decodeFile) 表示decodefileBufferedReader 从中读取流数据的位置。 decodefileFileReader 类型,FileReader("test.txt") 表示读取的文件来自名为 test.txt 的文件。因此,流程将是这样的:"test.txt" -> FileReader -> BufferedReader

    更新

    查看文档会有所帮助。 https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html

    PrintWriter 可帮助您以您喜欢的格式编写输出。 (格式,我的意思是附加一个字符,行刷新,一般格式化。)

    另一方面,FileWriter 将流内容写入文件。因此,在这种情况下,以下将是流程。

    String -> PrintWriter -> FileWriter -> "outputfile.txt"

    字符串内容可能会发生如下变化

    “文本”->“格式化文本”->“for”、“matted”、“text”->“格式化文本”

    使用流的全部意义在于对大量数据进行分块,以便进程不会占用太多 RAM(内存)。因此,分块可能(但不一定)如上所示发生。

    【讨论】:

    • 我明白了,很好的解释,但是如果我在 FileWriter 之前有一个 PrintWriter 会读取两个流吗?
    • 我已经编辑了我的帖子,虽然我不确定你所说的“两个流”是什么意思
    【解决方案2】:

    BufferedReader 并不真正关心它读取的内容,只要它是 Reader。它只是一个decorator 将功能添加到另一个Reader 实现。 Reader 所做的(通常从流中读取,但也可能从字符串中读取,甚至生成随机数据)与 BufferedReader 完全无关。

    所有BufferedReader 所做的只是从包装好的Reader 中读取并缓冲结果,以便可以实现某些事情,例如读取整行(这需要您阅读足够多的内容,直到找到流的结尾或下一个换行符)。

    【讨论】:

    • 好的,但是 FileWriter 不是 Writer 吗?
    • 对不起,我忘了我的 InputStreamReader
    【解决方案3】:

    BufferedReader 构造函数中,您指定精确的Reader 将实际从输入流中读取数据。正如@Joey 所说,它只是装饰器

    在您的示例中,您将从标准输入流中读取,在第二种情况下从确切文件中读取

    【讨论】:

    • 哦,BufferedReader 读取任何 InputStreamReader,所以在 FileWriter 的情况下,它会读取输入流,假设我创建了一个 PrintWriter,它也会读取输入流正确吗?
    • 你搞砸了 FileWriter。您正在阅读 new InputStreamReader(System.in) 并写入 test.txt 文件。您没有将 FileWriter 用于 BufferedReader
    • 那么它是如何写入我的文件的呢?如果我没有 fileWriter 它怎么知道要写入的位置?
    • 是的,在 fileWriter 中您应该指定输出位置,但从哪个位置获取数据并不重要。在 FileWriter 中,您编写一些从某处获得的字符串。这里来自new InputStreamReader(System.in),但实际上并不重要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2019-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多