SocketChannel и FileChannel.transferFrom/To

Я только что узнал о пакете и каналах java nio, и теперь я попытался написать действительно простую программу передачи файлов с использованием каналов. Моя цель состояла в том, чтобы избавиться от всего этого побайтового чтения. В качестве первой попытки я написал следующий код сервера:

public class Server {
    public static void main(String args[]) throws FileNotFoundException, IOException {
        String destination = "D:\tmp\received"; 
        int port = 9999; 
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(9999)); 
        SocketChannel socketChannel = serverSocketChannel.accept(); 
        FileChannel fileChannel = new FileOutputStream(destination).getChannel();
        fileChannel.transferFrom(socketChannel, 0, 32); 
        socketChannel.close();
        serverSocketChannel.close();
    }
}

и следующий клиентский код:

public class Client {
    public static void main(String args[]) throws FileNotFoundException, IOException {
        String fileName = "D:\\dump\\file";
        InetSocketAddress serverAddress = new InetSocketAddress("localhost", 9999); 
        FileChannel fileChannel = new FileInputStream(fileName).getChannel();
        SocketChannel socketChannel = SocketChannel.open(serverAddress); 
        fileChannel.transferTo(0, fileChannel.size(), socketChannel); 
        socketChannel.close();
        fileChannel.close();
    }
}

для передачи предопределенного 32-байтового файла через предопределенный порт без какой-либо обработки ошибок и прочего.

Эта программа компилируется и запускается без каких-либо ошибок, но в конце файл назначения ("полученный") не записывается.

Можно ли с помощью этой методики передать файл или я что-то не так понял? Можете ли вы сказать мне, что я сделал неправильно в приведенном выше коде? После некоторых исследований я еще не нашел никакого решения, но просто нашел фрагменты кода, которые используют этот побайтовый материал (например: в то время как (есть данные) {прочитайте 32 байта и запишите их в файл}).


person Green    schedule 31.10.2015    source источник
comment
Определение не написано. Файл короткий? Пустой? Созданный?   -  person user207421    schedule 31.10.2015
comment
32-битный файл имеет размер 4 байта, но вы пытаетесь прочитать фиксированные 32 байта независимо от размера файла. Обычно лучше отправлять длину вместе с содержимым, чтобы получатель знал, сколько читать.   -  person Peter Lawrey    schedule 31.10.2015
comment
@EJP не написано, значит, файл не создан. Файл должен быть создан в папке D:\tmp, но после выполнения папка остается пустой.   -  person Green    schedule 01.11.2015
comment
@PeterLawrey Извините, я имел в виду 32 байта. Я знаю, что лучше отправлять длину, но этот тестовый код должен быть как можно меньше. Поэтому я жестко закодировал размер файла. В отправляемом файле я прописал 32 символа ASCII, поэтому его размер 32 байта.   -  person Green    schedule 01.11.2015


Ответы (1)


"D:\tmp\received"

Измените эти обратные косые черты на прямые косые черты. Это либо недопустимое имя файла, которое вызвало бы исключение, которое вы должны были заметить, либо, по крайней мере, это имя файла не совпадает с тем, которое, по вашему мнению, вы пишете.

Вам также необходимо вызывать эти методы передачи в цикле, пока они не передадут все, что вы ожидаете. Вот почему они имеют возвращаемое значение. Проверьте Javadoc.

person user207421    schedule 01.11.2015
comment
Спасибо. Я полностью упустил это из виду. Я заменил их косой чертой, и теперь все работает как положено. Один короткий вопрос: как я могу отметить вопросы как «решенные» в StackOverflow? - person Green; 01.11.2015
comment
Просто примите и/или проголосуйте за ответ, который вы считаете наиболее полезным, если таковой имеется. - person user207421; 01.11.2015