Carga de archivos grandes de Java (segunda transferencia, carga de fragmentos, reanudación de punto de interrupción)

1. Segunda transmisión

La segunda transmisión significa que no hay transmisión, y la lógica de implementación es verificar si el archivo ya existe en la base de datos o en el caché.Si existe, simplemente obténgalo directamente del archivo existente (devuelva la dirección del archivo).
Para juzgar si es el mismo archivo aquí, se utiliza el algoritmo de resumen de información Para obtener más información, consulte: Un artículo para comprender el sistema de tecnología de cifrado de uso común actual.
Los algoritmos de recopilación de información a menudo se utilizan para garantizar la integridad de la información y evitar que la información sea manipulada durante la transmisión (es imposible determinar si la información ha sido monitoreada). El más utilizado es el algoritmo MD5.

2. Carga parcial

Cargar en partes es equivalente a dividir un archivo grande en muchas partes pequeñas, al igual que el archivo hls, pieza por pieza, y una vez que se completa la carga, se combinan para formar un archivo completo.
Por lo general, se usa junto con el currículum de punto de interrupción.

3. Reanudación desde puntos de interrupción

Durante el proceso de carga de varias partes, si la carga se interrumpe debido a una falla de sesión, problemas de red o problemas del sistema, vuelva a cargar después de la recuperación, en lugar de reiniciar desde el principio, es una carga reanudable.

4. Clase RandomAccessFile

Admite el salto libre a cualquier posición del archivo para leer y escribir El papel de la clase RandomAccessFile es obvio y puede admitir cargas fragmentadas y resúmenes de puntos de interrupción.
Parte de su código fuente es el siguiente:

public RandomAccessFile(File file, String mode)
        throws FileNotFoundException
    {
    
    
        String name = (file != null ? file.getPath() : null);
        int imode = -1;
        if (mode.equals("r"))
            imode = O_RDONLY;
        else if (mode.startsWith("rw")) {
    
    
            imode = O_RDWR;
            rw = true;
            if (mode.length() > 2) {
    
    
                if (mode.equals("rws"))
                    imode |= O_SYNC;
                else if (mode.equals("rwd"))
                    imode |= O_DSYNC;
                else
                    imode = -1;
            }
        }
        ......
        fd = new FileDescriptor();
        fd.attach(this);
        path = name;
        open(name, imode);
    }

r : modo de solo lectura.
rw: modo de lectura y escritura
rws: en relación con rw, rws actualiza sincrónicamente la modificación del "contenido del archivo" o los "metadatos" en el dispositivo de almacenamiento externo.
rwd: en relación con rw, rwd actualiza de forma síncrona la modificación del "contenido del archivo" en el dispositivo de almacenamiento externo.

El contenido del archivo se refiere a los datos realmente almacenados en el archivo, y los metadatos se utilizan para describir los atributos del archivo, como la información sobre el tamaño del archivo y los tiempos de creación y modificación.
Ejemplo de código:

 public static void main(String[] args) throws IOException {
    
    
        RandomAccessFile randomAccessFile = new RandomAccessFile(new File("input.txt"), "rw");
        System.out.println("读取之前的偏移量:" + randomAccessFile.getFilePointer() +
                ",当前读取到的字符" + (char) randomAccessFile.read() +
                ",读取之后的偏移量:" + randomAccessFile.getFilePointer());
        randomAccessFile.seek(4);
        // 从偏移量 4 的位置开始往后写入字节数据
        randomAccessFile.write(new byte[]{
    
    'H', 'I', 'J', 'K','L','M'});
        System.out.println("读取之前的偏移量:" + randomAccessFile.getFilePointer() +
                ",当前读取到的字符" + (char) randomAccessFile.read() +
                ",读取之后的偏移量:" + randomAccessFile.getFilePointer());

    }

El método write() está sobrescribiendo. Para el archivo input.txt, el valor inicial es ABCDE, y el valor después de la ejecución es ABCDHIJKLM. Los resultados de la ejecución son los siguientes:

读取之前的偏移量:0,当前读取到的字符A,读取之后的偏移量:1
读取之前的偏移量:10,当前读取到的字符,读取之后的偏移量:10

5. Realizar carga de fragmentos + currículum de punto de interrupción

(En caso de concurrencia, defina el bit indicador para confirmar la finalización de la carga de cada fragmento y notifique la fusión). 2. El código central para implementar RandomAccessFile en el backend para realizar la fusión es el siguiente:








RandomAccessFile raf = new RandomAccessFile(file,"rw");
raf.seek(keyIndex);//seek(int n)从n处处理
byte[] bytes = fileValue.getBytes();//提区文件的字节流
raf.write(bytes);//上面的seek方法已经把指针放在这里从这直接写入

Supongo que te gusta

Origin blog.csdn.net/liwangcuihua/article/details/131515806
Recomendado
Clasificación