- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 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/
目标:从一个源解密数据并将解密的数据写入文件。 try (FileInputStream fis = new FileInputStream(targetPath.toFile());
如果在读取操作期间或后续调用中达到 EOF,read() 是否返回 -1? Java 文档对此并不完全清楚,我正在阅读的书也没有完全清楚。 书中的以下代码正在读取一个文件,该文件包含三种不同类型的重复
ReadableByteChannel.read()的规范显示 -1作为流结束的结果值。此外,它还指定了 ClosedByInterruptException如果线程被中断,可能的结果。 现在我想这就
当我使用 Channels.newChannel(is) 从 InputStream 创建 channel 时,java 标准库返回一个 ReadableByteChannelImpl,即: p
我正在尝试运行一个带有超时的外部进程并读取它产生的所有输出。事实证明,这是一项令人惊讶的艰巨任务。我的基本策略是使用 ProcessBuilder 启动一个进程并在主线程中读取它的输出。另一个线程被关
我正在使用 ReadableByteChannel 来读取文件。 代码片段如下 InputStream in = new FileInputStream("Copy.tiff"); Fil
我正在使用 java 1.6 开发即时通讯工具。 IM 使用多线程 - 主线程、接收和 ping。对于 tcp/ip 通信,我使用了 SocketChannel。从服务器接收更大的包裹似乎存在问题。服
是否可以从 InputStream 对象创建非阻塞的 ReadableByteChannel? Channel.newChannel(inputStream) - 生成可以被阻塞的 InputStre
下面是我写的代码。我想做简单的事情,将二进制文件数据存储到 byteBuffer 中。 File file = new File(fileName); try { ReadableByteCh
我正在使用 Java 的 Channel 类将数据库中的 blob 转换为 PDF。当使用 channel 的transferFrom( )时方法中,您应该指定要传输的最大字节数。 当 Readabl
代码被分割成 Grails Web 应用程序的多个函数,但其想法是这样的 MultipartFile mf = request.getPart(); InputStream is = mf.
我在使用 InputStreams 时遇到一个问题,我想提高从该 channel 读取数据的性能。因此,我使用 ReadableByteChannel 进行阅读。 因此,这段代码的读取速度要快得多:
我们有一个 HTTP url 位置,其中包含一个 .txt 文件列表,我想获取并将它们保存为一个文件数组。 在 SO 中仔细研究之后,我设法建立了一个 channel ,指向托管这样的文件的 URL
我正在编写一个抓取工具,用于从某个站点下载 mp3 列表(1,700 多个 mp3,每个大约 15 MB)。我的方法给出了 URL 的 List 和目标文件夹。 我想围绕此编写一个 JProgress
我有一些代码: 从 ReadableByteChannel 读取到 ByteBuffer, 记录传输的字节, 暂停几十到几百毫秒, 将ByteBuffer传递到WritableByteChannel。
我正在使用 Java、ReadableByteChannel 和 FileOutputStream 尝试从 Soundcloud 中提取 wav 文件: public static void wavT
据我所知,nio 包中的ReadableByteChannel 和WritableByteChannel 可以被认为是InputStream 和来自遗留 io 包的 OutputStream。事实上,
我是一名优秀的程序员,十分优秀!