需要帮助在Java中理解这段代码

时间:2015-01-13 17:40:12

标签: java ioexception fileinputstream printwriter inputstreamreader

现在首先,我不会问这是我对输入和输出一无所知。我在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;
  }

}

1 个答案:

答案 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的)。

然后

  1. 一次(来自fout
  2. 读取两行
  3. 打印这两行(加上额外的新行)(到in
  4. 还将相同的两行打印到 file.txt (到out
  5. 相同的文件中读取两行 file.txt (来自fout
  6. 打印两行(至fin
  7. 有人可能会认为步骤4会读取在步骤3中写入的相同的两行。

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