La segmentación y la fusión de archivos son un requisito común. Por ejemplo: al cargar archivos grandes, primero se pueden dividir en piezas pequeñas y luego transferirse al servidor antes de fusionarse. En muchos sistemas de archivos distribuidos de alta gama (como GFS de Google y TFS de Taobao), los archivos también se dividen o fusionan de acuerdo con las unidades de bloque.
Echa un vistazo a las ideas básicas:
Si hay un archivo grande, especifique el tamaño dividido (por ejemplo: corte por 1m)
Paso 1:
Primero, calcule el número de archivos pequeños que finalmente se dividen en función del tamaño original del archivo y el tamaño de segmentación.
Paso 2:
Crea estos n pequeños archivos en el disco
Paso 3:
Abra múltiples hilos (número de hilos = número de archivos divididos). En cada hilo, use la función Seek de RandomAccessFile para localizar el puntero de lectura en la primera posición de cada segmento en el archivo original, y luego lea el tamaño especificado hacia atrás (es decir, el tamaño del bloque segmentado), y finalmente escriba el archivo dividido correspondiente. Debido a que el proceso de múltiples subprocesos en paralelo, cada uno escribe su propio archivo pequeño, que es relativamente rápido.
El siguiente código es dividir un archivo en múltiples subfiles, cada uno con un tamaño de 100k
paquete testio; import java.io.file; import java.io.fileInputStream; import java.io.fileOutputStream; import java.util.arrays; public class Subtream {public static void main (string [] args) {// leer el archivo fuente en la memoria primero int cada dio = 100*1024; archivo srcfile = nuevo args Archivo ("f: /test/test.txt"); // crea un objeto de archivo dividido (srcfile, eburos);} public static void splitFile (archivo srcfile, int ebraySize) {// determina si el archivo cumple los requisitos divididos si (srcfile.length () == 0) {throLe Newtimexception ("El archivo no cumple con los requisitos de división; fileContent = new byte [(int) srcfile.length ()]; try {// leer el contenido del archivo en memoria fileinputStream fis = new FileInputStream (srcfile); fis.read (fileContent); fis.close ();} capt (excepción e) {ePrintStackTrace (} // calcular cuántas copias de INT INT 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 Archivo (srcfile.getParent (), filename); // Crear un archivo dividido en la ruta del archivo actual byte [] everyContent; // Copie el contenido del archivo de origen en el archivo dividido if (i! = FileNumber-1) {cada uno de los que cada Arrays.copyOfRange (fileContent, EverySize*i, fileContent.length);} try {fileOutputStream fos = new FileOutputStream (fi); fos.write (cada uno); fos.close (); system.printf ("SUBFILE SUBFILE S, cuyo tamaño es %d, cada tamaño es %d/n ", fi.getabsolutefile (), fi.length (), cada uno de loscontent.length);} catch (Exception e) {// tODO: manejar excepción E.PrintStackTRace ();}}}}Resumir
Lo anterior es todo el contenido de este artículo sobre la división de un archivo en múltiples ejemplos de código de subfile. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!