-1

现在首先,我不会问这是我对输入和输出一无所知。我看过很多关于 PrintWriter、FileInputStream、InputStreamReader 和 IOException 的教程。我理解这些类的概念。但我就是不明白这段代码。我试着运行它。首先,有一个输出说“两行:”。我在第一行输入“hello”,在第二行输入“I am 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;
  }

}
4

1 回答 1

2

您可能知道System.getProperty ("line.separator")返回表示本机换行符序列的字符串(例如,Linux 的 \n,Windows 的 \r\n 等)。readLine顾名思义,该方法从给定的行读取整行InputStreamReader,直到读取该换行符,并丢弃该行后面的任何额外换行符,而不验证它是否是正确的换行符(如果有的话;我的意思是如果行分隔符长于一个字节)。例如,如果换行字符串是\r\n,它最终会遇到\r并停止第一个循环,并再读取一个假定为 的字符\n

在该main方法中,它将创建两个InputStreamReader分别称为in(从stdin读取)和fin(从file.txt读取),以及两个PrintWriter分别称为out(打印到stdout)和fout(写入到file.txt)。

那时会

  1. 一次读取两行(来自in
  2. 打印这两行(加上额外的新行)(到out
  3. 还将相同的两行打印到file.txt (to fout)
  4. 从同一个文件file.txt中读取两行(来自fin
  5. 打印两行(到out

人们可能期望第 4 步将读取与第 3 步相同的两行代码。

但是,fout.flush()被注释掉了,所以第 3 步只会将这两行保留在缓冲区中(而不是实际将它们写入(或刷新)到文件中!)并导致第 4 步永远挂起(如果file.txt为空,将in.read()返回 -1 (End Of File, EOF) 转换为 U+FFFF by (char) in.read(),而不是\n这样,再次读取并获得 -1,再次读取并再次获得 -1,依此类推。在我的 Linux 机器上测试)

于 2015-01-13T18:35:19.473 回答