你有以下方法:
public static void writeToBinary(Object obj, String filename)
{
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(filename));
oos.writeObject(obj);
} catch (Exception e) {
e.printStackTrace();
} finally{
try{
if (oos != null) oos.close ();
}catch (Exception e){
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,该方法将对象写入二进制文件.
但是现在您想要重写相同的方法以允许将对象附加到同一文件.
好的,你看一下java文档,你会发现你必须在FileOutputStream中添加一个值为true的参数:
oos = new ObjectOutputStream(new FileOutputStream(filename, true));
Run Code Online (Sandbox Code Playgroud)
你编译但是,哎呀!似乎它继续覆盖文件.
好吧,问题就开始了.在google中搜索后,您会发现必须使用SAME ObjectOutputStream将对象附加到同一文件中.你希望有一个函数,每次调用它时,它都会追加一个对象.即:
writeToBinary("a", filename);
writeToBinary("b", filename);
Run Code Online (Sandbox Code Playgroud)
但正如我之前所说,你必须使用相同的ObjectOutputStream.
解决方案1:
ObjectOutputStream out = getOutputStream (filename);
writeToBinary("a", out);
writeToBinary("b", out);
writeToBinary("c", out);
out.close ();
Run Code Online (Sandbox Code Playgroud)
这非常难看,因为我想隐藏流的使用.
还有其他解决方案吗?
编辑:该方法是静态的.它位于实用程序类中,其中所有方法都是静态的.
编辑2:解决了!附加到ObjectOutputStream.请参阅我的问题的已接受答案.谢谢.
解决了.
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class Test{
private static String filename = "test";
public static void main(String[] args) {
writeToBinary (filename, "a", true);
writeToBinary (filename, "b", true);
writeToBinary (filename, "c", true);
readFromBinaryFile (filename);
}
public static void writeToBinary (String filename, Object obj, boolean append){
File file = new File (filename);
ObjectOutputStream out = null;
try{
if (!file.exists () || !append) out = new ObjectOutputStream (new FileOutputStream (filename));
else out = new AppendableObjectOutputStream (new FileOutputStream (filename, append));
out.writeObject(obj);
out.flush ();
}catch (Exception e){
e.printStackTrace ();
}finally{
try{
if (out != null) out.close ();
}catch (Exception e){
e.printStackTrace ();
}
}
}
public static void readFromBinaryFile (String filename){
File file = new File (filename);
if (file.exists ()){
ObjectInputStream ois = null;
try{
ois = new ObjectInputStream (new FileInputStream (filename));
while (true){
String s = (String)ois.readObject ();
System.out.println (s);
}
}catch (EOFException e){
}catch (Exception e){
e.printStackTrace ();
}finally{
try{
if (ois != null) ois.close();
}catch (IOException e){
e.printStackTrace ();
}
}
}
}
private static class AppendableObjectOutputStream extends ObjectOutputStream {
public AppendableObjectOutputStream(OutputStream out) throws IOException {
super(out);
}
@Override
protected void writeStreamHeader() throws IOException {}
}
}
Run Code Online (Sandbox Code Playgroud)