【问题标题】:Difference in File Output Between Hard Coded Filepath and Passing as Command Line Argument硬编码文件路径和作为命令行参数传递之间的文件输出差异
【发布时间】:2020-03-01 14:26:48
【问题描述】:

所以,我正在编写一个程序,每次从文件中读取一个字符,对字符进行操作,然后将输出写入另一个文件。

由于某种原因,当我对文件路径进行硬编码(我这样做只是为了在调试时不必继续输入文件)以及从命令行传递文件时,我得到了不同的结果。

当我从命令行传递文件时,它有时会跳过输入行,所以如果我有一个包含 10 行的文件,我可能只会处理 8 行。

我感觉这与输入行末尾是否有空格有关,但我似乎无法弄清楚。任何帮助将非常感激。

另外,当我硬编码文件路径时,我使用的是 NetBeans,当我使用命令行参数时,我从终端运行程序。我在下面粘贴了 I/O 代码。

while( ( i = buffRead.read() ) != -1 )
{
    try
    {

        char c = (char) i;

        if ( Character.isWhitespace(c) )
        {
            if(converter.getStackSize() > 1)
            {
                converter.resetConverter();
                throw new IncorrectNumOfOperandsException();
            }

            buffRead.readLine();
            converter.resetConverter();
            writeOut.println();

        }
        else
        {
            converter.register( c );
        }
    }
    catch (InvalidCharException j)
    {
        writeOut.println("Invalid Character Entered\n");
        buffRead.readLine();
    }
    catch (IncorrectNumOfOperatorsException k)
    {
        writeOut.println("Too Many Operators for Number of Operands\n");
        buffRead.readLine();
    }
    catch ( IncorrectNumOfOperandsException m)
    {
        writeOut.println("Too Many Operands for Number of Operators\n");
        buffRead.readLine();
    }

}


buffRead.close();
writeOut.close();        

【问题讨论】:

    标签: java io bufferedreader


    【解决方案1】:

    我想我看到了问题所在。

    您测试c 以查看它是否是空白字符,如果是,则调用readLine()readLine() 所做的是读取一个或多个字符,直到它到达下一个行尾序列。

    那么当c 包含换行符时会发生什么?

    • 换行符是空白字符(查找)
    • 所以你读了一行,从你刚刚读到的换行符后面的第一个字符开始
    • 并丢弃该行。

    所以你(不小心)丢掉了一整行输入。

    解决方案......我将留给你。

    当我从命令行传递文件时,它有时会跳过输入行...

    我怀疑在您输入输入时发生了相同的行为......但您没有注意到它。但是平台特定的行终止序列可能会发生一些事情。

    【讨论】:

      【解决方案2】:

      很遗憾,您提供的代码似乎与问题无关!
      两种获取文件的方式在哪里?

      另外,请尝试使用 try-with-resources 语句。像这样的:

      try(final Reader         rdr = new InputStreamReader(System.in);
          final BufferedReader brd = new BufferedReader   (rdr))
      {
          /*
           * Resources declared above will be automatically closed.
           */
          brd.readLine();
      }
      

      ...它将确保所有文件都已关闭。

      【讨论】:

      • 实际上,真正的问题是所提出的问题与 OP 代码的实际问题几乎没有关系。它发生了......
      猜你喜欢
      • 2012-09-24
      • 2016-08-11
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多