硬编码文件路径与作为命令行参数传递之间的文件输出差异

Difference in File Output Between Hard Coded Filepath and Passing as Command Line Argument

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

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

当我从命令行传递文件时,它有时会跳过输入行,所以如果我有一个包含 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();        

我想我明白问题所在了。

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

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

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

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

解决方法...我会留给你。

When I pass the file from the command line it will skip input lines sometimes ...

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

很遗憾,您提供的代码似乎与问题无关!
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();
}

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