需要帮助理解 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)。

然后

  1. 读了两行(来自in
  2. 打印这两行(加上额外的新行)(至 out
  3. 也将相同的两行打印成file.txt(至fout
  4. 相同文件中读取两行file.txt(来自fin
  5. 打印两行(至out

人们可能认为第 4 步会读取与第 3 步中相同的两行内容。

然而,fout.flush() 被注释掉了,所以第 3 步将 只保留缓冲区中的两行 (实际上并没有将它们写入(或刷新)到文件中!) 并导致第 4 步 挂起forever(如果 file.txt 为空,则 in.read() 将 return -1(文件结束, EOF) 由 (char) in.read() 转换为 U+FFFF,这不是 \n 所以再次读取并获得 -1,再次读取并再次获得 -1,依此类推。在我的 Linux机器)