Простая реализация улилиты dd(побайтовое копирование файла)

 
 
 
Сообщения:7
Вот попробовал реализовать побайтовое копирование файла.

import java.io.*;

public class dd {
    public static void main(String[] args) throws IOException {
        FileInputStream fin = new FileInputStream(new File(args[0]));
        FileOutputStream fout = new FileOutputStream(new File(args[1]));

        int b;

        while ((b = fin.read()) != -1) fout.write(b);

        fin.close();
        fout.close();
    }
}
 
 
Сообщения:1240
Пожелания.
1. Всегда, когда есть возможность, надо использовать родительский класс. Это позволяет в будущем гораздо проще переделывать программу. В данном случае, надо использовать InputStream/OutputStream по виду:
        InputStream is = new FileInputStream(f1);
        OutputStream os = new FileOutputStream(f2, false);

2. Перед закрытием выходных потоков надо вызывать .flush(). Так же его рекомендуется вызывать, когда выложена часть данных, и их надо отправить, скажем при работе с сетями.
3. Побайтовые потоки рекомендуется оборачивать в BufferedInputStream/BufferedOutputStream. См. как ускоряет скорость работы программы простое оборачивание:
import java.io.*;
import java.util.Locale;

public class CopyFile {
    // копируем байт за байтом
    private static long getByteCopyTime(File f1, File f2) throws IOException {

        long s1, s2;
        s1 = System.nanoTime();
        FileInputStream is = new FileInputStream(f1);
        FileOutputStream os = new FileOutputStream(f2, false);

        int b;

        while ((b = is.read()) != -1) os.write(b);

        is.close();
        os.close();
        s2 = System.nanoTime();
        return s2 - s1;
    }
    // копируем через буфер
    private static long getBufferedCopyTime(File f1, File f2) throws IOException {
        long s1, s2;
        int b;
        s1 = System.nanoTime();
        InputStream  is = new BufferedInputStream(new FileInputStream(f1));
        OutputStream os = new BufferedOutputStream(new FileOutputStream(f2, false));

        while ((b = is.read()) != -1) os.write(b);

        is.close();
        os.flush();
        os.close();
        s2 = System.nanoTime();
        return s2 - s1;
    }

    public static void main(String[] args) throws IOException {
        File f1 = new File("1.bb");
        // создаем и заполняем файл
        new RandomAccessFile(f1, "rw").setLength(5000000L);
        File f2 = new File("2.bb");
        // замер времени копируя байт за байтом
        long byteCopyTime = getByteCopyTime(f1, f2);
        System.out.println("Byte per byte copy " + String.format(Locale.US, "%,d", byteCopyTime) + " ns");

        // delete

        f2.delete();

        // замер времени копируя через буффер
        long bufferedCopyTime = getBufferedCopyTime(f1, f2);
        System.out.println("Buffered copy time " + String.format(Locale.US, "%,d", bufferedCopyTime) + " ns");

        System.out.println("Buffered copy time are " +
                String.format(Locale.US, "%.3f",  byteCopyTime / ((double) bufferedCopyTime)) + " times faster");
        f1.delete();
        f2.delete();
    }
}



На моем компьютере ускорение составило 217 раз (2161%!)
Изменен:19 дек 2016 08:22
 
 
Сообщения:505
Поскольку InputStream и OutputStream реализуют Closeable и AutoCloseable, можно использовать try-with-resources. Ну, и эксепшены можно не выбрасывать из main, а обрабатывать и выводить что-то user readable. Имхо )

Don't think you are. Know you are.
 
 
Сообщения:1240
cssru:
Поскольку InputStream и OutputStream реализуют Closeable и AutoCloseable, можно использовать try-with-resources. Ну, и эксепшены можно не выбрасывать из main, а обрабатывать и выводить что-то user readable. Имхо )


Вы правы, однако когда я давал комментарий, я преследовал только цель показать наличие BufferedReader/-Writer, о которых мало кто знает.
 
 
Сообщения:505
Так я ж не в укор вашему посту. Я ж в дополнение ;)

Don't think you are. Know you are.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет