【问题标题】:Using a common buffer to read from inputstream and to write to outputstream使用公共缓冲区从输入流读取并写入输出流
【发布时间】:2015-01-09 10:27:21
【问题描述】:

我从网络套接字的输入流中读取到buffer

count = input.read(buffer)

然后在下一行,我正在使用

打印读取的内容
str = new String(buffer,0,count);
Log.e("str",str);

然后我尝试将其写入PipedOutputStreamPipedInputStream

pipedOutputStream .write(buffer);

在哪里,

pipedOutputStream = new PipedOutputStream(pipedInputStream)

问题是线程阻塞在pipedOutputStream .write(buffer);

以下是确认,取自DDMS的线程调试工具,

  at java.lang.Object.wait(Native Method)   
  at java.lang.Object.wait(Object.java:401) 
  at java.io.PipedInputStream.receive(PipedInputStream.java:394)    
  at java.io.PipedOutputStream.write(PipedOutputStream.java:176)    
  at java.io.OutputStream.write(OutputStream.java:106)  
  at java.io.PipedOutputStream.write(PipedOutputStream.java:147)    
  at java.io.OutputStream.write(OutputStream.java:82)   
  at com.example.Receiver.run(DRCReceiver.java:104)

谁能告诉我,为什么以下不起作用(阻塞线程)(对所有语句进行分组)

count = input.read(buffer)
str = new String(buffer,0,count);
Log.e("str",str);
pipedOutputStream .write(buffer);   

但以下工作正常(不阻塞线程)。

count = input.read(buffer)
str = new String(buffer,0,count);
Log.e("str",str);
pipedOutputStream .write(str.getBytes());   

提前致谢

【问题讨论】:

  • @anders_reimer,这不是堆栈跟踪

标签: java android multithreading concurrency inputstream


【解决方案1】:

看看JavaDoc。在这里您可以看到:“不建议尝试从单个线程使用两个对象”。通常你需要另一个线程来尝试读取一些数据。

【讨论】:

  • Acutally PipedStreams 就是为了这个目的。我按照它应该的方式使用它们。我在一个线程中创建了 pipedInputStream,并从另一个线程中读取了管道。
猜你喜欢
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多