你要找的答案是:

你要找的答案是:

我编写了一个小型 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此功能。

顺便问一下,你期待文件太大,其内容无法放在命令行中,因此您的程序需要多次执行,并使用子集文件作为参数?

相关内容