在Java中复制数据的更快方法?

我被赋予了从服务器复制数据的任务。 我正在使用BufferedInputStream和输出流来复制数据,我正在逐字节地进行。 即使它正在运行但复制数据需要花费很长时间,因为其中一些数据是100的MB,所以肯定它不会起作用。 任何人都可以建议我Byte副本的Byte副本,以便我的代码可以复制几百MB的文件。 缓冲区是2048。

这是我的代码的样子:

 static void copyFiles(SmbFile[] files, String parent) throws IOException { SmbFileInputStream input = null; FileOutputStream output = null; BufferedInputStream buf_input = null; try { for (SmbFile f : files) { System.out.println("Working on files :" + f.getName()); if (f.isDirectory()) { File folderToBeCreated = new File(parent+f.getName()); if (!folderToBeCreated.exists()) { folderToBeCreated.mkdir(); System.out.println("Folder name " + parent + f.getName() + "has been created"); } else { System.out.println("exists"); } copyFiles(f.listFiles(), parent + f.getName()); } else { input = (SmbFileInputStream) f.getInputStream(); buf_input = new BufferedInputStream(input, BUFFER); File t = new File(parent + f.getName()); if (!t.exists()) { t.createNewFile(); } output = new FileOutputStream(t); int c; int count; byte data[] = new byte[BUFFER]; while ((count = buf_input.read(data, 0, BUFFER)) != -1) { output.write(data, 0, count); } } } } catch (IOException e) { e.printStackTrace(); } finally { if (input != null) { input.close(); } if (output != null) { output.close(); } } } 

这是一篇优秀post的链接,解释了如何使用nio通道制作流的副本。 它引入了一个帮助方法ChannelTools.fastChannelCopy ,它允许您像这样复制流:

 final InputStream input = new FileInputStream(inputFile); final OutputStream output = new FileOutputStream(outputFile); final ReadableByteChannel inputChannel = Channels.newChannel(input); final WriteableByteChannel outputChannel = Channels.newChannel(output); ChannelTools.fastChannelCopy(inputChannel, outputChannel); inputChannel.close(); outputChannel.close() 

好吧,因为你正在使用BufferedInputStream ,你不是逐字节读取,而是缓冲区的大小。 您可以尝试增加缓冲区大小。

即使实际的读/写是由缓冲区大小的块完成的,逐字节读/写肯定会很慢。 加快速度的一种方法是按块读/写。 看看BufferedInputStream read(byte[] b, int off, int len)方法。 但是它可能不会给你足够的改进。

更好的是使用nio包(新IO)使用nio通道复制数据。 有关更多信息,请查看nio文档 。

看一下这个链接 ,它描述了在使用SmbFileInputStream时可以尝试提高性能的一些方法。

我建议使用org.apache.commons.io 。 它有足够的实用方法来执行文件操作。

org.apache.commons.io.FileUtils API在这里