Каналы замедляют чтение?

У меня сложилось впечатление, что использование FileChannel и BytBuffer ускорит время чтения, но, похоже, оно значительно медленнее, чем чтение из файлового потока. Я что-то здесь не так делаю?

FileInputStream fis = new FileInputStream("C:\\Users\\blah\\Desktop\\del\\pg28054.txt");
        FileOutputStream fos = new FileOutputStream("C:\\Users\\blah\\Desktop\\del\\readme.txt");

        FileChannel fcin = fis.getChannel();
        FileChannel fcout = fos.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(1024);
        long startTime = System.currentTimeMillis();
        long endtime = System.currentTimeMillis();
        while(true){
            buffer.clear();
            int r = fcin.read(buffer);
            if(r==-1){
                break;
            }
            buffer.flip();
            fcout.write(buffer);
        }
        endtime = System.currentTimeMillis();
        System.out.println("time to read and write(ms) " + (endtime - startTime));

Вышеприведенное завершается за 108 мс, где приведенная ниже реализация делает это за 43 мс

        long startTime;
        long endtime;
        FileInputStream fis1 = new FileInputStream("C:\\Users\\blah\\Desktop\\del\\pg28054.txt");
        FileOutputStream fos1 = new FileOutputStream("C:\\Users\\blah\\Desktop\\del\\readme1.txt");

        byte b[] = null;

        startTime = System.currentTimeMillis();
        while(true){
            b = new byte[1024];
            int r = fis1.read(b);
            if(r==-1){
                break;
            }
            fos1.write(b);
        }

        endtime = System.currentTimeMillis();
        System.out.println("time to read and write(ms) " + (endtime - startTime));

1 ответ

Решение

Помимо очень точных комментариев о качестве вашего теста, в каналах и байтовых буферах нет ничего, что по своей природе быстрее, чем потоки. Есть варианты, которые могут заставить вещи работать быстрее. Например, вы можете использовать метод FileChannel.transferFrom для передачи содержимого. Другим примером может быть использование прямого ByteBuffer передать контент.

Другие вопросы по тегам