【问题标题】:Need help understanding this code in Java需要帮助理解这段 Java 代码
【发布时间】:2015-01-13 17:40:12
【问题描述】:

首先,我不会问这是因为我对输入和输出一无所知。我看过很多关于 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;
  }

}

【问题讨论】:

  • 并回答您的问题。使用 f10 和 f11 单步执行代码,在您认为导致问题的点放置断点并观察变量。我的猜测是变量 c 的 readLine
  • 正如@WhyCry 提到的,只需添加断点并按照代码查看它在做什么。至于System.getProperty("line.separator"),这只是获取文件中用于换行的系统字符序列。您可以在System Properties 页面查看更多信息

标签: java ioexception fileinputstream printwriter inputstreamreader


【解决方案1】:

您可能知道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)。 p>

然后

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多