0
zip 파일을 만들고 싶습니다. 파일에 내 보낸 Preferences
및 Serializable
개체가 포함됩니다. 하지만 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();
}
}
}
에서 그들을 읽는하지 않는 :
writeObject()
에서, 누락 된 것입니다. "Object"만 변경하고 zip 아카이브의 다른 파일은 변경하지 마십시오. – user902691
@ user902691 당신은 zip 파일에 객체를 쓰는'writeFile()'을 호출하고, 그런 다음 환경 설정을 한 다음 zip 파일에서 객체를 읽고 기본 설정을 읽는'readFile()'을 호출합니다. 그런 다음 다른 객체를 우편 번호에 씁니다 (기존 파일을 덮어 씀으로써)하지만 환경 설정은 쓰지 않는'writeObject()'를 호출합니다. 이것이 취향을 놓친 이유입니다. –
확인. 그러나 아카이브에 파일을 추가하면 zip에 다른 파일이 손실되지 않습니다. – user902691