需要帮助理解 Java 中的这段代码
Need help understanding this code in Java
首先,我不会问这个,因为我对输入和输出一无所知。我看了很多关于 PrintWriter、FileInputStream、InputStreamReader 和 IOException 的教程。我理解这些类的概念。但我只是不明白这段代码。我试过了运行。首先,有一个输出说 "two lines: "。我在第一行输入 "hello",在第二行输入 "I am Bob"。当我按下 enter 键时,程序会准确输出我所写的内容。这是控制台上出现的示例:
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;
}
}
您可能知道 System.getProperty ("line.separator")
returns 字符串表示本机换行符序列(例如 \n 代表 Linux,\r\n 代表 Windows, ETC)。 readLine
方法,顾名思义, 从给定的 InputStreamReader
读取整行 直到读取换行符, 并丢弃 行之后的任何额外换行符,而不验证它是否是一个正确的换行符 (如果有的话;我的意思是如果行分隔符长于一个字节)。例如,如果换行字符串是 \r\n
,它最终会遇到 \r
并停止第一个循环,并再读取一个 假设 的字符 =15=].
在main
方法中,它会创建两个InputStreamReader
,分别称为in
(从stdin读取)和fin
(从 file.txt 读取),两个 PrintWriter
分别称为 out
(打印到 stdout) 和 fout
(写入 file.txt)。
然后
- 在读了两行(来自
in
)
- 打印这两行(加上额外的新行)(至
out
)
- 也将相同的两行打印成file.txt(至
fout
)
- 从相同文件中读取两行file.txt(来自
fin
)
- 打印两行(至
out
)
人们可能认为第 4 步会读取与第 3 步中相同的两行内容。
然而,fout.flush()
被注释掉了,所以第 3 步将 只保留缓冲区中的两行 (实际上并没有将它们写入(或刷新)到文件中!) 并导致第 4 步 挂起forever(如果 file.txt 为空,则 in.read()
将 return -1(文件结束, EOF) 由 (char) in.read()
转换为 U+FFFF,这不是 \n
所以再次读取并获得 -1,再次读取并再次获得 -1,依此类推。在我的 Linux机器)
首先,我不会问这个,因为我对输入和输出一无所知。我看了很多关于 PrintWriter、FileInputStream、InputStreamReader 和 IOException 的教程。我理解这些类的概念。但我只是不明白这段代码。我试过了运行。首先,有一个输出说 "two lines: "。我在第一行输入 "hello",在第二行输入 "I am Bob"。当我按下 enter 键时,程序会准确输出我所写的内容。这是控制台上出现的示例:
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;
}
}
您可能知道 System.getProperty ("line.separator")
returns 字符串表示本机换行符序列(例如 \n 代表 Linux,\r\n 代表 Windows, ETC)。 readLine
方法,顾名思义, 从给定的 InputStreamReader
读取整行 直到读取换行符, 并丢弃 行之后的任何额外换行符,而不验证它是否是一个正确的换行符 (如果有的话;我的意思是如果行分隔符长于一个字节)。例如,如果换行字符串是 \r\n
,它最终会遇到 \r
并停止第一个循环,并再读取一个 假设 的字符 =15=].
在main
方法中,它会创建两个InputStreamReader
,分别称为in
(从stdin读取)和fin
(从 file.txt 读取),两个 PrintWriter
分别称为 out
(打印到 stdout) 和 fout
(写入 file.txt)。
然后
- 在读了两行(来自
in
) - 打印这两行(加上额外的新行)(至
out
) - 也将相同的两行打印成file.txt(至
fout
) - 从相同文件中读取两行file.txt(来自
fin
) - 打印两行(至
out
)
人们可能认为第 4 步会读取与第 3 步中相同的两行内容。
然而,fout.flush()
被注释掉了,所以第 3 步将 只保留缓冲区中的两行 (实际上并没有将它们写入(或刷新)到文件中!) 并导致第 4 步 挂起forever(如果 file.txt 为空,则 in.read()
将 return -1(文件结束, EOF) 由 (char) in.read()
转换为 U+FFFF,这不是 \n
所以再次读取并获得 -1,再次读取并再次获得 -1,依此类推。在我的 Linux机器)