gpt4 book ai didi

java - 通过 ReadableByteChannel 的 InputStream 没有读到结束

转载 作者:行者123 更新时间:2023-11-30 10:53:41 29 4
gpt4 key购买 nike

我在使用 InputStreams 时遇到一个问题,我想提高从该 channel 读取数据的性能。因此,我使用 ReadableByteChannel 进行阅读。

因此,这段代码的读取速度要快得多:

public static String readAll(InputStream is, String charset, int size) throws IOException{

try(ByteArrayOutputStream bos = new ByteArrayOutputStream()){
java.nio.ByteBuffer buffer = java.nio.ByteBuffer.allocate(size);

try(ReadableByteChannel channel = Channels.newChannel(is)){

int bytesRead = 0;

do{
bytesRead = channel.read(buffer);
bos.write(buffer.array(), 0, bytesRead);
buffer.clear();
}
while(bytesRead >= size);
}
catch(Exception ex){
ex.printStackTrace();
}
String ans = bos.toString(charset);
return ans;
}
}

问题是:它不会每次都读到最后!如果我尝试读取一个文件,它工作得很好。如果我从网络套接字读取(例如手动请求网页),它有时会在两者之间停止。

我该怎么做才能读到最后?

我不想使用这样的东西:

StringBuilder result = new StringBuilder();
while(true){
int ans = is.read();
if(ans == -1) break;
result.append((char)ans);
}
return result.toString();

因为这个实现很慢。

我希望你能帮我解决我的问题。也许我的代码有一些错误。

最佳答案

这会导致问题:

    ... } while (bytesRead >= size);

当至少读取一个字节时(或者即使在非阻塞的情况下没有字节),从套接字读取可能会返回。因此,如果 OS 套接字缓冲区中没有足够的字节,虽然显然没有读取完整内容,但该条件将中断循环。如果 size 标识要接收的预期长度,则执行 total += bytesRead 并在 total 达到 size 时中断循环>。或者,如果您当然到达文件末尾...

关于java - 通过 ReadableByteChannel 的 InputStream 没有读到结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33916681/

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