2012-07-23 3 views
0

zip 파일을 만들고 싶습니다. 파일에 내 보낸 PreferencesSerializable 개체가 포함됩니다. 하지만 zip 보관 파일에서 개체를 대체하려고하면 저장된 기본 설정이 사라집니다. 어떻게이 문제를 해결할 수 있습니까?ZipOutputStream의 파일 바꾸기

import java.io.BufferedOutputStream; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.prefs.BackingStoreException; 
import java.util.prefs.InvalidPreferencesFormatException; 
import java.util.prefs.Preferences; 
import java.util.zip.Deflater; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 
import java.util.zip.ZipOutputStream; 

public class ToZip { 

    /** 
    * @param args 
    */ 
    static Preferences exportPrefs = Preferences 
      .userNodeForPackage(ToZip.class); 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     exportPrefs.put("Val", "MyVal"); 

     writeFile(); 
     readFile(); 
     System.out.println("Value:" + exportPrefs.get("Val", "")); 

     // And Try replace object 
     writeObject(); 
     readObject(); 
    } 

    private static void writeFile() { 

     String str = "ABCD"; 

     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream("/home/user/profile.prof"); 
      BufferedOutputStream boS = new BufferedOutputStream(fos); 
      ZipOutputStream zoS = new ZipOutputStream(boS); 
      ObjectOutputStream ooS = null; 

      zoS.setMethod(ZipOutputStream.DEFLATED); 
      zoS.setLevel(Deflater.BEST_COMPRESSION); 

      zoS.putNextEntry(new ZipEntry("Object")); 

      ooS = new ObjectOutputStream(zoS); 
      ooS.writeObject(str); 

      zoS.putNextEntry(new ZipEntry("Profile")); 
      exportPrefs.exportSubtree(zoS); 

      try { 
       ooS.close(); 
      } catch (NullPointerException ex) { 
      } 

      zoS.close(); 
      fos.close(); 
      boS.close(); 
     } catch (FileNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (BackingStoreException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

    } 

    private static void readFile() { 

     FileInputStream fiN; 
     try { 
      fiN = new FileInputStream("/home/user/profile.prof"); 
      ZipInputStream ziS = new ZipInputStream(fiN); 

      ziS.getNextEntry(); 

      ObjectInputStream oiS = new ObjectInputStream(ziS); 
      System.out.println("Read String " + oiS.readObject()); 

      ziS.getNextEntry(); 

      exportPrefs.importPreferences(ziS); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvalidPreferencesFormatException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    private static void writeObject() {// replace serialize object 

     String str2 = "XYZ"; 

     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream("/home/user/profile.prof"); 
      BufferedOutputStream boS = new BufferedOutputStream(fos); 
      ZipOutputStream zoS = new ZipOutputStream(boS); 
      ObjectOutputStream ooS = null; 

      zoS.setMethod(ZipOutputStream.DEFLATED); 
      zoS.setLevel(Deflater.BEST_COMPRESSION); 

      zoS.putNextEntry(new ZipEntry("Object")); 

      ooS = new ObjectOutputStream(zoS); 
      ooS.writeObject(str2); 

      try { 
       ooS.close(); 
      } catch (NullPointerException ex) { 
      } 

      zoS.close(); 
      fos.close(); 
      boS.close(); 
     } catch (FileNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

    } 

    private static void readObject() { 

     FileInputStream fiN; 
     try { 
      fiN = new FileInputStream("/home/user/profile.prof"); 
      ZipInputStream ziS = new ZipInputStream(fiN); 
      ziS.getNextEntry(); 

      ObjectInputStream oiS = new ObjectInputStream(ziS); 
      System.out.println("Read String " + oiS.readObject()); 

      oiS.close(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

답변

1

당신은 당신의 writeObject()에서 환경 설정을 수출하거나 당신의 readObject() 방법에서 그들을 읽는 것 같지 않습니다.

 exportPrefs.exportSubtree(zoS); 

을 그리고 당신은 당신은 내 이해하지 못하는 당신의 readObject()

 exportPrefs.importPreferences(ziS); 
+0

에서 그들을 읽는하지 않는 : writeObject()에서

, 누락 된 것입니다. "Object"만 변경하고 zip 아카이브의 다른 파일은 변경하지 마십시오. – user902691

+0

@ user902691 당신은 zip 파일에 객체를 쓰는'writeFile()'을 호출하고, 그런 다음 환경 설정을 한 다음 zip 파일에서 객체를 읽고 기본 설정을 읽는'readFile()'을 호출합니다. 그런 다음 다른 객체를 우편 번호에 씁니다 (기존 파일을 덮어 씀으로써)하지만 환경 설정은 쓰지 않는'writeObject()'를 호출합니다. 이것이 취향을 놓친 이유입니다. –

+0

확인. 그러나 아카이브에 파일을 추가하면 zip에 다른 파일이 손실되지 않습니다. – user902691