夜袭和尚庙 发表于 2019-5-27 16:52

[IO流笔记]切割文件,合并文件

自学了好久的java,从异常都不会抓 到现在学到了IO流
看了视屏后 自己按照思路码的一个代码,还有什么能够优化的地方或者思路 请大佬们指教。
毕竟视屏是很早以前,技术是不断更新的。 {:301_997:}
切割文件代码:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
/**
*                 切割文件
* 思路:
*                 明确一:
*                         需要操作源和目的流
*                 明确二:
*                         非文本,字节流
*                 明确三:
*                         源设备:硬盘
*                                 FileInputStream
*                         目的设备:硬盘
*                                 FileOutputStream
*                 明确四:
*                         需要额外功能吗?
*                         缓冲               
* @AuThor Administrator
*
*/
public class FileIncision {
        public static final int BUF_SIZE = 2097152;        //2M缓冲区

        public static void main(String[] args) {
                /*
               * 切割的文件
               * 注意!!!自己修改成你目录下的某个文件
               */
                File file = new File("F:\\","jdk-8u191-windows-x64.exe");
                //切割完后存放的路径
                File fileDir = new File("F:\\Incision");
                try {
                        //切割文件方法会在目录下面输出一个配置文件
                        IncisionFile(file,fileDir,BUF_SIZE);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

        public static void IncisionFile(File file, File fileDir,int BUF_SIZE) throws IOException {
                //判断是否存在 或者是否为一个文件
                if(!(file.exists() && file.isFile())) {
                        throw new RuntimeException("当前文件不存在,或者非文件");
                }
                //判断存放路径是否存在 不存在就创建一个
                if(!(fileDir.exists() && fileDir.isDirectory())) {
                        fileDir.mkdirs();
                }
                //创建一个字节缓冲区 用于存储截取的数据
                byte[] data = new byte;
                //创建读取流
                FileInputStream fis = new FileInputStream(file);
                //创建输出流   因为输出流只能对应一个文件 所以我们的输出流要有多个,只创建应用 在while循环中创建对象
                FileOutputStream fos = null;
                //用于计数碎片数量 初识为1
                int count = 1;
                int len = 0;
                while((len=fis.read(data))!=-1) {
                        fos = new FileOutputStream(new File(fileDir,file.getName()+"."+count+".part"));
                        fos.write(data,0,len);
                        count++;
                        fos.close();
                }
                //创建配置文件要和合并程序保持相同路径
                File config = new File(fileDir,"config.Properties");
                //如果存在 就删除配置文件重新创建
                if(config.exists() && config.isFile()) {
                        config.delete();
                }
                BufferedWriter bufw = new BufferedWriter(new FileWriter(config));
                //创建一个属性集
                Properties pro = new Properties();
                //添加属性
                pro.setProperty("FileName", file.getName());
                pro.setProperty("FileSize",""+(--count));
                //注释
                String annotation = "this is my Incision function";
                //写入硬盘 持久化
                pro.store(bufw,annotation);
                //释放流
                bufw.close();       
        }
}



合并文件代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
/**
* 合并文件
* @author Administrator
*
*/
public class MergeFile {
        public static void main(String[] args) {
                //读取切割后的配置文件一定要和切割程序保持一样的路径 否则读取不到文件 出异常
                File config = new File("F:\\Incision","config.Properties");
                //合并后存放的路径
                File FileDir = new File("F:\\Incision");
                Properties data = null;
                try {
                        //解析配置文件
                        data = MyJieXie(config);
                } catch (IOException e) {
                        e.printStackTrace();
                }
                try {
                        //合并文件
                        MyMergeFile(data,FileDir);
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

        private static void MyMergeFile(Properties data, File fileDir) throws IOException {
                if(!(fileDir.exists() && fileDir.isDirectory())) {
                        fileDir.mkdirs();
                }
                //获取文件名
                String FileName = data.getProperty("FileName");
                //获取碎片总数量
                int count = Integer.parseInt(data.getProperty("FileSize"));
                //创建文件
                File file = new File(fileDir,FileName);
                //创建写入流,支持续写
                FileOutputStream fos = new FileOutputStream(file,true);
                //创建读取流因为读取流不止一个 所以只创建引用
                FileInputStream fis = null;
                //创建一个缓冲区
                byte[] Buf = new byte;
                int len = 0;
                for(int i=1;i<=count;i++) {
                        fis = new FileInputStream(new File(fileDir,FileName+"."+i+".part"));
                        len = fis.read(Buf);
                        fos.write(Buf,0,len);
                        //每写完一个 就释放流 重新创建节约资源
                        fis.close();
                }
                //释放流
                fos.close();
        }
        /**
       * 解析文件方法 返回一个Properties集合
       * @Param config
       * @return
       * @throws IOException
       */
        private static Properties MyJieXie(File config) throws IOException{
                Properties pro = new Properties();
                pro.load(new FileReader(config));
                return pro;
        }
}



jason_tingna 发表于 2019-5-27 17:08

学过java 但是都还给老师了。

夜袭和尚庙 发表于 2019-5-27 17:16

jason_tingna 发表于 2019-5-27 17:08
学过java 但是都还给老师了。

羡慕还有老师教 我都是看视频学{:301_999:}

总有一天 发表于 2019-5-27 23:12

楼主加油喽,争取都还给视屏{:301_986:}

夜袭和尚庙 发表于 2019-5-28 08:18

{:1_907:}才发现fis流还没有释放这算是一个小bug吧
页: [1]
查看完整版本: [IO流笔记]切割文件,合并文件