Как установить выходной поток Java

Я имею в виду, если мне нужно создать какой-то метод: void setOutputStream(PrintStream stream). Таким образом, переменная stream — это выходной поток, в который я буду записывать свои данные (предпочтительно это будет переменная String). Вопрос в том, как он будет динамически определять выходной поток и корректно записывать туда мои данные, т.е. для System.out будет печатать данные на экране, для файлового потока будет записывать мои данные в файл.


person Helgus    schedule 27.02.2012    source источник


Ответы (4)


Я думаю, вы ищете java.lang.System#setOut(поток PrintStream). Что, по сути, позволяет программно переназначить поток стандартного вывода.

person anubhava    schedule 27.02.2012

То, что вам нужно сделать, называется шаблоном Decorator. Возможно, вы захотите просмотреть этот ответ (и ветку).

Посмотрите на следующую иерархию классов (java.io.*Stream)

java.lang.Object 
    java.io.Console (implements java.io.Flushable) 
    java.io.File (implements java.lang.Comparable<T>, java.io.Serializable) 
    java.io.FileDescriptor 
    java.io.InputStream (implements java.io.Closeable) 
            java.io.ByteArrayInputStream 
            java.io.FileInputStream 
            java.io.FilterInputStream 
                    java.io.BufferedInputStream 
                    java.io.DataInputStream (implements java.io.DataInput) 

Удачи!

person aviad    schedule 27.02.2012
comment
он описывает только File io, но мне нужен другой способ реализации - person Helgus; 27.02.2012
comment
Идея одинакова для всех потоков java.io.*, вся иерархия реализует шаблон Decorator, и это то, что вам нужно сделать. - person aviad; 27.02.2012

Вы можете создать базовый OutputStream, который записывает в файл, используя:

OutputStream out = new FileOutputStream(filename)

Затем вы можете создать PrintStream из этого, используя:

PrintStream stream = new PrintStream(out)
person Florent Guillaume    schedule 27.02.2012
comment
и если я хочу, чтобы моя функция печатала его на экране? как это сделать динамически? - person Helgus; 27.02.2012
comment
Я не понимаю динамическую часть. Если вы хотите печатать на экране, используйте System.out, это объект PrintStream. - person Florent Guillaume; 27.02.2012

Я думаю, что что-то не так в вашем вопросе, дело в том, что сам PrintStream использует OutputStream, который передается ему при его создании, как вы можете видеть здесь. Таким образом, вы должны передать правильный PrintStream в метод, который записывается в ваш OutputStream. Я думаю, что вам просто нужно сделать такой метод, как:

PrintStream createPrintStream (OutputStream out, тип String (или что вы хотите));

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

Возможно, вам поможет шаблон проектирования Factory Method.

person rascio    schedule 27.02.2012