现在首先,我不会问这是我对输入和输出一无所知。我在PrintWriter,FileInputStream,InputStreamReader和IOException上观看了大量的教程。我理解这些类的概念。但我只是不理解这段代码。我试过运行它。首先,有一个输出说"两行:"。我输了"你好"在第一行和#34;我是Bob"在第二行。当我按下回车键时,程序只输出我写的内容。以下是控制台上的内容示例:
two lines:
hello
I am Bob
hello
I am Bob
此后程序继续运行。有人可以向我解释一下代码吗?我在这段代码中看到了一些新内容,例如 System.getProperty(" line.separator")。这种方法的目的是什么? while循环和for循环有什么作用?为什么 fout.flush()被注释掉了?如果我将其包含在代码中会发生什么?我感到很困惑。这是代码:
import java.io.*;
// File, PrintWriter, FileInputStream, InputStreamReader, IOException
class Demo
{
public static void main (String[] args)
{
PrintWriter out = new PrintWriter (System.out, true);
InputStreamReader in = new InputStreamReader (System.in);
File file = new File ("file.txt");
try (
PrintWriter fout = new PrintWriter (file);
InputStreamReader fin = new InputStreamReader (new FileInputStream (file)))
{
out.println ("two lines:");
String line1 = readLine (in);
String line2 = readLine (in);
out.println (line1);
out.println (line2);
out.println ();
fout.println (line1);
fout.println (line2);
//fout.flush ();
line1 = readLine (fin);
line2 = readLine (fin);
out.println (line1);
out.println (line2);
}
catch (IOException e)
{
e.printStackTrace ();
}
}
public static String readLine (InputStreamReader in) throws IOException
{
String sepChars = System.getProperty ("line.separator");
int countChars = sepChars.length ();
StringBuilder sb = new StringBuilder ();
char c = (char) in.read ();
while (!sepChars.contains ("" + c))
{
sb.append (c);
c = (char) in.read ();
}
for (int i = 0; i < countChars - 1; i++)
c = (char) in.read ();
String rad = sb.toString ();
return rad;
}
}
答案 0 :(得分:2)
您可能知道System.getProperty ("line.separator")
返回表示本机换行符序列的字符串(例如,对于Linux为\ n,对于Windows为\ r \ n等)。 readLine
方法,顾名思义, 从给定的InputStreamReader
读取整行 ,直到读取了换行符,并丢弃任何额外的换行符行后面的字符没有验证它是否是正确的新行(如果有的话;我的意思是如果行分隔符长于一个字节)。例如,如果换行符串为\r\n
,则最终会遇到\r
并停止第一个循环,并再读取另一个假设的字符为{{1} }。
在\n
方法中,它会创建两个main
,分别称为InputStreamReader
(从 stdin 读取)和in
(其读取)来自 file.txt ),两个fin
分别称为PrintWriter
(打印到 stdout )和out
(写入 file.txt的)。
然后
fout
)in
)out
)fout
)fin
)有人可能会认为步骤4会读取在步骤3中写入的相同的两行。
但是,out
已被注释掉,因此第3步 只需将两行 保留在缓冲区 中(实际上并没有将它们写入(或刷新)到文件!) 并导致步骤4 永久挂起 (如果 file.txt 为空,fout.flush()
将返回-1(文件结束,EOF),由in.read()
转换为U + FFFF,这不是(char) in.read()
所以再次读取并获取-1,再次读取并再次获得-1,依此类推。在我的Linux机器上测试)