2014-01-11 6 views
0
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.OutputStream; 

public class Main 
{ 
    static ObjectOutputStream outputStream; 
    static ObjectInputStream inputStream; 

    public static void main(String[] args) throws Exception 
    { 
     File file = new File("Test.ser"); 
     outputStream = openWriteFile(file); 
     write(new Integer(5)); 
     write(new Integer(3)); 
     write(new Integer(1)); 

     FileInputStream fileInputStream = new FileInputStream(file); 
     inputStream = openReadFile(fileInputStream); 
     readFile(); 
    } 

    public static ObjectOutputStream openWriteFile(File file) 
    { 
     try 
     { 
      if (file.exists()) 
       return new AppendableObjectOutputStream(new FileOutputStream(file, true)); 

      return new ObjectOutputStream(new FileOutputStream(file)); 
     } 

     catch (IOException e) 
     { 
      return null; 
     } 
    } 

    public static void write(Integer i) 
    { 
     try 
     { 
      outputStream.write(i); 
     } 

     catch (IOException ioException) 
     { 
      System.err.println("error"); 
     } 
    } 

    public static ObjectInputStream openReadFile(FileInputStream fileInputStream) 
    { 
     try 
     { 
      if(fileInputStream.getChannel().position() != 0) 
       return new ObjectInputStream(fileInputStream); 
      return new AppendableObjectInputStream(fileInputStream); 
     } 

     catch (IOException ioException) 
     { 
      return null; 
     } 
    } 

    public static void readFile() 
    { 
     try 
     { 
      while (true) 
      { 
       System.out.println("here"); 
       Integer integer = (Integer) inputStream.readObject(); 
       System.out.println("after"); 
       System.out.println(integer); 
      } 
     } 

     catch (ClassNotFoundException classNotFoundException) 
     { 
      classNotFoundException.printStackTrace(); 
     } 

     catch (IOException e) 
     { 
      System.err.println("ioexecption"); 
      e.printStackTrace(); 
     } 
    } 


    private static class AppendableObjectOutputStream extends ObjectOutputStream 
    { 

     public AppendableObjectOutputStream(OutputStream out) throws IOException 
     { 
      super(out); 
     } 

     @Override 
     protected void writeStreamHeader() throws IOException 
     { 
      // do not write a header 
     } 
    } 

    private static class AppendableObjectInputStream extends ObjectInputStream 
    { 

     public AppendableObjectInputStream(InputStream in) throws IOException 
     { 
      super(in); 
     } 

     @Override 
     protected void readStreamHeader() throws IOException 
     { 
      // do not read a header 
     } 
    } 
} 

출력에 추가 :읽기와 문제 및 ObjectInputStream에/ObjectOutputStream에

here 
ioexecption 
java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at Main.readFile(Main.java:79) 
    at Main.main(Main.java:25) 

난에 쓴하는 .ser 파일에서 다시 읽는 몇 가지 문제가 있어요. 두 번 프로그램을 실행하고 getClass()을 사용하고 두 스트림 모두 스트림 버전이 Appendable 인 것으로 나타났습니다. "here"메시지는 "after"가 아닌 콘솔에 인쇄됩니다. "Test.ser"는 classpath과 같은 디렉토리에 나타나며 내용 "íí"을 포함합니다.

+0

stacktrace와 println ("here") 다음에 나오는 예외에 대한 세부 정보를 볼 수 있도록 코드를 수정 한 다음 질문에 stacktrace를 추가하십시오. – chairbender

답변

0

입력 및 출력을 처리 할 때 대칭을 찾아야합니다. 한쪽에 바이트를 쓰면 다른 쪽의 바이트를 읽습니다. 한쪽에 물건을 쓰면 다른 쪽 물건을 읽습니다.

코드는 3 바이트를 쓰고 개체를 읽으려고합니다. 그건 안돼.

또한 추가 가능한 스트림으로 달성하려는 것을 이해하지 못합니다.

+0

필자는 객체를 작성하고 기존 파일에 새 객체를 추가하고 다시 읽어야하므로 더 작은 프로그램에서 객체를 테스트하려고했습니다. 정수형을 정수형으로 변환하면 같은 방식으로 작동 할 것이라고 생각 했습니까? – stumped

+0

readObject()를 사용하여 읽는 경우 writeObject()를 사용하여 작성해야합니다. write()에 대한 javadoc을 읽으십시오 : writeObject()와 같은 일을하지 않습니다. –

+0

감사! readObject()로 변경하고 AccountRecord라는 클래스에서 객체를 읽고 작성했지만 여전히 동일한 오류가 발생합니다. – stumped

관련 문제