BufferedReader 如何知道要读取哪个文件?

How does the BufferedReader know which file to read?

假设我有

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();
}

我对此很困惑,有人可以解释一下吗?是的,我已经阅读了文档,所以我知道两者的作用

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

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

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

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

流只是一个连续的数据流。Reader class Java 中的大多数子class 都在构造函数中声明了流的来源。

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

  2. BufferedReader 是专门用于高效阅读文本的 reader。它从另一个流源获取数据的内容。在这种情况下,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”、“文本”->“格式化文本”

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