Прочитайте части байтов в байтовый массив и сохраните их в новых файлах, когда буфер заполнен или это конец файла.
Например (код не является совершенным, но это должно помочь пониманию процесса)
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,7 MB
После раскола у меня было 13 файлов
myFile.mp4.001
- myFile.mp4.012
с размером 1 MB
myFile.mp4.013
с размером 806 KB
Если вы хотите, чтобы объединить эти файлы, которые вы можете использовать
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);
}
}
}
Вы также можете создать некоторые дополнительные методы, чтобы сделать вашу жизнь проще. Например, метод, который будет создавать список файлов, содержащих отдельные части, на основе имени (и местоположения) одного из этих файлов.
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
метод использовать только один из файлов 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));
}
Отлично. Спасибо alot :) –
А как насчет слияния? –
@ldce Я обновил свой ответ. Надеюсь, вам это понравится. – Pshemo