Java NIO“;“没有这样的装置”;linux上出现异常,但在使用FileUtils时有效

Java NIO“;“没有这样的装置”;linux上出现异常,但在使用FileUtils时有效,java,nio,Java,Nio,我越来越 java.io.IOException: No such device at sun.nio.ch.FileChannelImpl.map0(Native Method) 在linux上使用此选项时(但在windows上工作正常): 但如果我这样做,它会起作用: FileUtils.copyFile(processedFile,outputFile); 源是另一台(Windows)计算机上的共享文件夹。当它在Windows机器上工作时也是如此。我假设FileUtils来自J

我越来越

java.io.IOException: No such device
    at sun.nio.ch.FileChannelImpl.map0(Native Method)
在linux上使用此选项时(但在windows上工作正常):

但如果我这样做,它会起作用:

FileUtils.copyFile(processedFile,outputFile);

源是另一台(Windows)计算机上的共享文件夹。当它在Windows机器上工作时也是如此。

我假设
FileUtils
来自Jakarta Commons IO,在这种情况下,它是一个完全不同的实现,因此它们之间没有关联

FileChannel.transferFrom()
尝试对指定文件的部分进行内存映射,根据错误消息,问题似乎是无法对整个文件进行内存映射。我猜您的Linux机器运行的是32位,而Windows机器运行的是64位


第二个选项:查看
mmap
的手册页,当“指定文件的底层文件系统不支持内存映射”时会引发此异常。您如何在Linux上装载文件系统?如果您正在安装Samba文件系统,我可以理解为什么它不能被映射。

我刚刚看到了完全相同的问题。检查您的共享是否在没有
directio
选项的Linux上装载。在我的例子中,不使用
directio
重新安装立即解决了此错误。 此选项禁用缓存,但也禁用mmap()系统函数


执行共享的
装载
时,不要指定
-o directio
。还要检查
/etc/fstab
文件是否未为您的共享指定
directio

您使用的是什么NIO类/方法?如何创建
目的地
?它们是这样创建的。。。文件输出文件=新文件(路径);文件处理文件=新文件(路径2);FileChannel source=newfileinputstream(processedFile).getChannel();FileChannel destination=新的FileOutputStream(outputFile).getChannel();它们都是64位机器。但它是一个Samba文件系统。这是否意味着没有办法映射它?谷歌搜索“mmap samba”时发现了这个问题:我认为这表明它不受支持。额外的谷歌搜索可能会给你提供更多的信息。作为一般评论,虽然NIO承诺会提高性能,但我想你会发现
FileUtils
几乎也会这样做。复制文件的主要性能是磁盘/网络访问,而不是在内存中移动数据。parsifal-非常感谢您的帮助。我在谷歌搜索了一下,找到了你发布的链接。不幸的是,我不太清楚。我找不到其他的东西了。关于性能提升:我也在谷歌上搜索了一下,发现对于所讨论的文件大小,有一个显著的性能提升。@TGW-在我看来,慢而有效比快而无效要好,但这是你的决定。我个人的经验告诉我,不要依赖谷歌搜索来获取性能提示。
FileUtils.copyFile(processedFile,outputFile);