很多情况下,我们使用的文件需要分割处理,例如邮件发送的大小有限制,我们需要发送的文件超过了大小限制,需要对文件进行分割处理。
在Java中,文件的分割和文件的复制、剪切、黏贴一样,都是通过文件内容的读取和写入完成的。在JAVA中,使用IO完成该操作非常方便。
练习题内容:
将一个文件,按照固定大小进行分割,输出到指定目录下,并且打印目标路径的文件目录。
文件名:C:\screenshot.PNG
目标路径:C:\splitfiles
分割大小: 10k
答案及说明:
package IO;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.IOException;
public class filesplit {
public static void main(String[] args) throws IOException {
//要分割的文件
File file = new File("C:\\screenshot.PNG");
//分割后的目的路径
File DestDir = new File("C:\\splitfiles");
//分割大小,按照如下大小分割,单位为byte
int size = 10 * 1024;
//调用文件分割方法执行分割
filesplit(file, DestDir, size);
//列出分割后的目的路径的结构
System.out.println("分割后的目标路径结构为:");
listAll(DestDir,0);
}
//定义文件分割方法,入参包括:文件,目的路径和分割大小
static void filesplit(File file, File dir, int size) throws IOException {
// 1.创建文件计数器,用于标记分割出的文件
int count = 0;
// 判断目的路径是否存在,不存在则创建
if (!dir.exists())
dir.mkdirs();
// 创建文件分割流,文件输入流,用于读取原始文件
FileInputStream fis = new FileInputStream(file);
// 创建文件输出流,用于写入分割后的文件
// 由于分割后的文件存在多个,创建的流不可赋值
FileOutputStream fos = null;
// 初始化流读取标记,用于标记读取流所在的位置;读取完成后,取值为-1
int len = 0;
// 创建缓冲区数组,用于存放读取固定大小的文件内容,大小为指定的分割大小
byte[] byt = new byte[size];
// 读取文件,写入到缓冲区数组byt中,读取大小为byt的长度;
// 读取到缓冲区byt中后,循环写入文件,存储路径为入参指定路径,文件名为x.part
while ((len = fis.read(byt)) != -1) {
fos = new FileOutputStream(new File(dir, (count++) + ".part"));
fos.write(byt, 0, len);
}
fos.close();
fis.close();
}
// 用递归法查询所有文件,并显示子目录的结构
// 入参有两个,一个是目标路径,
// 一个是标记子目录层级的level,level越小表示目录层级越高。根目录的level值为1.
static void listAll(File dir,int level) {
//判断文件是否存在,不存在则创建
if (!dir.exists())
dir.mkdirs();
//创建子目录数组,用于记录子目录
File[] files = dir.listFiles();
// 打印当前子目录的名字,名字前显示层用制表符显示层级
System.out.println(getSpace(level) + dir.getName());
// 递归显示路径子目录的文件结构。
// 当子目录为路径时,递归查询;
// 当子目录为文件时,直接打印文件,为了与目录进行区分,文件打印前加上"--"符号
for (File file : files) {
if (file.isDirectory()) {
level++;
listAll(file,level);
} else {
System.out.println(getSpace(level) +"- -" + file.getName());
}
}
}
// 根据level值,显示层级。每层打印一个"|"和一个制表符
// level为1时,打印一次层级;level为n时,打印n次
private static String getSpace(int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) {
sb.append("|"+"\t");
}
return sb.toString();
}
}
该代码的输出格式如下:
分割后的目标路径结构为:
splitfiles
- -0.part
- -1.part
- -2.part
- -3.part
544

被折叠的 条评论
为什么被折叠?



