English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La división y la combinación de archivos es una necesidad común, por ejemplo: al subir archivos grandes, primero puedes dividirlos en bloques pequeños, y luego combinarlos después de subirlos al servidor. Muchos sistemas de archivos distribuidos de alta gama (como GFS de Google, TFS de taobao) también dividen o combinan archivos en función de bloques.
Veamos la idea básica:
Si hay un gran archivo, después de especificar el tamaño de división (por ejemplo, en1M cortes)
paso 1:
Primero, según el tamaño del archivo original y el tamaño de división, calcula el número final de archivos pequeños N
paso 2:
Crea estos N pequeños archivos en el disco
paso 3:
Lanza múltiples hilos (número de hilos = número de archivos divididos), en cada hilo, utiliza la función seek de RandomAccessFile para ubicar el puntero de lectura en la posición de inicio de cada segmento del archivo original, luego lee el tamaño especificado hacia adelante (es decir, el tamaño del bloque de división), y finalmente escribe en el archivo de división correspondiente. Debido al procesamiento paralelo de múltiples hilos, cada uno escribe en su archivo pequeño, lo que resulta en una velocidad relativamente rápida.
El siguiente código es dividir un archivo en varios archivos subyacentes, cada uno de los cuales tiene un tamaño de100K
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) { //Primero leer el archivo de origen a la memoria int eachSize=100*1024; File srcFile =new File("F:",/test/test.txt"); //Crear un objeto archivo splitFile(srcFile,eachSize); } public static void splitFile(File srcFile,int eachSize){ //Determinar si el archivo cumple con los requisitos de división if(srcFile.length()==0){ throw new RuntimeException("El archivo no cumple con los requisitos de división"); } byte[] fileContent= new byte[(int) srcFile.length()]; try { //Llevar el contenido del archivo a la memoria FileInputStream fis=new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (Exception e) { e.printStackTrace(); } //Calcular el número de partes en las que se debe dividir 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); //Crear el archivo dividido en la ruta actual del archivo byte[] eachContent; //Copiar el contenido del archivo fuente al archivo dividido 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("Salida del archivo subyacente %s, su tamaño es %d, cada uno es de %d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length); } catch (Exception e) { // TODO: manejar excepción e.printStackTrace(); } } } }
Resumen
Esto es todo el contenido del ejemplo de código del artículo sobre cómo dividir un archivo en varios archivos subyacentes utilizando java IO flujo. Esperamos que sea útil para todos. Los amigos interesados pueden continuar leyendo otros temas relacionados en este sitio, y si hay deficiencias, son bienvenidos a dejar comentarios. Gracias por el apoyo de los amigos a este sitio!
Declaración: el contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga espontáneamente por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha editado人工处理,ni asume ninguna responsabilidad legal relevante. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.