Java NIO. Эффективное решение для моделирования базового приложения для загрузки или нет? - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь смоделировать простое приложение загрузки, скопировав файл типа myBook.txt и сохранив его как newBook.txt в том же пакете Java.

Мне удалось заставить его работать на моей рабочей станции, но как мне заставить его работать на другой? Путь, который я предоставляю, будет отличаться до тех пор, пока не будет указано имя проекта, например "SimpleDownloadCentre\\..."

private final String SOURCE_PATH = "C:\\Users\\...\\Documents\\NetBeansProjects\\"
            + "SimepleDownloadCentre\\src\\simpledownloadcentre\\"
            + "myBook.txt";

private final String DESTINATION_PATH = "C:\\Users\\...\\Documents\\NetBeansProjects\\"
            + "SimepleDownloadCentre\\src\\simpledownloadcentre\\"
            + "newBook.txt";

public void startDownload() {
        FileInputStream fis = null;
        try {
            String destination = DESTINATION_PATH;
            String source = SOURCE_PATH;

            fis = new FileInputStream(source);
            FileOutputStream fos = new FileOutputStream(destination);

            FileChannel fci = fis.getChannel();
            FileChannel fco = fos.getChannel();

            ByteBuffer buffer = ByteBuffer.allocate(1024);

            while (true) {
                try {
                    int read = fci.read(buffer);
                    if (read == -1) {
                        break;
                    }
                    buffer.flip();

                    fco.write(buffer);

                    buffer.clear();
                } catch (IOException ex) {
                    System.err.println("ERROR: unable to read block");
                }
            }
        } catch (FileNotFoundException ex) {
            System.err.println("ERROR: file not found");
        } finally {
            try {
                fis.close();
            } catch (IOException ex) {
                System.err.println("ERROR: unable to close file channel");
            }
        }
    }

Является ли Java NIO неправильным подходом к решению, которое мне нужно?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

NIO не является проблемой, хотя это не поможет намного больше, чем использование IO.

Я бы сделал следующее:

  • Используйте больший буфер, например, 32 КБ.
  • Использовать прямой буфер (в данном случае он быстрее, чем с использованием кучи)
  • Использовать соединение Socket для имитации сетевого соединения / соединения для загрузки.может делать все это (кроме прямого буфера), используя обычный ввод-вывод.

    Если вам не нужны сокеты и вы просто хотите передавать данные, я бы использовал TransferTo / TransferFrom для выполнения копирования.

    В итоге: использование NIO не является плохой или хорошей идеей.

0 голосов
/ 01 марта 2012

Ваш цикл копирования неверен. Он может потерять данные, если write () не записывает весь буфер. Следует читать следующим образом:

while ((read = in.read(buffer)) >= 0 || buffer.position() > 0)
{
  buffer.flip();
  out.write(buffer);
  buffer.compact();
}
...