2015-01-02 2 views
4

При написании кода c/c++ это очень удобно использовать freopen(). Пожалуйста, смотрите следующий фрагмент кода -Перенаправление stdout и stdin - Java

int main(){ 

int n1, n2, result; 

freopen("input.txt", "rb", stdin); 
freopen("output.txt", "wb", sdtout); 

while(scanf("%d %d", &n1, &n2)==2 && n1>0 &&n2>0){ 
    ... 
    ... 
    ... 
    printf("%d\n", result); 
} 

return 0; 
} 

Использование freopen() таким образом, очень полезно, когда мы пытаемся отладки/тестирования небольшое консольное приложение. Мы можем поместить образец ввода в 'input.txt' файл один раз и повторно использовать их каждый раз вместо ввода ввода вручную в терминале/консоли. И аналогичным образом мы можем напечатать вывод в файле 'output.txt'.

Теперь я ищу предисловие аналогичного типа решения в java, чтобы я мог перенаправить ввод и вывод в текстовый файл. Моя цель - упростить небольшую консольную/программную отладку, манипулируя некоторыми данными. Постоянное предоставление этих данных терминалу/консоли в качестве входных данных несколько громоздко. Может ли кто-нибудь предложить хорошие советы для этого?

+0

Чего не так с этим делать в командной строке с 'java -cp ... MyClass < input.txt > output.txt' –

ответ

3

Для System.out

System.setOut(new PrintStream(new File("output-file.txt"))); 

Для System.err

System.setErr(new PrintStream(new File("err_output-file.txt"))); 

Для System.in

System.setIn(new FileInputStream(new File("input-file.txt"))); 

* сбросить обратно в консоль

System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 
System.setErr(new PrintStream(new FileOutputStream(FileDescriptor.out))); 
System.setIn(new FileInputStream(FileDescriptor.in)); 
4

Вы можете переназначить потоки, используя System.setIn и System.setOut.

System.setIn(new FileInputStream(new File("input.txt"))); 
System.setOut(new PrintStream(new File("output.txt"))); 
1

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

импорт java.io. *; для некоторых классов, то сделайте следующее:

try{ 
    Scanner input = new Scanner(new File("input_file_name.in")); 
} 
catch(FileNotFoundException e){ 
    e.printStackTrace(); 
} 

Затем используйте сканер как обычно, и он будет считываться из файла.

Для записи в файл данных, а не стандартный, вы можете сделать это, чтобы изменить стандартный вывод в файл данных:

try{ 
FileOutputStream f = new FileOutputStream(new File("output_file_name.out")); 
    PrintStream p = new PrintStream(f); 
    System.setOut(p); 
} 
catch(Exception e){ 
    e.printStackTrace(); 
} 

Все операции с System.out.print() и System.out .println() будет записывать в файл.