将多个对象写入和读取到文件 [英] Write and read multiple objects to file
问题描述
我正在为 android 设计一个手写应用程序.
I am designing an handwriting application for android.
我想在用户每次按下回车按钮时将信息(class LogInfo
)写入日志文件.
I would like to write information (class LogInfo
) into a log file, every time the user presses the enter button.
之后,我想读取存储的信息.
After that, I would like to read the stored information.
这是我的类的一部分,具有自定义写入方法:
public class LogInfo implements Serializable {
private static final long serialVersionUID = -5777674941129067422L;
public static List<Point[][]> strokes;
public static List<byte[]> codes;
// Only write and read methods shown
private void writeObject(ObjectOutputStream stream) throws IOException
{
stream.defaultWriteObject();
stream.writeInt(strokes.size());
Point[][] pointsArray = null;
for (int i = 0; i < strokes.size(); i++)
{
pointsArray = ((Point[][])strokes.get(i));
stream.writeInt(pointsArray.length);
for (int j = 0; j < pointsArray.length; j++)
{
stream.writeInt(pointsArray[j].length);
for (int k = 0; k < pointsArray[j].length; k++)
{
stream.writeInt(pointsArray[j][k].x);
stream.writeInt(pointsArray[j][k].y);
//stream.writeObject(elementData[i]);
}
}
}
int size = codes.size();
stream.writeInt(size);
for (int i = 0; i < size; i++)
{
stream.write(codes.get(i));
}
}
这是读取方法:
private void readObject(java.io.ObjectInputStream stream)
{
stream.defaultReadObject();
int strokesSize = stream.readInt();
for (int i = 0; i < strokesSize; i++)
{
int arrayXSize = stream.readInt();
Point[][] points = new Point[arrayXSize][];
for (int j = 0; j < arrayXSize; j++)
{
int arrayYSize = stream.readInt();
points[j] = new Point[arrayYSize];
for (int k = 0; k < arrayYSize; k++)
points[j][k] = new Point(stream.readInt(), stream.readInt());
}
strokes.add(points);
}
int codesSize = stream.readInt();
for (int i = 0; i < codesSize; i++)
{
byte[] buffer = new byte[3];
stream.read(buffer, 0, 3);
codes.add(buffer);
}
}
当我只在文件中保存一个对象时,它运行良好.当我尝试保存更多时,读取不起作用(它抛出 StreamCorruptedException
).它在while循环中只读取一个对象!
It works well when I save only one object in the file. When I try to save more, reading is not working (it throws a StreamCorruptedException
). It reads only one object in the while loop!
在主类中,我只使用了两个简单的方法:
In the main class, I just use two simple methods:
// WRITE TO FILE
logInfo.writeLog();
// READ FROM FILE
ArrayList<LogInfo> logInfoArrayList = logInfo.readLog();
定义为:
public void writeLog()
{
File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath(), "data.log");
FileOutputStream fos;
try {
fos = new FileOutputStream(file, true);
//fos = openFileOutput(Environment.getExternalStorageDirectory().getAbsolutePath() + "/data.log", Context.MODE_APPEND);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ArrayList<LogInfo> readLog()
{
ArrayList<LogInfo> logInfoArray = new ArrayList<LogInfo>();
try{
File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath(), "data.log");
FileInputStream fis = new FileInputStream(file);
ObjectInputStream reader = new ObjectInputStream(fis);
LogInfo tempLogInfo = new LogInfo();
while((tempLogInfo = (LogInfo)reader.readObject()) != null)
logInfoArray.add(tempLogInfo);
reader.close();
} catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return logInfoArray;
}
请求更新:
//We use this class to not write a header in a file that already exist
class MyObjectOutputStream extends ObjectOutputStream {
public MyObjectOutputStream(OutputStream os) throws IOException {
super(os);
}
@Override
protected void writeStreamHeader() {}
}
推荐答案
您不能附加到使用
ObjectOutputStream
创建的现有文件,至少不是不费吹灰之力.关于扩展ObjectOutputStream
和覆盖writeStreamHeader()
方法的某处有一个技巧,以免第二次写入流标头,但我不赞成它.你真的应该重写整个文件,也许作为一个列表.
You can't append to an existing file created with an
ObjectOutputStream
, at least not without effort. There is a trick somewhere about extendingObjectOutputStream
and overriding thewriteStreamHeader()
method so as not to write the stream header the second time, but I'm not in favour of it. You should really rewrite the whole file, maybe as a List.
您不需要所有这些代码.只需使 strokes
和 codes
非静态和非瞬态,并去掉 readObject()
和 writeObject()
方法.
You don't need all this code. Just make strokes
and codes
non-static and non-transient, and get rid of the readObject()
and writeObject()
methods altogether.
这篇关于将多个对象写入和读取到文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!