2011-10-13 41 views
4

我有复制文件的方法如下:无声错误复制文件时

public static void nioCopy(File source, File destination) { 
    FileInputStream fis = null; 
    FileOutputStream fos = null; 
    FileChannel input = null; 
    FileChannel output = null; 
    try { 
     fis = new FileInputStream(source); 
     fos = new FileOutputStream(destination); 

     input = fis.getChannel(); 
     output = fos.getChannel(); 

     input.transferTo(0, input.size(), output); 

    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, "Can't find either of input/output files.", ex); 
    } catch (IOException ex) { 
     Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, "Can't open either of input/output file for reading/writing", ex); 
    } finally { 
     try { 
      fis.close(); 
      fos.close(); 
      input.close(); 
      output.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, "Error closing streams", ex); 
     } 

    } 
} 

而且我使用拷贝文件,但有时我得到一个无声的错误或不确定的行为或者我只是不知道如何解释一下,这是我所得到的:

这里是我的源:

-rw-r--r-- 1 nb9 team92 3.1G 2011-10-13 16:31 6443_6#5_1_6443_6#5_2.fastq.f.fq.gz 

这里是目的地:

-rw-r--r-- 1 nb9 team92 2.0G 2011-10-13 16:49 6443_6#5_1_6443_6#5_2.fastq.f.fq.gz 

我没有得到任何的异常而执行这个过程,并通过它的外观一切都应该是成功的,但后来当我开始解包文件获取:

java.io.EOFException的:意外结束ZLIB输入流

很明显,目标是1 gig关闭原始标记。

唯一的特点是这两个文件都在非常有繁忙的光泽文件系统有可能这是一些有趣的事情吗?

+0

尝试赶上一个'Exception',看到什么出来,因为现在这不是一个'FileNotFoundException'或任何错误的' IOException'将会保持沉默。 – Toomai

+1

另外,'transferTo'具有返回值。核实。 – Mat

+0

问题:您确定目标文件系统可以处理大于2GB的文件吗?前一段时间我试着把一个大文件“加密”到一个FAT32 FS,但是拷贝没有完成,但是我没有收到任何错误。 – Augusto

回答

2

截断2Gb的事实让我感到怀疑。我搜索了它,它看起来像一个issue with nio。也可能是目标文件系统允许最大2Gb文件。

Java NIO: Buffers

目前,缓冲器大小被限制为2GB(可在一个int表示的最大正数。更新的计划针对Java 7将允许大缓冲器(与大小和索引反正持有长)

,只是要确定:

  • 你可以尝试将它复制同一文件系统,如果你有SP高手?
  • 你可以试试Apache Commons IO FileUtils.copyFile()?似乎他们fixed this issue
  • 如果你可以升级,尝试使用Java 7,因为是出已经
+0

我刚刚查看了FileUtils.CopyFile的来源,它看起来非常健壮。我会尝试一下,看看问题是否依然存在。 – LordDoskias