gpt4 book ai didi

java - java中线程安全的InputStream

转载 作者:搜寻专家 更新时间:2023-10-30 21:25:41 24 4
gpt4 key购买 nike

如何创建一个线程安全的 InputStream。在多线程操作期间,inputStream 数据被破坏,那么我怎样才能使我的 inputStream 线程安全。下面的代码可以工作吗

public class SynchronizedInputStream  extends InputStream{

private InputStream in;

private SynchronizedInputStream( InputStream in ) {
this.in = in;
}

/* ... method for every InputStream type to use */
public static InputStream createInputStream( InputStream in) {
return new SynchronizedInputStream( in);
}

public static InputStream createPushBackInputStream(InputStream in,int BUFSIZE){
return new SynchronizedInputStream(new PushbackInputStream(in,BUFSIZE));
}

/* Wrap all InputStream methods Used */

public int read(){
synchronized (this) {
try {
return in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
return 0;
}

@Override
public int available() {
synchronized( this ) {
try {
return in.available();
} catch (IOException e) {
e.printStackTrace();
}
}
return 0;
}


}

在 NANOHHTTPD 文件中

 public HTTPSession(TempFileManager tempFileManager, InputStream inputStream, OutputStream outputStream, InetAddress inetAddress) {
this.inputStream=(PushbackInputStream) SynchronizedInputStream.createPushBackInputStream(inputStream);
/*lines of code..........*/
}

然后我这样调用它

String Data = readStream(session.getInputStream());//session is HTTPSession
/*.....code....*/
private String readStream(InputStream in) {
synchronized (in) {
PushbackInputStream inputStream = (PushbackInputStream) in;
StringBuffer outputBuffer = null;
try {
//Reading the InputStream Here
}
} catch (IOException ioe) {
//error msg
}
return outputBuffer.toString();

}
}

最佳答案

您需要考虑它的意义。想象一下,不止一个人在读一本魔法书,这本书在任何人第一次看到它时都会抹掉它。所以只有一个人可以阅读任何给定的字符。流就是这样。

这使得以有用的方式阅读这本书真的很困难。当最天真地完成时,每个人只会得到一些随机的字符子集;不是很有用的信息。

一个直接的解决方案是让人们阅读它,然后将其复制到一本阅读时不会删除字符的书中。这样每个人都可以阅读这本书。有的时候不需要人人都看懂书,给人一句话就可以干活。在这种情况下,一个读者可以将每个句子发布到队列中,每个人一次从队列中取一个句子。

其他方法包括有一个缓冲区,每个线程都在其中存储它们读取的字符,然后每次检查它们是否可以形成一个单词,如果可以,则发出该单词以供下游处理。有关示例,请参阅 Netty 的编解码器包(例如 this )。

然而,这些方法通常是在流的顶部而非内部实现的。您很可能有一个在内部执行这些操作的流,但它可能会使人感到困惑。

关于java - java中线程安全的InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24359034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com