我正在为Android设计一个手写应用程序。
每次用户按下回车键时,我都想将信息(class LogInfo
)写入日志文件。
之后,我想阅读存储的信息。
这是我的课程的一部分,带有自定义写入方法:
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循环中的一个对象!
在主类中,我只使用两种简单的方法:
// 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() {}
}
答案 0 :(得分:5)
您无法附加到使用ObjectOutputStream
创建的现有文件,至少不会毫不费力。有一个关于扩展ObjectOutputStream
和覆盖writeStreamHeader()
方法的技巧,以便不第二次写入流标题,但我并不赞成它。你应该真的重写整个文件,可能是一个List。
您不需要所有这些代码。只需将strokes
和codes
设置为非静态和非瞬态,并完全取消readObject()
和writeObject()
方法。
答案 1 :(得分:0)
@EJP是right.it无法附加到使用ObjectOutputStream创建的现有文件。您可以执行以下步骤来修复它: 1.保持ObjectOutputStream对象引用 2.在调用writeObject()之后,不要调用close() 3.提供一个关闭ObjectOutputStream的方法。
答案 2 :(得分:0)
有一种方法可以将多个对象保存在一个文件中:首先应该创建一个
对象数组(Object [] objects
)然后将您的对象作为Object逐个放入此数组中,然后使用writeObject(objects)
方法编写此数组。
祝你好运。