Java 文件复制(更改缓冲区大小)
Java. java.io.InputStream.,,java.io.OutputStream. 在
介绍使用输入/输出流执行复制处理的示例程序。
通过增加读取缓冲区的大小,使用流的复制过程甚至可以相对快速地复制大文件。
在示例程序中,读取数据的缓冲区大小可以作为参数指定。
指定的读取缓冲区是在 JavaVM 堆中分配的,因此过大的缓冲区效率会很低。因此,在复制文件时,也会同时检查高效数据读取缓冲区的大小。
示例程序
/**
* 将数据从输入流写入输出流。
*复制过程完成后,输入/输出流将关闭。
* 输入流中的@param
* @param os 输出流
* @param bufferSize 数据读取缓冲区大小 (KB)。
* @throws IOException 如果发生某些输入/输出处理异常
*/
公共静态无效copyStream(输入流,输出流操作系统,
int bufferSize) 抛出 IOException {
int len = -1;
byte[] b = 新字节[bufferSize * 1024];
尝试 {
while ((len = in.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
os.flush();
} 最后 {
如果(在!=空){
尝试 {
附寄();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
尝试 {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
执行
直接在 C 盘下准备了一个 100MB 的文件 "100M.txt",用于复制示例程序的文件。在示例程序中 C:\100M.txt 以 1000 KB 缓冲区大小为单位读取数据。 C:\a.txt 复制到
样品在以下环境中运行。
操作系统:WindowsXP
中央处理器:Athlon 1.46GHz
内存:1GB
JRE : 1.6.4
执行示例
/** * 执行示例。 * @param args. */ public static void main(String[] args) { try { copyStream("C:\\100M.txt", "C:\\a.txt",1000); } catch (IOException e) { e.printStackTrace(); } } }
更改缓冲区大小
要在复制文件时检查有效的数据读取缓冲区大小,请使用 copyStream 的第三个参数作为
下面总结了以 1KB、100KB、1000KB 和 10000KB 为单位的类似复制处理的结果。
虽然仅从上面的结果不能得出结论,但如果以1000KB为单位指定数据读取缓冲区大小,
结果表明,在复制处理期间,它在堆使用和处理时间方面是高效的。
当文件大小增加时(约 1 GB),也得到了类似的结果。
相反,在复制小文件(约 1MB 或更小)时,最好指定 100KB 左右的缓冲区大小,因为缓冲区过大将毫无用处。
使用 FileChannel 更快
java.io.InputStream.,,java.io.OutputStream.
复制处理对于理解输入/输出流很重要,但是
J2SE1.4 中引入的新 I/O java.nio.channels.FileChannel#ransferTo
这种方法可以更高效地复制文件。
下一节将介绍如何使用 FileChannel 方便快捷地复制文件。
⇒ Java 文件复制(简单快捷)