Java 复制文件的本机JDK代码
是否有本地JDK代码来复制文件(缓冲区、流或其他内容)?您最好的选择是使用Java NIO: 有关缓冲区,请参阅: 但是,有关流,请参见以下文章: 在此基础上构建了一些框架,即Mina和Netty:Java 复制文件的本机JDK代码,java,file,streaming,copy,buffer,Java,File,Streaming,Copy,Buffer,是否有本地JDK代码来复制文件(缓冲区、流或其他内容)?您最好的选择是使用Java NIO: 有关缓冲区,请参阅: 但是,有关流,请参见以下文章: 在此基础上构建了一些框架,即Mina和Netty: 米纳- 内蒂- 如果“本机”指的是“Java标准API的一部分”(而不是依赖于平台的代码,在Java世界中通常称为“本机”)和“复制文件”指的是“采用文件和目标路径并生成文件内容副本的单一方法”,那么不,标准API中没有此类方法。您必须打开一个InputStream和一个OutputStre
- 米纳-
- 内蒂-
InputStream
和一个OutputStream
(可以选择获得更高效的FileChannel
s)并使用缓冲区传输字节。可以在中找到方便的单个调用方法
更新:自Java 7以来,文件复制功能已成为
Java.nio.file.Files
中标准API的一部分。这是自JDK 1.4及更高版本以来复制文件的首选方法
public static void copyFile(final File sourceFile, final File destFile) throws IOException
{
if (!destFile.exists())
{
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try
{
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
}
finally
{
source.close();
destination.close();
}
}
。。。这种方法可能有很多优点
比简单的循环更有效
从该通道读取并写入
目标频道。许多操作
系统可以直接传输字节
从文件系统缓存到
目标通道没有实际
复制它们
只需补充一点,JDK7在java.nio.file.Files中定义了几种复制方法,包括复制文件和将文件复制到流中/从流中复制文件。如果我错了,请纠正我,但java世界中的native通常指平台相关的代码……不,java世界中的“native”指的是其平台相关的代码,aka代码在平台上编译并运行。虽然标准API与平台无关,通常是用Java编写的,但这些代码在JVM中会以字节码的形式运行——理论上,至少字节码总是一样的,不管你在哪个平台上。@Jon,Kinkink:我知道——但它怀疑Tom没有。谢谢@Michael!我刚刚将复制流的commons io方法复制到我的代码中。@axiopisty:请注意,这些问题和答案已经有3年多的历史了。现在,您应该使用采用两个
路径
参数的Files.copy
方法。您真的确定不需要循环吗?transferFrom()返回“实际传输的字节数,可能为零”,就像InputStream.read()@Michael:Nope一样,source.size()
指定需要传输的字节数@模糊:在这个例子中,destination
不会在source.close()
抛出IOException
@BalusC时关闭。是的,但是API文档明确表示,该方法实际上可能不会传输那么多字节。我已经使用Linux上运行的通道复制了NIO文件,Solaris和OSX已经在生产环境中使用多年了,而且它从未失败过复制文件。@fuzzy:Translation:“它在我的机器上工作”。永远不要依赖API不能保证的行为。谢谢!并将ApacheCommons IO添加到您的列表中,这非常好!