Копирование файлов с использованием байтового буфера, немного увеличивающего размер файла назначения в Java - PullRequest
0 голосов
/ 29 мая 2018

Я создаю простое приложение для копирования файлов для личного использования.Но когда я запускаю программу, выходной файл немного больше исходного файла.Я использую буферы в зависимости от размера файла:

  1. , если размер файла меньше 9 КБ, а размер буфера составляет 512 байт.
  2. , если размер файла меньше 9 МБ, чемразмер буфера составляет 512 * 1024 байта (512 КБ).
  3. , если размер файла меньше 99 МБ, чем размер буфера 1024 * 1024 байта (1 МБ).
  4. другой размер буфера равен 2 *1024* 1024 байта (около 2,5 МБ).

Исходный код

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.text.DecimalFormat;

    /**
    * mcopy
    */
public class mcopy {

private static byte buffersm[] = new byte[512]; // buffer for upto 9kb
private static byte buffermd[] = new byte[512 * 1024]; // buffer for upto 9 MB
private static byte bufferlg[] = new byte[1024 * 1024]; // buffer for upto 99MB
private static byte bufferxl[] = new byte[2 * 1024 * 1024]; // buffer for above 100MB
private static FileInputStream fin = null;
private static FileOutputStream fout = null;
private static int i = 0;
private static double length = 0;
private static double j = 0;
private static DecimalFormat decimal_p_ = new DecimalFormat("#.#");

private static void copysm(File a, File b) {
    try {
        length = a.length();
        fin = new FileInputStream(a);
        fout = new FileOutputStream(b);
        i = fin.read(buffersm);
        j = 0;
        while (i != -1) {
            j += i;
            fout.write(buffersm);
            System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
                    + b.getPath() + " buffer: " + buffersm.length + " \r");
            i = fin.read(buffersm);
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    } finally {
        try {
            fin.close();
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

private static void copymd(File a, File b) {
    try {
        length = a.length();
        fin = new FileInputStream(a);
        fout = new FileOutputStream(b);
        i = fin.read(buffermd);
        j = 0;
        while (i != -1) {
            j += i;
            fout.write(buffermd);
            System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
                    + b.getPath() + " buffer: " + buffermd.length + " \r");
            i = fin.read(buffermd);
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    } finally {
        try {
            fin.close();
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

private static void copylg(File a, File b) {
    try {
        length = a.length();
        fin = new FileInputStream(a);
        fout = new FileOutputStream(b);
        i = fin.read(bufferlg);
        j = 0;
        while (i != -1) {
            j += i;
            fout.write(bufferlg);
            System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
                    + b.getPath() + " buffer: " + bufferlg.length  + " \r");
            i = fin.read(bufferlg);
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    } finally {
        try {
            fin.close();
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

private static void copyxl(File a, File b) {
    try {
        length = a.length();
        fin = new FileInputStream(a);
        fout = new FileOutputStream(b);
        i = fin.read(bufferxl);
        j = 0;
        while (i != -1) {
            j += i;
            fout.write(bufferxl);
            System.out.print("Copying... " + decimal_p_.format(((j / length) * 100)) + " " + a.getName() + " to "
                    + b.getPath() + " buffer: " + bufferxl.length  + " \r");
            i = fin.read(bufferxl);
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    } finally {
        try {
            fin.close();
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    File in = new File(args[0]);
    File out = new File(args[1]);
    double ld = in.length();
    double l = ld / 1024 / 1024;
    if (l <= ((9 * 1024) / 1024 / 1024)) {
        copysm(in, out);
    } else if (l <= 9) {
        copymd(in, out);
    } else if (l <= 99) {
        copylg(in, out);
    } else {
        copyxl(in, out);
    }
    System.out.println();
}

}

Сравнение размера файла ....:
ИсточникФайл: "Dragon Ball Episode 84.mp4" ..... размер файла: 8,59,93,580 байт
Файл назначения: "sample.mp4" ..... Размер файла: 8,70,31,808 байт

Команда, используемая для запуска программы

Сравнение файлов, использованных и названных в этой задаче

1 Ответ

0 голосов
/ 29 мая 2018

Это в значительной степени будет делать то, что вы делаете сейчас, но копировать только то, что было прочитано, а не все содержимое буфера.По сути, основным отличием является использование FileOutputStream.write(byte[], offset, len) вместо FileOutputStream.write(byte[]).

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.DecimalFormat;

/**
* mcopy
*/
public class mcopy {
    private static DecimalFormat format = new DecimalFormat("#.#");
    private final static int SMALL = 512;
    private final static int MEDIUM = 512 * 1024;
    private final static int LARGE = 1024 * 1024;
    private final static int XLARGE = 2 * 1024 * 1024;


    private static void copy(File a, File b, byte[] buffer) {
        FileInputStream fin = null;
        FileOutputStream fout = null;

        try {
            double j = 0;
            double length = a.length();
            fin = new FileInputStream(a);
            fout = new FileOutputStream(b);

            int i;
            while(-1 != (i = fin.read(buffer))) {
                j += i;
                fout.write(buffer, 0, i);
                System.out.print("Copying... " + format.format(((j / length) * 100)) + " " + a.getName() + " to "
                    + b.getPath() + " buffer: " + buffer.length + " \r");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                fin.close();
                fout.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        File in = new File(args[0]);
        File out = new File(args[1]);
        double ld = in.length();
        double l = ld / 1024 / 1024;

        byte[] buffer = null;

        if (l <= ((9 * 1024) / 1024 / 1024)) {
            buffer = new byte[SMALL];
        } else if (l <= 9) {
            buffer = new byte[MEDIUM];
        } else if (l <= 99) {
            buffer = new byte[LARGE];
        } else {
            buffer = new byte[XLARGE];
        }
        copy(in, out, buffer);
        System.out.println();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...