2013-12-20 3 views
0

Мне нужно писать символы в файл или на стандартный вывод. И мне любопытно, можно ли это сделать одним способом.Запись на Java в файл или System.out

Теперь у меня есть что-то вроде этого:

OutputStream out;  
if(toConsole) 
    out = System.out; 
else 
    out = new FileOutputStream(file); 

write(out); 
} 
void write (OutputStream str){ 
.... 
str.write(string); 

Но это проблема, которую я использую (в случае, когда «ул» является System.out) написать вместо печати? (print java doc: «символы строки преобразуются в байты в соответствии с кодировкой символов по умолчанию платформы») В случае, если я буду использовать PrintWriter (или PrintStream) в качестве параметра, то я не могу использовать BufferedWriter, и запись в файл будет медленнее ,

Можно использовать один и тот же код (и те же методы) для записи в файл и в System.out? (Это для моего школьного проекта, поэтому я хочу, чтобы он был «чистым» и полностью правильным)

+0

Что вы можете сделать, это перенаправить stdout на собственный Printsteeam, как показано [здесь] (http://stackoverflow.com/questions/12945537/how-to-set-output-stream-to-textarea/12945678# 12945678), который на самом деле демонстрирует прокси-подход, который позволяет перенаправить вывод в другое место, но также он появляется на консоли. Я использовал этот подход для вывода на печать программ, которые не включали протоколирование. – MadProgrammer

+0

. Вы можете легко обернуть PrintWriter/PrintStream/etc вокруг BufferedWriter, как показано в [doc] (http://docs.oracle.com/ javase/7/docs/api/java/io/BufferedWriter.html), но лично я бы не стал беспокоиться об этом в любом случае. – Radiodef

ответ

1

То, что вы пытаетесь сделать, это относиться к fileoutput и consoleoutput то же самое. Это возможно, потому что System.out является PrintStream, и вы можете создать PrintStream для файла, как этот

new PrintStream(yourFile) 

или вставить BufferedOutputStream в между

new PrintStream(new BufferedOutputStream(new FileOutputStream(yourFile))). 

Обратите внимание, что это не требуется, потому что PrintStream делает buffer its output itself.

Я бы создал переменную (глобальную или нет), представляющую текущий вывод. Это может быть PrintStream, либо System.out, либо PrintStream вокруг FileOutputStream, что бы вы ни пожелали. Затем вы передадите этот поток методу записи или сразу вызовите методы печати.

Преимущество состоит в том, что вы можете легко переключать это без значительной модификации кода, вы можете перенаправить его туда, где вы не хотите. Нет проблем перенаправить его в файл иSystem.out! Вы не получили бы чистую гибкость с тем, как вы сейчас пишете метод.

Вы могли (не говорю, что вы должны), а также перенаправлять System.out непосредственно, используя System.setOut. Это, однако, плохой стиль, потому что он довольно необычен и может смутить всех остальных, если они не видели звонок до System.setOut.

0

System.out является объектом типа PrintStream. Так что да, вы можете написать
System.out и/или в другой файл, используя точно такие же методы. Только
создайте объект PrintStream и направьте его в файл. Итак, объявите
вашей переменной, используемой в качестве PrintStream.

Смотрите также:

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html

Смежные вопросы