У меня есть небольшая Java-программа, которая принимает аргументы из командной строки и должна быть интерактивной.

Когда я хочу протестировать с большим вводом, я хочу передать содержимое файла в JVM для использования в качестве входных аргументов для программы, но я не хочу заменять stdin содержимым файла.

Так я попробовал

меньше файлов | xargs -0 java -cp ... mypackage.ИмяКласса

но это заменяет стандартный ввод содержимым файла, я думаю, поэтому интерактивная часть программы, которая использует BufferedReader.readLine(), берет свое содержимое из файла.

Есть ли способ, которым я могу сначала передать содержимое файла в JVM, а затем переключиться обратно на StdIn?

Я бегу Ubunthu

Пример кода:

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

Ps. Было бы лучше, если бы java-программа работала с файлами, но я хочу знать, возможно ли это, Ds.

1 ответ1

0

Во-первых, ругань: одно из менее известных правил программирования сценариев оболочки (и даже использования интерактивных оболочек) - не использовать

cat some_file | some_command

если у вас нет очень веской причины.  О, конечно, это работает, но это неэффективный и плохой стиль.  И, конечно же,

cat some_file

самый простой способ вывести файл на терминал; Все в порядке.  А также

файл опций cat | some_command

а также

cat файл 1 файл 2 | some_command

ОК.  Но

cat some_file | some_command

(только с одним именем файла в командной строке cat ) почти всегда можно преобразовать в

some_command <

И я надеюсь, что само собой разумеется, если

cat some_file | some_command

плохо,

less some_file | some_command

наверное хуже.  Почему ты не говоришь

xargs -0 java -cp ... mypackage.ClassName < файл

?  Но это не решит твою проблему.


я полагаю, что

ответ, который вы ищете:

xargs –a файл  -0 java -cp ... mypackage.ClassName

Это (или, что то же самое, --arg-file = file) указывает xargs открыть файл, а не как стандартный ввод, и прочитать его и обработать так, как он обычно обрабатывает stdin, но оставить исходный стандартный ввод в покое и сделать он доступен для исполняемой программы.  Предупреждение: не все версии xargs поддерживают это.

Кстати, вы ожидаете, что файл будет настолько большим, что его содержимое не помещается в командной строке, поэтому ваша программа должна будет выполняться несколько раз с подмножествами файлов в качестве аргументов?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .