バイトの一部をバイト配列に読み取り、バッファがいっぱいになったとき、またはファイルの終わりになったら、それらを新しいファイルに格納します。
たとえば(コードは完全ではありませんが、プロセスを理解するのに役立つはずです)
class FileSplit {
public static void splitFile(File f) throws IOException {
int partCounter = 1;//I like to name parts from 001, 002, 003, ...
//you can change it to 0 if you want 000, 001, ...
int sizeOfFiles = 1024 * 1024;// 1MB
byte[] buffer = new byte[sizeOfFiles];
String fileName = f.getName();
//try-with-resources to ensure closing stream
try (FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis)) {
int bytesAmount = 0;
while ((bytesAmount = bis.read(buffer)) > 0) {
//write each chunk of data into separate file with different number in name
String filePartName = String.format("%s.%03d", fileName, partCounter++);
File newFile = new File(f.getParent(), filePartName);
try (FileOutputStream out = new FileOutputStream(newFile)) {
out.write(buffer, 0, bytesAmount);
}
}
}
}
public static void main(String[] args) throws IOException {
splitFile(new File("D:\\destination\\myFile.mp4"));
}
}
myFile.mp4サイズ=12,7MB
分割後、13個のファイルがありました
myFile.mp4.001
-myFile.mp4.012
サイズ1MB
myFile.mp4.013
サイズ806KB
これらのファイルをマージする場合は、次を使用できます
public static void mergeFiles(List<File> files, File into)
throws IOException {
try (FileOutputStream fos = new FileOutputStream(into);
BufferedOutputStream mergingStream = new BufferedOutputStream(fos)) {
for (File f : files) {
Files.copy(f.toPath(), mergingStream);
}
}
}
また、あなたの生活を楽にするためにいくつかの追加のメソッドを作成することができます。たとえば、これらのファイルの1つの名前(および場所)に基づいて分離された部分を含むファイルのリストを作成するメソッド。
public static List<File> listOfFilesToMerge(File oneOfFiles) {
String tmpName = oneOfFiles.getName();//{name}.{number}
String destFileName = tmpName.substring(0, tmpName.lastIndexOf('.'));//remove .{number}
File[] files = oneOfFiles.getParentFile().listFiles(
(File dir, String name) -> name.matches(destFileName + "[.]\\d+"));
Arrays.sort(files);//ensuring order 001, 002, ..., 010, ...
return Arrays.asList(files);
}
このメソッドを使用すると、メソッドをオーバーロードして、リスト全体mergeFiles
ではなく1つのファイルのみを使用できます(ファイルの1つに基づいてそのリストを生成します)File oneOfFiles
List<File>
public static void mergeFiles(File oneOfFiles, File into)
throws IOException {
mergeFiles(listOfFilesToMerge(oneOfFiles), into);
}
これらのメソッドをオーバーロードして、String
代わりに使用することもできますFile
(必要に応じて各文字列をファイルでラップします)
public static List<File> listOfFilesToMerge(String oneOfFiles) {
return listOfFilesToMerge(new File(oneOfFiles));
}
public static void mergeFiles(String oneOfFiles, String into) throws IOException{
mergeFiles(new File(oneOfFiles), new File(into));
}