gpt4 book ai didi

java servlet 通过 HTTP 连接提供文件服务

转载 作者:行者123 更新时间:2023-12-01 19:21:36 24 4
gpt4 key购买 nike

我有以下代码(服务器是Tomcat/Linux)。

//通过当前 HTTP 连接发送本地文件

  FileInputStream fin = new FileInputStream(sendFile);
int readBlockSize;
int totalBytes=0;
while ((readBlockSize=fin.available())>0) {
byte[] buffer = new byte[readBlockSize];
fin.read(buffer, 0, readBlockSize);
outStream.write(buffer, 0, readBlockSize);
totalBytes+=readBlockSize;
}

With some files of type 3gp When i attach the debugger, in line:

outStream.write(buffer, 0, readBlockSize);

它打破了 while 并出现以下错误;ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) 行:299并且该文件未送达。

有什么线索吗?谢谢A.K.

最佳答案

您不能保证 InputStream.read(byte[], int, int) 实际上会读取所需的字节数:它可能会读取更少的字节数。即使您对 available() 的调用也无法提供这种保证。您应该使用 fin.read 的返回值来找出实际读取了多少字节,并且只将这些字节写入输出。

我猜你看到的问题可能与此有关。如果读取的 block 小于可用大小,则缓冲区将被部分填充,当您向输出写入太多字节时,这将导致问题。

另外,不要每次循环都分配一个新数组!这将导致大量不必要的内存分配,从而降低代码速度,并且如果 available() 返回大量数字,则可能会导致 OutOfMemoryError。

试试这个:

int size;
int totalBytes = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while ((size = fin.read(buffer, 0, BUFFER_SIZE)) != -1) {
outStream.write(buffer, 0, size);
totalBytes += size;
}

关于java servlet 通过 HTTP 连接提供文件服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980086/

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