2014-12-14 3 views
0

// При запуске Aamir класс Я получаю эту ошибку.поток закрыт: сообщение об ошибке выполнения

import java.io.Externalizable; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInput; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutput; 
import java.io.ObjectOutputStream; 

public class Aamir { 

    public static void main(String[] args) throws Exception { 


     Externalize(); 
     deExternalize();  
    } 

    public static void Externalize() throws IOException { 


    Person p1 = new Person(); 
    p1.name = "aamir"; 
    p1.age = 22; 
    p1.weight = 60.80; 

    Person p2 = new Person(); 
    p2.name = "zahid"; 
    p2.age = 26; 
    p2.weight = 64.88; 

    FileOutputStream fout = new FileOutputStream("dev.txt"); 
    ObjectOutputStream out = new ObjectOutputStream(fout); 

    p1.writeExternal(out); 
    p2.writeExternal(out); 

    out.flush();   
    out.close(); 
} 

    public static void deExternalize() throws IOException, ClassNotFoundException { 

     FileInputStream fin = new FileInputStream("dev.ser"); 
     ObjectInputStream in = new ObjectInputStream(fin); 

     Person p3 = new Person(); 
     p3.readExternal(in); 

     Person p4 = new Person(); 
     p4.readExternal(in); 
    } 
} 

class Person implements Externalizable { 

    String name; 
    int age; 
    double weight; 

    public void writeExternal(ObjectOutput out) throws IOException { 

    out.writeUTF(name); 
    out.writeInt(age); 
    out.writeDouble(weight); 
    out.flush(); 
    out.close(); 
    } 

    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { 


    name = in.readUTF(); 
    age = in.readInt(); 
    weight = in.readDouble(); 

    System.out.println(name); 
    System.out.println(age); 
    System.out.println(weight); 


} 

}

+0

Ух, какая ошибка? – Marv

+0

Когда возникает ошибка? (номер строки) –

ответ

1

Вы пытаетесь закрыть ObjectOutputStream дважды.

в:

FileOutputStream fout = new FileOutputStream("dev.txt"); 
ObjectOutputStream out = new ObjectOutputStream(fout); 

p1.writeExternal(out); 
p2.writeExternal(out); 

out.flush();   
out.close(); <----- 

и здесь:

public void writeExternal(ObjectOutput out) throws IOException { 

out.writeUTF(name); 
out.writeInt(age); 
out.writeDouble(weight); 
out.flush(); 
out.close(); <----- 

Вы не должны закрывать его в writeExternal.

1

Вы получаете сообщение об ошибке, потому что вы пытаетесь писать в поток после того, как вы закрыли его.

Вам не нужно скрывать или закрывать поток в writeExternal.

1

Вы .close() the stream in .writeExternal(); Тебе не следует.

В контракте Externalizable никогда не говорится, что этот метод должен закрывать поток; что, если класс наследует вас и вызывает super.writeExternal()?

+0

, когда я прокомментировал /*out.flush();out.close()*/, он все еще показывает ту же ошибку. – Aamir

+0

спасибо человеку, теперь он работал. – Aamir

1

Причина, по которой вы получали Исключение времени выполнения - это то, что вы закрываете ресурс ObjectOutputStream, но снова через эту ссылку «out», которую вы пытаетесь написать p2-данными. Итак, вот правильный код

import java.io.Externalizable; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInput; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutput; 
import java.io.ObjectOutputStream; 

class Aamir { 

    public static void main(String[] args) throws Exception { 


     Externalize(); 
     deExternalize();  
    } 

    public static void Externalize() throws IOException { 


    Person p1 = new Person(); 
    p1.name = "aamir"; 
    p1.age = 22; 
    p1.weight = 60.80; 

    Person p2 = new Person(); 
    p2.name = "zahid"; 
    p2.age = 26; 
    p2.weight = 64.88; 

    FileOutputStream fout = new FileOutputStream("dev.txt"); 
    ObjectOutputStream out = new ObjectOutputStream(fout); 

    p1.writeExternal(out); 
    p2.writeExternal(out); 

    out.flush();   
    out.close(); 
} 

    public static void deExternalize() throws IOException, ClassNotFoundException { 

     FileInputStream fin = new FileInputStream("dev.ser"); 
     ObjectInputStream in = new ObjectInputStream(fin); 

     Person p3 = new Person(); 
     p3.readExternal(in); 

     Person p4 = new Person(); 
     p4.readExternal(in); 
    } 
} 

class Person implements Externalizable { 

    String name; 
    int age; 
    double weight; 

    public void writeExternal(ObjectOutput out) throws IOException { 

    out.writeUTF(name); 
    out.writeInt(age); 
    out.writeDouble(weight); 
    // out.flush(); 
    //out.close(); 
    } 

    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { 


    name = in.readUTF(); 
    age = in.readInt(); 
    weight = in.readDouble(); 

    System.out.println(name); 
    System.out.println(age); 
    System.out.println(weight); 


} 
} 
Смежные вопросы