让我说我有
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();
}
我对此非常困惑,有人可以对此有所了解吗?是的,我已经阅读了文档,所以我知道两者都做了什么
答案 0 :(得分:1)
Streams只是一个连续的数据流。Java中的大多数Reader
类子类声明了流在构造函数中的来源。
对于第一种情况,InputStreamReader
从System.in
获取其输入。 System.in
是由用户输入提供的数据流。尝试运行java文件并输入几个字符,然后在终端输入。
BufferedReader
是专门有效阅读文字的读者。它从另一个流源获取数据的内容。在这种情况下,BufferedReader(decodeFile)
表示decodefile
是BufferedReader
从中读取流数据的位置。 decodefile
是FileReader
类型,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"
字符串内容可能会改变如下
“text” - > “格式化文字” - > “for”,“matted”,“text” - > “格式化文字”
使用流的重点是分块大量数据,这样进程就不会占用太多的RAM(内存)。因此,如上所示,分块可能(但不一定)发生。
答案 1 :(得分:0)
BufferedReader
并非真正关心它读取的内容,只要它是Reader
即可。它只是一个decorator,可以为另一个Reader
实现添加功能。 Reader
所做的(通常从流中读取,但可能来自字符串,甚至生成随机数据)与BufferedReader
无关。
所有BufferedReader
所做的就是从包装的Reader
中读取并缓冲结果,以便有些事情可以实现,例如读取整行(这需要您阅读足够的内容,直到找到流的结尾或下一个换行符。)
答案 2 :(得分:0)
在BufferedReader
构造函数中,您指定精确Reader
,实际上将从输入流中读取数据。就像@Joey说的那样,它只是装饰者
在您的示例中,您将从标准输入流中读取,在第二种情况下,将从精确文件中读取