English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Разделение и объединение файлов является обычной потребностью, например: при загрузке больших файлов можно сначала разделить их на小块, передать на сервер, а затем объединить. В многих современных распределенных файловых системах (например: Google GFS, Taobao TFS) файлы также разрезаются или объединяются по блокам.
Проверим основную идею:
Если у вас есть большой файл, после указания размера разреза (например: по 1M разреза)
Шаг 1:
Сначала на основе размера исходного файла и размера разреза вычислите количество подфайлов N
Шаг 2:
Создайте эти N файлов на диске
Шаг 3:
Запускаем несколько потоков (число потоков = количество разрезаемых файлов), в каждом потоке используем функцию seek класса RandomAccessFile, чтобы установить указатель чтения в начало каждого участка файла, затем читаем указанное количество байт (т.е. размер блока разреза) и в конечном итоге пишем в соответствующий разрезаемый файл, так как потоки обрабатывают файлы параллельно, скорость записи в отдельные файлы относительно высока.
Следующий код разрезает файл на несколько подфайлов, каждый из которых имеет размер 100K
package testIO; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Arrays; public class subStream { public static void main(String[] args) { //先将源文件读取到内存中 int eachSize=100*1024; File srcFile =new File("F:/test/test.txt"); //创建一个文件对象 splitFile(srcFile,eachSize); } public static void splitFile(File srcFile,int eachSize){ //判断文件是否符合拆分要求 if(srcFile.length()==0){ throw new RuntimeException("文件不符合拆分要求"); } byte[] fileContent= new byte[(int) srcFile.length()]; try { //将文件内容读取到内存中 FileInputStream fis=new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (Exception e) { e.printStackTrace(); } //计算要次要拆分为多少份 int fileNumber; if(fileContent.length%eachSize==0){ fileNumber = fileContent.length/eachSize; } else{ fileNumber = fileContent.length/eachSize+1; } for (int i=0;i<fileNumber;i++){ String fileName = srcFile.getName()+"-"+i+".txt"; File fi = new File(srcFile.getParent(), fileName); //在当前文件路径下创建拆分的文件 byte[] eachContent; //将源文件内容复制到拆分的文件中 if(i!=fileNumber-1){ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, eachSize*(i+1)); } else{ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length); } try { FileOutputStream fos = new FileOutputStream(fi); fos.write(eachContent); fos.close(); System.out.printf("Вывод подфайла %s, его размер %d, размер каждого %d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length); } catch (Exception e) { // TODO: обработать исключение e.printStackTrace(); } } } }
Заключение
Вот полный контент примера кода, показывающего, как разбить один файл на несколько подфайлов с использованием java IO потоков. Надеюсь, это поможет вам. Интересующиеся могут продолжить читать другие связанные темы на этом сайте, и если что-то не хватает, пожалуйста, оставьте комментарий. Спасибо за поддержку сайта!
Заявление: Контент этой статьи взят из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не имеет права собственности, не был обработан вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите спорный контент, пожалуйста, отправьте письмо по адресу notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения и предоставьте соответствующие доказательства. Если будет установлено, что контент нарушает авторские права, сайт немедленно удалил спорный контент.