使用Java传输文件的最佳方式是什么?

9
我正在编写代码,将客户端的文件上传到我的服务器,但性能不如我预期的快。
这是当前进行文件传输的代码片段,我想知道如何加速传输。
对于所有的代码表示抱歉:
InputStream fileItemInputStream ;
OutputStream saveFileStream;
int[] buffer;
while (fileItemInputStream.available() > 0) {
    buffer = Util.getBytesFromStream(fileItemInputStream);
    Util.writeIntArrToStream(saveFileStream, buffer);
}
saveFileStream.close();
fileItemInputStream.close();

Util方法如下:
public static int[] getBytesFromStream(InputStream in, int size) throws IOException {
    int[] b = new int[size];
    int count = 0;
    while (count < size) {
        b[count++] = in.read();
    }
    return b;
}

并且:

public static void writeIntArrToStream(OutputStream out, int[] arrToWrite) throws IOException {
    for (int i = 0; i < arrToWrite.length; i++) {
        out.write(arrToWrite[i]);
    }
}
1个回答

16

每次读取单个字节将极其低效。你还依赖于available,这很少是一个好主意。(如果当前没有字节可用,它将返回0,但可能会有更多的字节到来。)

以下是复制流的正确代码:

public void copyStream(InputStream input, OutputStream output) throws IOException
{
    byte[] buffer = new byte[32*1024];
    int bytesRead;
    while ((bytesRead = input.read(buffer, 0, buffer.length)) > 0)
    {
        output.write(buffer, 0, bytesRead);
    }
}

(调用方应关闭两个流。)


在Java的有符号字节中,我不必担心文件中的无符号字节溢出吗? - jjnguy
它们是mp3文件,如果有关系的话。 - jjnguy
1
不需要,这只是读写操作,不涉及任何算术或转换。 - Jon Skeet
并且/或者可以考虑使用BufferedInput/OutputStream类。 - John Gardner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接