前言

java中可以对电脑中的本地文件进行操作,也就是文件和IO流,其实 文件和IO 这是两个功能,不过经常组合起来用,所以就放在一起说了。

Java对文件的操作

//新建一个文件对象
		File f = new File("d:/aaa/bbb.txt");     
        System.out.println("文件构造路径:"+f.getPath());
        System.out.println("文件名称:"+f.getName());
        System.out.println("文件长度:"+f.length()+"字节");
        System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(f.lastModified()),ZoneId.of("Asia/Shanghai")));

        File f2 = new File("d:/aaa");     
        System.out.println("目录构造路径:"+f2.getPath());
        System.out.println("目录名称:"+f2.getName());
        System.out.println("目录长度:"+f2.length()+"字节");
        System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(f.lastModified()),ZoneId.of("Asia/Shanghai")));
    }

这里创建一个文件对象 f ,指定的路径可以是文件,也可以是文件夹,可以对 f 进行文件类型的操作,比如获取file的路径,父路径,名字,大小,创建时间等等,这些信息都可以得到。

这些都是为了对IO流做准备的。

Java中的IO流操作

IO即Input,Ouput,输入和输出,
又分为 字节流,字符流,缓冲流,缓冲流,
因为需要,此处只讲解字节流的输入和输出。

Input和Output即输入输出是对计算机的内存来说的,这里的内存说的是内存条(详细的不多讲,自度)。
从物理层次来说:

  • Input 输入即是输入到内存条,把读取文件的字节输入到内存条,这个过程为输入。
  • Output 输出即是把读取到的文件的字节,从内存条输出到本地硬盘,这个过程为输出。
// 使用File对象创建字节输入流对象
        File file = new File("a.txt");
        FileInputStream fis = new FileInputStream(file);
      
        // 使用文件名称创建流对象
        //FileInputStream fis = new FileInputStream("b.txt");
---------------------------------------------------------------------------
		// 使用File对象创建字节输出流对象
        File file = new File("a.txt");
        FileOutputStream fos = new FileOutputStream(file);
      
        // 使用文件名称创建流对象
        //FileOutputStream fos = new FileOutputStream("b.txt");

正文

只要是文件,不管是什么格式的文件,其基本都是由一个字节一个字节的组成起来的,字节是文件的基本单位,位是数据的基本单位(个人理解)。1MB = 1024KB 1KB = 1024B 1B = 1Byte Byte即是字节,1Byte = 8bit,bit不在理解文件的范畴中,牵扯到物理电路板电压等问题,不在此次讨论范围内。

(清楚了字节流再看下面描述)
当我们在复制一个文件时:

  • 宏观
  • 从源文件复制了一个新的文件,结果是有两个一样的文件
  • 微观
  • (字节流)一个字节一个字节的有序读取源文件,然后再一个字节一个字节的有序输出到新文件,结果是有两个一样的文件

从微观视角来说,当输出到新文件时,我们从中截断,把源文件的前一半字节输出一个a文件,再把后一半输出到b文件,最后得到三个文件,源文件+a文件+b文件,当然,a和b文件都是不完整文件。但如果我们再用字节流把a和b按照顺序拼装起来,那得到的文件和源文件是一样的吗?答案是肯定的,前面有提到,文件的基本组成单位就是字节,我们只是把字节分开又连接起来而已,顺序并没有改变。

用上述的操作,我们就可以把大文件分割成无数个小文件,但一定要有序,把小文件合并成源文件需要按照原来的顺序读取,写出。

有些软件存在大文件限速,可以用上面方法来解决,分割和合并过程快,大文件最多也就用个十几秒完成分割,合并也一样。

把上述方法写成完整的Java程序,然后用exe4j+jre打包成.exe文件,无需JDK环境也可运行,进行大文件的分割和合并。