English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ejemplo de código para dividir un archivo en varios archivos subyacentes en Java IO

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.

Te gustará