package demo.io;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;
class 切割文件 {
private static final int SIZE = 1048576;
public static void main(String[] args) {
File file = new File("C:\\Users\\10340\\Desktop\\《Java基础入门》_课后习题.pdf");
File dir = new File("切割后文件目录");
splitFile(file, dir, 1);
File destDir = new File("合并后文件目录");
mergeFile(dir, destDir);
}
private static void mergeFile(File dir, File destDir) {
if (!destDir.exists()) {
destDir.mkdirs();
}
ArrayList<FileInputStream> fileArr = new ArrayList<>();
File[] files = dir.listFiles();
for (File file : files) {
try {
if (!"part.txt".equals(file.getName())) {
fileArr.add(new FileInputStream(file));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Enumeration<FileInputStream> en = Collections.enumeration(fileArr);
SequenceInputStream sis = new SequenceInputStream(en);
PrintStream ps = null;
FileInputStream fis = null;
int len = 0;
byte[] buf = new byte[1024];
try {
Properties prop = new Properties();
fis = new FileInputStream(new File(dir, "part.txt"));
prop.load(fis);
String fileName = prop.getProperty("fileName");
ps = new PrintStream(new FileOutputStream(new File(destDir, fileName)));
while ((len = sis.read(buf)) != -1) {
ps.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
sis.close();
if (ps != null) {
ps.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void splitFile(File file, File dir, int size) {
if (size < 0) {
System.out.println("size为非负数");
return;
}
System.out.println("源文件大小:" + (double) file.length() / SIZE + "M");
int partNum = (int) Math.ceil((double) file.length() / SIZE);
System.out.println("切割后将生成文件数量:" + partNum);
if (partNum <= 1) {
System.out.println("切割生成文件数量错误");
return;
}
if (!dir.exists()) {
dir.mkdirs();
}
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
int len = 0;
byte[] buf = new byte[SIZE];
int count = 0;
while ((len = fis.read(buf)) != -1) {
FileOutputStream fos = new FileOutputStream(new File(dir, file.getName() + (++count)));
fos.write(buf, 0, len);
fos.close();
}
Properties prop = new Properties();
prop.setProperty("fileName", file.getName());
PrintStream ps = new PrintStream(new FileOutputStream(new File(dir, "part.txt")));
prop.store(ps, "splitFileName");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}