硬编码文件路径与作为命令行参数传递之间的文件输出差异
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();
}
...它将确保所有文件都已关闭。
所以,我正在编写一个程序,我一次从文件中读取一个字符,对该字符进行操作,然后将输出写入另一个文件。
出于某种原因,当我对文件路径进行硬编码时(我这样做只是为了在调试时不必继续键入文件)以及当我从命令行传递文件时,我得到了不同的结果。
当我从命令行传递文件时,它有时会跳过输入行,所以如果我有一个包含 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();
}
...它将确保所有文件都已关闭。