RandomAccessFile分割、还原文件(三)

RandomAccessFile
placeholder image
admin 发布于:2015-12-21 13:41:48
阅读:loading

背景介绍

关于前面两篇分割、还原文件的介绍,示例代码运行无误,但发现遇到分割3.xxG大小的操作系统文件时,却出现错误,错误原因为:Exception in thread "main" java.io.IOException: Negative seek offset 意思是说指针位置指向的错了,后来分析半天代码发现在代码实现中定义的分割文件的大小用的int类型,而在参与指针位置计算的时候有long类型的参与,但结果还是ing类型的,可能是int越界吧,成了负数导致,将int修改为long类型的即可。另外还有一个地方计算分割文件的开始、结束位置时采用另外一种运算,感觉这种begin、end范围更加科学,代码参考如下:

   package com;

 

   import java.io.BufferedOutputStream;

   import java.io.File;

   import java.io.FileOutputStream;

   import java.io.IOException;

   import java.io.RandomAccessFile;

 

   /**

    * 按指定文件大小分割文件

    *

    * @author chendd

    *

    */

   public class SplitFileCore {

 

       private long blockLength;// 分割单个文件大小

 

       public SplitFileCore(int blockLength) {

           this.blockLength = blockLength;

       }

 

       public void split(File srcFile, String splitFolder) throws Exception {

           long fileLens = srcFile.length();// 文件大小

           if (fileLens <= this.blockLength) {

               System.out.println("分割的文件大小 " + this.blockLength + " 大于文件的大小!");

               return;

           }

           RandomAccessFile raf = new RandomAccessFile(srcFile, "r");

           // 根据分割块大小,计算一共有多少块文件

           int blockCount = (int) (fileLens % this.blockLength);

           if (blockCount == 0) {

               blockCount = (int) (fileLens / this.blockLength);

           } else {

               blockCount = (int) (fileLens / this.blockLength) + 1;

           }

           // 按快进行读取文件

           String srcFileName = srcFile.getName();

           for (int i = 0; i < blockCount; i++) {

               File destFile = new File(splitFolder + File.separator + srcFileName

                       + "." + (i + 1) + ".part");

               splitFileDetail(i , destFile, raf);// 分割文件

           }

 

           if (raf != null) {

               raf.close();

           }

       }

 

       private void splitFileDetail(int index, File destFile, RandomAccessFile raf)

               throws IOException {

           byte b[] = new byte[1024];

           int lens = 0;

           // 如果文件目录不存在,则创建

           if (destFile.getParentFile().exists() == false) {

               destFile.getParentFile().mkdirs();

           }

           long begin = index * blockLength;

           long end = begin + this.blockLength;

           raf.seek(begin);// 设置开始读取的位置

           BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

           while ((lens = raf.read(b)) != -1) {

               // 判断文件读取的大小,避免已经读取超过每块的大小了

               long currentReadPoint = raf.getFilePointer();//当读取位置

               if (currentReadPoint > end) {

                   break;

               }

               bos.write(b, 0, lens);

           }

           if (bos != null) {

               bos.flush();

               bos.close();

           }

       }

 

       public static void main(String[] args) throws Exception {

 

           //File srcFile = new File("d:\\splitFolder\\中国政区2500.jpg");

           File srcFile = new File("d:\\splitFolder\\123.iso");

           String splitFolder = "d:\\splitFolder";// 分割存储路径

           //SplitFileCore splitFile = new SplitFileCore(1024 * 1024 * 1);// 1M的大小去分割文件

           SplitFileCore splitFile = new SplitFileCore(1024 * 1024 * 100);// 1M的大小去分割文件

           splitFile.split(srcFile, splitFolder);

           System.out.println("文件分割完毕...");

       }

 

   }

 点赞


 发表评论

当前回复:作者

 评论列表


留言区