黑马程序员技术交流社区

标题: 独立写出文件切割(合并),考验你的耐心,流和集..... [打印本页]

作者: 王烽棋    时间: 2015-4-28 21:28
标题: 独立写出文件切割(合并),考验你的耐心,流和集.....
感觉这个应该是毕老师视频中关于流操作的比较复杂的一个了,涉及流,文件,集合,异常处理。
  1. package com.itheima;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.FilenameFilter;
  9. import java.io.IOException;
  10. import java.io.SequenceInputStream;
  11. import java.util.ArrayList;
  12. import java.util.Collections;
  13. import java.util.Enumeration;
  14. import java.util.Properties;
  15. import java.util.Set;


  16. /**
  17. * 文件的切割与合并
  18. * @author wfq
  19. */
  20. public class Test9 {

  21.         public static void main(String[] args) {
  22. //                File file = new File("tempfile\\那片海.mp3");
  23.                 File targfFile = new File("tempfile\\targfile");
  24. //                split(file,targfFile);
  25.                 merger(targfFile);
  26.         }
  27.         //合并文件方法
  28.         public static void merger(File targfFile) {
  29.                
  30.                 //判断该文件是否存在且为目录
  31.                 if(!(targfFile.exists()&&targfFile.isDirectory()))
  32.                         throw new RuntimeException("该文件不存在或不是目录...");
  33.                
  34.                 //判断配置文件是否存在且唯一
  35.                 File[] filesProp = targfFile.listFiles(new FilenameFilter() {
  36.                         @Override
  37.                         public boolean accept(File dir, String name) {
  38.                                 return name.endsWith(".properties");
  39.                         }
  40.                 });
  41.                 if(!(filesProp.length==1))
  42.                         throw new RuntimeException("配置文件不存在或不唯一...");
  43.                 //创建属性集读取配置文件
  44.                 Properties prop = new Properties();
  45.                 BufferedInputStream propIn = null;
  46.                
  47.                 String fileName = null;
  48.                 int fileCount = 0;
  49.                 try {
  50.                         propIn = new BufferedInputStream(new FileInputStream(filesProp[0]));
  51.                         prop.load(propIn);
  52.                         Set<String > propSet = prop.stringPropertyNames();
  53.                         for (String string : propSet) {
  54.                                 fileName = string;
  55.                                 fileCount = Integer.parseInt(prop.getProperty(fileName));
  56.                         }
  57.                 } catch (IOException e) {
  58.                         System.out.println("异常啦..");
  59.                 } finally {
  60.                         if(propIn!=null)
  61.                         try {
  62.                                 propIn.close();
  63.                         } catch (IOException e) {
  64.                                 e.printStackTrace();
  65.                         }
  66.                 }
  67.                 //判断碎片文件是否缺失或不连续
  68.                 File[] filesPart = targfFile.listFiles(new FilenameFilter() {
  69.                         @Override
  70.                         public boolean accept(File dir, String name) {
  71.                                 return name.endsWith(".part");
  72.                         }
  73.                 });
  74.                 //判断碎片数异常
  75.                 if(fileCount!=filesPart.length)
  76.                        throw new RuntimeException("碎片数异常...");
  77.                 //判断是否有碎片缺失
  78.                 for (int i = 1; i <= fileCount; i++) {
  79.                         File partFile = new File(targfFile, i+".part");
  80.                         if(!partFile.exists())
  81.                                 throw new RuntimeException(partFile.getName()+"碎片缺失..");
  82.                 }
  83.                 //合并文件
  84.                 mergerFile(targfFile,filesPart,fileName);
  85.         }
  86.        
  87.         private static void mergerFile(File targfFile, File[] filesPart,
  88.                         String fileName) {
  89.                 //创建存储流的集合
  90.                 ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();
  91.                 //存入关联每一个碎片文件的流对象
  92.                 for (File file : filesPart) {
  93.                         try {
  94.                                 list.add(new FileInputStream(file));
  95.                         } catch (FileNotFoundException e) {
  96.                                 e.printStackTrace();
  97.                         }
  98.                 }
  99.                 //获取输入流的枚举
  100.                 Enumeration<FileInputStream> en = Collections.enumeration(list);
  101.                 //创建序列读取流
  102.                 SequenceInputStream in = new SequenceInputStream(en);
  103.                 //创建输出流
  104.                 BufferedOutputStream out = null;
  105.                
  106.                 try {
  107.                         out = new BufferedOutputStream(new FileOutputStream(new File(targfFile, fileName)));
  108.                         byte[] buf = new byte[1024];
  109.                         int len = 0;
  110.                         while ((len=in.read(buf))!=-1) {
  111.                                 out.write(buf, 0, len);
  112.                                 out.flush();
  113.                         }
  114.                 } catch (IOException e) {
  115.                         System.out.println("异常啦..");
  116.                 } finally {
  117.                         //关闭资源
  118.                         if(in!=null)
  119.                         try {
  120.                                 in.close();
  121.                         } catch (IOException e) {
  122.                                 e.printStackTrace();
  123.                         }
  124.                         if(out!=null)
  125.                                 try {
  126.                                         out.close();
  127.                                 } catch (IOException e) {
  128.                                         e.printStackTrace();
  129.                                 }
  130.                 }
  131.         }
  132.         //切割文件方法
  133.         public static void split(File file, File targfFile){
  134.                 //判断被切割的文件是否是是文件并存在
  135.                 if(!(file.isFile()&&file.exists()))
  136.                         throw new RuntimeException("被切割的文件不存在或不是文件...");
  137.                 //判断目标目录是否存在,不存在创建
  138.                 if(!targfFile.exists())
  139.                         targfFile.mkdir();
  140.                 //创建属性集,持久化存储配置文件
  141.                 Properties prop = new Properties();
  142.                 //创建以该大小为单位的切割文件的缓冲数组
  143.                 byte[] buf = new byte[1024*1024];
  144.                 //创建读写流
  145.                 BufferedInputStream bfi = null;
  146.                 BufferedOutputStream bfo = null;
  147.                 //记录生成文件编号
  148.                 int fileNum = 0;
  149.                 //完成切割
  150.                 try {
  151.                         bfi = new BufferedInputStream(new FileInputStream(file));
  152.                        
  153.                         int len = 0;
  154.                         while ((len=bfi.read(buf))!=-1) {
  155.                                 bfo = new BufferedOutputStream(new FileOutputStream(new File(targfFile, (++fileNum)+".part")));
  156.                                 bfo.write(buf, 0, len);
  157.                                 bfo.flush();
  158.                         }
  159.                         //记录配置数据
  160.                         prop.setProperty(file.getName(), String.valueOf(fileNum));
  161.                        
  162.                         bfo = new BufferedOutputStream(new FileOutputStream(new File(targfFile, (++fileNum)+".properties")));
  163.                         //写出数据到配置文件
  164.                         prop.store(bfo, "wfq");
  165.                        
  166.                 } catch (IOException e) {
  167.                         System.out.println("出错啦...");
  168.                 } finally {
  169.                         //关闭资源
  170.                         if(bfi!=null)
  171.                         try {
  172.                                 bfi.close();
  173.                         } catch (IOException e) {
  174.                                 e.printStackTrace();
  175.                         }
  176.                         if(bfo!=null)
  177.                                 try {
  178.                                         bfo.close();
  179.                                 } catch (IOException e) {
  180.                                         e.printStackTrace();
  181.                                 }
  182.                 }
  183.                
  184.         }

  185. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2