Сегментация файла и слияние являются распространенным требованием. Например: при загрузке больших файлов их можно сначала разделить на небольшие кусочки, а затем перенести на сервер перед слиянием. Во многих высококачественных распределенных файловых системах (таких как GFS Google GFS и TFS TAOBAO) файлы также разделены или объединяются в соответствии с блочными единицами.
Взгляните на основные идеи:
Если есть большой файл, укажите размер разделения (например: вырезать на 1M)
Шаг 1:
Во -первых, рассчитайте количество небольших файлов, которые наконец -то разделены на основе исходного размера файла и размера сегментации.
Шаг 2:
Создайте эти N небольшие файлы на диске
Шаг 3:
Откройте несколько потоков (количество потоков = количество разделенных файлов). В каждом потоке используйте функцию поиска randomAccessfile, чтобы найти указатель считывания в первом положении каждого сегмента в исходном файле, а затем прочитайте указанный размер назад (то есть размер сегментированного блока) и, наконец, напишите соответствующий разделенный файл. Поскольку многопотоковые обработки параллельно, каждый из них записывает свой собственный небольшой файл, который является относительно быстрым.
Следующий код должен разделить файл на несколько подфийлов, каждый с размером 100K
Пакет Testio; импорт java.io.file; import java.io.fileinputStream; import java.io.fileOutputStream; import java.util.arrays; подстрик открытого класса {public static void main (string [] args) {// Прочитал исходный файл в память, сначала int sAw File ("f: /test/test.txt"); // Создать файл объект SplitFile (srcfile, whysize);} public static void splitfile (file srcfile, int wardsize) {// определить, соответствует ли файл требованиям split if (srcfile.length () == 0) {throw new runmexception (srcfile.length () == 0) {throw new runmexception (srcfile.length () == 0) {Throw New Runtimexception ("splicle.length () == 0) {throw new runmexception (" splicle.length. filecontent = new Byte [(int) srcfile.length ()]; try {// Читать содержимое файла в память fileInputStream fis = new FileInputStream (srcfile); fis.read (filecontent); fis.close ();} Catch (Exception E) {e.printStacktrace (); fileNumber; if (fileContent.Length%whySize == 0) {fileConter = fileContent.Length/whySize;} else {fileConter = fileContent.Length/whySize+1;} для (int i = 0; i <fileNumber; i ++) {String fileName = srcfile.getname ()+"+". File (srcfile.getparent (), filename); // Создать разделенную файл в текущем пути пути файла [] wanlcontent; // Скопировать содержимое исходного файла в разделенную файл if (i! = Filemumber-1) {earlycontent = arrays.copyofrange (filecontent, waysize*i, wanlsize*(i+1); Arrays.copyOfrange (fileContent, wangSize*i, filecontent.length);} try {fileOutputStream fos = new FileOutputStream (fi); fos.Write (каждый контент); fos.close (); System.out.printf ("subfile subfile %, размер которого %d, каждый размер равен каждый размер. %d/n ", fi.getabsolutefile (), fi.length (), cayncontent.length);} catch (Exception e) {// todo: обрабатывать исключение e.printstacktrace ();}}}}}}}}}}}}}}}}}}}Суммировать
Приведенное выше содержимое этой статьи о разделении файла на несколько примеров кода подфиля. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!