Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复制文件的本机JDK代码_Java_File_Streaming_Copy_Buffer - Fatal编程技术网

Java 复制文件的本机JDK代码

Java 复制文件的本机JDK代码,java,file,streaming,copy,buffer,Java,File,Streaming,Copy,Buffer,是否有本地JDK代码来复制文件(缓冲区、流或其他内容)?您最好的选择是使用Java NIO: 有关缓冲区,请参阅: 但是,有关流,请参见以下文章: 在此基础上构建了一些框架,即Mina和Netty: 米纳- 内蒂- 如果“本机”指的是“Java标准API的一部分”(而不是依赖于平台的代码,在Java世界中通常称为“本机”)和“复制文件”指的是“采用文件和目标路径并生成文件内容副本的单一方法”,那么不,标准API中没有此类方法。您必须打开一个InputStream和一个OutputStre

是否有本地JDK代码来复制文件(缓冲区、流或其他内容)?

您最好的选择是使用Java NIO:

有关缓冲区,请参阅:

但是,有关流,请参见以下文章:

在此基础上构建了一些框架,即Mina和Netty:

  • 米纳-
  • 内蒂-
如果“本机”指的是“Java标准API的一部分”(而不是依赖于平台的代码,在Java世界中通常称为“本机”)和“复制文件”指的是“采用文件和目标路径并生成文件内容副本的单一方法”,那么不,标准API中没有此类方法。您必须打开一个
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添加到您的列表中,这非常好!