我编写了一个小型 Java 程序,它从命令行获取参数,然后可以进行交互。
当我想用大量输入进行测试时,我想将文件的内容传输到 JVM 以用作程序的输入参数,但我不想用文件内容替换 stdin。
所以我尝试了
更少的文件|xargs -0 java -cp ... mypackage.ClassName
但是这会用文件内容替换 stdin,我认为使用 BufferedReader.readLine() 的程序的交互部分会从文件中获取其内容。
有什么方法可以让我先将文件内容传送到 JVM,然后再切换回 StdIn?
我正在运行 Ubuntu
代码示例:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String cmd;
while(true) {
try {
System.out.print(">");
cmd = br.readLine(); //becomes null if I start the program as above
附言:如果 Java 程序能够处理文件就更好了,但我想知道这是否可行。
答案1
首先,责骂:shell 脚本编程(甚至是交互式 shell 使用)中鲜为人知的规则之一是不使用
cat
某个文件|
一些命令
除非你有很好的理由。哦,当然,这有效,但效率低下,风格不好。当然,
cat
某个文件
是在终端上显示文件的最简单方法;没问题。并且
cat
选项 文件|
一些命令
和
cat
文件1 文件2|
一些命令
还可以。但是
cat
某个文件|
一些命令
(命令行上只有一个文件名cat
)几乎总是可以转换为
一些命令
<
某个文件
我希望不用多说,如果
cat
某个文件|
一些命令
不好,
less
某个文件|
一些命令
可能更糟。你为什么不说
xargs -0 java -cp ... mypackage.ClassName
<
文件
? 但这并不能解决你的问题。
我相信
你要找的答案是:
xargs
–a
文件-0 java -cp ... mypackage.ClassName
这(或者,等价地,--arg 文件=文件)告诉xargs
打开文件,不是标准输入,并从中读取并按照通常处理 stdin 的方式处理它,但保留原始标准输入,并将其提供给执行程序。警告:并非所有版本都支持xargs
此功能。
顺便问一下,你期待文件太大,其内容无法放在命令行中,因此您的程序需要多次执行,并使用子集文件作为参数?