2015-08-17 2 views
0

Я хорошо знаю, что выходные потоки предназначены только для записи данных. Но я хочу получить свой собственный вывод, и я знаю, что имеет защищенный доступ в FilterOutputStream. Есть ли цикл или ярлык, который я могу сделать, чтобы получить поле .out выходного потока?Как получить вывод выходного потока

Socket socket = new Socket("localhost,4000); 
DataOutputStream Data = new DataOutputStream(socket.getOutputStream()); 
Data.writeUTF("Hi"); 
System.out.println(Data.out); // What I want to achieve. 
+2

У меня есть нехорошее подозрение, что есть очень сильная [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy -проблемы) здесь. Можете ли вы дать более подробную информацию о том, чего вы пытаетесь достичь, выполняя то, что вы пытаетесь достичь здесь? –

+0

Программа чата. Но я не хочу иметь дело с циклами прослушивания входного потока. –

+0

Есть ли ошибка с использованием метода, который у вас есть в вопросе? Возможно, дайте более подробную информацию. – Want2bExpert

ответ

1

Чтобы получить out поле, вы можете получить подкласс DataOutputStream и сделать выходной поток публично извлекаемый:

class YourDataOutputStream extends DataOutputStream { 
    public OutputStream getOut() { 
     return out; 
    } 
} 

Однако, если то, что вы действительно хотите сделать, это захватить данные, отправленный через сокет, это не будет делать то, что вы хотите, так как оно просто вернет объект выходного потока, возвращаемый сокетом. Однако вы могли бы написать подкласс FilterOutputStream, который переопределяет методы write(), чтобы распечатывать данные, проходящие через или хранить их в массиве или файле, прежде чем записывать данные в основной поток вывода. Методы переопределение будет выглядеть примерно так:

public void write(int dataByte) { 
    System.out.println(dataByte); 
    out.write(dataByte); 
} 

Вы бы затем построить экземпляр этого класса на выходной поток сокета и построить DataOutputStream на экземпляр этого класса.

+0

Спасибо, человек, ты лучший. –

0
Socket socket = new Socket("localhost,4000); 
DataOutputStream Data = new DataOutputStream(socket.getOutputStream()); 
Data.writeUTF("Hi"); 
System.out.println(Data.out); // What I want to achieve 

'Что [вы] хотите достичь' полностью эквивалентно

System.out.println(socket.getOutputStream()); 

Это также совершенно бессмысленно. Он будет печатать только что-то вроде [email protected]. Не «содержание», т. Е. То, что было написано.

1

Вы можете использовать org.apache.commons.io.output.TeeOutputStream:

OutputStream out1 = socket.getOutputStream(); 
ByteArrayOutputStream out2 = new ByteArrayOutputStream(); 
DataOutputStream out = new DataOutputStream(new TeeOutputStream (out1, out2)); 
out.writeUTF("Hi"); 
System.out.println(Arrays.toString(out2.toByteArray())); 
+0

Я думаю, что это именно то, что он действительно ищет, но он этого не знает. Я думаю, он действительно хочет распространять одну запись всем чат-клиентам. Набор вложенных TeeOutputStreams, подключенных ко всем выходным потокам сокета, сделает это, то есть «новый TeeOutputStream (новый TeeOutputStream (socket1.getOutputStream(), socket2.getOutputStream()), socket3.getOutputStream()) и т. Д. – EJP

+1

TeeInputStream - плохая идея для чата. Если одно клиентское соединение зависает, все чаты будут зависать. Для блокировки ввода-вывода необходимо использовать один поток для каждого клиента. – sibnick

+0

Кто-нибудь упоминал «TeeInputStream»? Все, что я вижу, это «TeeOutputStream». Проблема блокировки в этом заключается, по сути, от OP. – EJP

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