Use java e xargs (?) para fornecer apenas argumentos para o programa java e não substituir stdin

0

Eu escrevi um pequeno programa em java que recebe argumentos da linha de comando e deve ser interativo.

Quando quero testar com uma entrada grande, quero enviar o conteúdo de um arquivo para a JVM para usar como argumentos de entrada para o programa, mas não quero substituir o stdin pelo conteúdo do arquivo.

Então eu tentei

menos arquivo | xargs -0 java -cp ... mypackage.ClassName

mas isso substitui stdin pelo conteúdo do arquivo. Eu acho que a parte interativa do programa que usa BufferedReader.readLine () pega seu conteúdo do arquivo.

Existe alguma maneira de canalizar o conteúdo do arquivo para a JVM e depois voltar para o StdIn?

Estou executando o Ubunthu

Exemplo de código:

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

Seria melhor para o programa java trabalhar com arquivos, mas eu quero saber se isso é possível Ds.

    
por user1443778 22.01.2013 / 19:51

1 resposta

0

Primeiro, a repreensão: Uma das regras menos conhecidas de programação de script shell (e até mesmo o uso interativo do shell) é não usar

cat some_file | some_command

a menos que você tenha um bom motivo para isso. Ah, claro, funciona, mas é um estilo ineficiente e ruim. E claro,

cat some_file

é a maneira mais simples de exibir um arquivo no terminal; isso é bom. E

cat options file | some_command

e

cat file1 file2 | some_command

estão bem. Mas

cat some_file | some_command

(com apenas um nome de arquivo na linha de comando cat ) quase sempre pode ser convertido para

some_command < some_file

E espero que seja desnecessário dizer que, se

cat some_file | some_command

é ruim,

less some_file | some_command

é provavelmente pior. Por que você não diz

xargs -0 java -cp ... mypackage.ClassName < file

Mas isso não resolveria seu problema.

Eu acredito que

a resposta que você procura é:

xargs –a file  -0 java -cp ... mypackage.ClassName

Este (ou, equivalentemente, - arg-file = arquivo ) diz ao xargs para abrir arquivo , < em> não como entrada padrão , e lê a partir dela e processa da maneira que normalmente trataria stdin, mas deixa a entrada padrão original sozinha, e a torna disponível para o programa exec. Aviso: nem todas as versões de xargs suportam isso.

A propósito, você está esperando que arquivo seja tão grande que seu conteúdo não cabe em uma linha de comando, então seu programa precisará ser executado várias vezes, com subconjuntos de > arquivo como argumentos?

    
por 25.01.2013 / 04:05

Tags