2016-02-20 4 views
0

Мне нужно изменить поток потока через runtime. Во-первых, мне нужно использовать ObjectStreams:изменить поток на java-сокет

Socket socket = ... 
InputStream networkInput = socket.getInputStream(); 
OutputStream networkOutput = socket.getOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(networkOutput); 
oos.flush(); 
ObjectInputStream ois = new ObjectInputStream(networkInput); 
//use the object-streams 

Тогда мне нужно изменить в какой-то другой поток

oos.close(); 
ois.close(); 
XYOutputStream xyos = new XYOutputStream(networkOutput); 
xyos.flush(); 
XYInputStream xyis = new XYInputStream(networkInput); 

Но если я использую верхний код, сокет закрыт, и я получаю

java.net.SocketException: Socket closed 

Если я использую

socket.shutdownInput(); 
socket.shutdownOutput(); 

вместо того чтобы закрыть старые потоки я получаю

java.net.SocketException: interrupted data transfer (broken pipe) 

, когда я пытаюсь инициализировать мои XYStreams.

+0

Закрыть поток после выполнения всех операций. –

ответ

0

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

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.PrintStream; 

public class TestStream { 
    public static void main (String[] args) throws IOException { 
     FileOutputStream fos = new FileOutputStream("test.txt"); 
     PrintStream p1 = new PrintStream(fos, false); 
     PrintStream p2 = new PrintStream(fos, false); 
     p1.print("Test"); 
     p1.flush(); 
     p2.print(100); 
     p2.flush(); 
     fos.close(); 
    } 
} 
+0

Да, я пробовал это. Он работает для ObjectOutputStream, но если я попытаюсь инициализировать второй ObjectInputStream, программа замерзает. На строке new ObjectInputStream (networkInput) программа блокируется. –

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