Java 带换行符的Bash输入重定向

Java 带换行符的Bash输入重定向,java,bash,unit-testing,input,io-redirection,Java,Bash,Unit Testing,Input,Io Redirection,因此,对于学校的作业,我需要用java编写一个程序来管理大学的一些学生,用户可以调用许多函数,但我从测试“add”开始 我的教授建议我使用输入重定向,因为我可以轻松地反复测试程序,而无需大量键入。现在问题来了 echo `< input.txt` add Student Name 123 Street,City,Province,Postal Code q #Input rediraction ate my newlines cat input.txt add Student Name S

因此,对于学校的作业,我需要用java编写一个程序来管理大学的一些学生,用户可以调用许多函数,但我从测试“add”开始

我的教授建议我使用输入重定向,因为我可以轻松地反复测试程序,而无需大量键入。现在问题来了

echo `< input.txt`
add Student Name 123 Street,City,Province,Postal Code q
#Input rediraction ate my newlines
cat input.txt
add
Student Name
Street,City,Province,Postal Code
q
#What I actually want to run
java -cp . TestCollege < input.txt #fail horribly
echo`
正如您所看到的,bash删除了我用来分隔输入的换行符,因此我的程序崩溃,因为当您在交互模式下运行它时,Scanner.getLine()只会阻塞,直到输入发生


你知道我如何用换行符给我的程序输入吗?它在windows“cmd”中似乎工作得很好,但在“bash”中却不行。

你能试着在
系统中包装
BufferedInputStream
,因为它可以处理两种情况:
\r\n
\n
;我想这就是你的问题所在


或者更确切地说,在
Scanner
上调用
usedimiter(System.getProperty(“line.separator”)

那么,您可以看到bash是如何不吃掉正在运行的新行的

$ wc -l < input.txt
$wc-l

我想这会给你你期望的值。

你想要(1)保留换行的单个命令行参数中的输入,还是(2)每行输入一个命令行参数,或者(3)作为标准输入?我假设不是(3),也许你确实想要(2)——尽管这是最难编码的。(1) 由“$(
处理,它在“back quoted”命令周围添加双引号。(3) 是微不足道的,但你说它失败得可怕。您的代码中有GUI或简单的I/O操作吗?程序不带参数,它从std in读取,我想将一个文件重定向到std_in w/newlines preserved。好的,这是我的(3)和您在脚本的最后一行中使用的内容。输入确实会保留换行符。读取此信息的代码是什么样子的?是时候解释一下“可怕的失败”的真正含义了。扫描器是否有可能寻找CRLF行结尾而不是像Unix一样的NL(LF)行结尾?这是真的代码吗?反勾号会删除额外的空白(包括换行符),重定向则不会。您对实际程序的调用不使用反勾号,因此应保留换行符。有点不对劲。Scanner.nextLine()会根据执行它的环境查找行尾。从上面可以看出,bash是个问题,因为输入重读正在消耗换行符,wheras cat按原样显示文件,最后一节是我要做的。它读取STD_IN中的所有数据,所以我想我可以通过编程打开一个文件,并使该STD_IN。虽然这不在规范中,但如果有人能弄清楚bash删除换行符的原因,那就更好了。您应该能够以普通的方式读取标准输入。您是否在Windows上运行
bash
?问题是,
bash
只在每行末尾发送NL(换行符),但是读取代码知道它在Windows上,所以它希望行结束CRLF(回车,换行符-其中LF=NL作为字符代码)?不,我在macintosh上,否则我会使用cmd,因为我知道它是有效的,我想如果我玩弄终端设置和行尾,最终我会找到一个有效的组合,尽管这可能是问题所在。@awiebe:Mac OS X是一台常规Unix机器,预期行尾为NL。(Mac OS 9或更早版本仅将CR用作行尾,以避免不同机器上的所有和杂项混淆。)因此,要解决此问题,您需要创建一个SSCCE(你的代码。我想应该是十几行左右的Java。这是真的,我想echo会吃newlinesOk,我会继续修补它,解决问题后在这里发布。谢谢大家的帮助。