Блок перехвата ObjectInputStream создает исключение EOFException?

Извините, что перетаскиваю это, но я хорошо осмотрелся и все еще получаю исключение EOFException. Я прокомментировал все из моего метода, кроме:

    File receivedFileObject;
    File newFile = new File("newlyWrittenFile.mp3");


    try{
        Socket socket = new Socket(SERVER_IP, PORT);

        try{
        ObjectInputStream incommingData = new ObjectInputStream(socket.getInputStream());

Все, что я пытаюсь сделать, это передать файл, txt или mp3 с сервера клиенту - я даже не пытаюсь вызвать readObject() на ObjectInputStream и все равно получаю EOFException? Как мне добраться до конца файла, который я не пытался прочитать? На самом деле мне жаль, что я не пытался прочитать текстовый файл построчно, потому что я прекрасно знаю, как это сделать. Я просто хочу получить объект, передать его в файл и записать в файловую систему, но по какой-то причине мой блок catch:

        } catch (IOException e){
            System.out.println("Incomming data assignment error : " + e);   
        }

распечатывает:

Ошибка назначения входящих данных: java.io.EOFException

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

        if (myFile.exists()) {
        ObjectOutputStream oos=new ObjectOutputStream(client.getOutputStream());

        oos.writeObject(myFile);
    }

Я был бы очень признателен, если бы кто-нибудь мог объяснить, как исправить то, что кажется глупой ошибкой с моей стороны - Заранее спасибо!


person James C    schedule 09.08.2012    source источник
comment
Где код, в котором вы пишете в ObjectOutputStream?   -  person Jon Lin    schedule 09.08.2012


Ответы (2)


ObjectOutputStream используется для сериализации объекта Java в поток. Вряд ли вы захотите это сделать.

Если вы хотите "передать файл", это, вероятно, означает, что вы хотите "передать содержимое файла", так что просто к этому:

FileOutputStream newFile = new FileOutputStream("newlyWrittenFile.mp3");
InputStream input = socket.getInputStream();
byte[] bytes = // pseudo code for reading all bytes from input
newFile.write(bytes); // pseudo code for writing to file
newFile.close();

Вы можете найти методы класса IOUtils библиотеки apache common-io, которые очень удобны для чтения и записи ваших данных.

person Bohemian♦    schedule 09.08.2012
comment
Спасибо за этот ответ, но моя конечная цель - на самом деле передавать mp3 по сети, а не ждать загрузки целых файлов. Правильно ли я говорю, что поток — это правильная технология для использования, просто у меня нет большого опыта, и я очень хочу добиться цели. - person James C; 09.08.2012
comment
Да, используйте поток, но не используйте ObjectOutputStream. В Интернете должно быть 1000 примеров отправки байтов через сокет - просто используйте Google. По сути, вы захотите перекачать FileInputStream в OutputStream сокета. IOUtils Apache тоже может это сделать. - person Bohemian♦; 09.08.2012

Если вы проверите javadoc от ObjectInputStream:

Заголовок потока сериализации считывается из потока и проверяется.

Таким образом, создание объекта вызывает чтение.

person assylias    schedule 09.08.2012
comment
А, я вижу, это интересно. Итак, что я могу сделать, чтобы он не генерировал исключение? Как я могу, так сказать, положить что-нибудь в трубу, чтобы этого не произошло? - person James C; 09.08.2012