当前位置: 首页 > 面试题库 >

写入和读取多个对象到文件

苏宜人
2023-03-14
问题内容

我正在为Android设计一个手写应用程序。

class LogInfo每当用户按下Enter键时,我都希望将信息()写入日志文件。

之后,我想读取存储的信息。

这是我的类的一部分,带有自定义的write方法:

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() {}
}

问题答案:
  1. 您不能附加到使用创建的现有文件中ObjectOutputStream,至少要费劲。关于扩展ObjectOutputStream和覆盖该writeStreamHeader()方法有一个技巧,以便不要第二次写入流头,但是我不赞成这样做。您应该真正重写整个文件,也许将其重写为列表。

  2. 您不需要所有这些代码。只需make strokescodesnon-static和non-transient,就完全摆脱readObject()writeObject()方法。



 类似资料:
  • 问题内容: 我将多个对象写入文件,然后在代码的另一部分中检索它们。我的代码没有错误,但是无法正常工作。您能帮我发现我的代码有什么问题吗?我从不同的网站阅读了不同的代码,但是没有一个对我有用! 这是将对象写入文件的代码:MyClassList是一个数组列表,其中包含我的类的对象(必须将其写入文件)。 我向输出流的构造函数添加了“ true”,因为我想将每个对象都添加到文件的末尾。那是对的吗? 这是我

  • 我正在编写一个非常简单的程序GUI程序来模拟手机。“手机”有四个主要按钮:电话、通讯录、信息和应用程序。我编写了所有的GUI,在使用Contact类时遇到了一个问题,它是整个程序的主干! Contact类非常简单,它有两个String类型的实例变量,分别是“name”和“number”。我想构建一个Contact类型的ArrayList,允许添加联系人,然后创建方法来附加到序列化文件并从中读取。

  • null 如果我的理解有误,请指正。还有以下问题: 我的理解是,Hadoop中的文件读/写没有任何并行性,它所能执行的最佳操作与传统的文件读或写(即,如果复制设置为1)+分布式通信机制中涉及的一些开销是一样的。 并行性仅在数据处理阶段通过Map Reduce提供,而不是在客户端读/写文件期间提供。

  • 问题内容: 我试图逐行读取文件,然后使用Node.js将其输出到另一个文件。 我的问题是由于Node.js的异步特性,行的顺序有时会混乱。 例如,我的输入文件就像:第1行第2行第3行 但是输出文件可能像:第1行第3行第2行 下面是我的代码。 任何想法将不胜感激,谢谢。 问题答案: 如果要编写同步代码,请仅使用同步功能: 对于异步方法,您可以编写类似

  • 我正在做一个项目,我希望用户能够将对象输入到ArrayList中,关闭程序,并能够再次打开程序,并且用户可以访问以前的ArrayList(从第一次运行开始)。 我目前将用户输入对象放入ArrayList中,该列表序列化ArrayList并将其保存为。bin文件。当我再次运行该程序时,上一个列表将被保存,但当我输入新值时,它将覆盖旧列表。我想我正在寻找一种方法来查看我的.bin文件是否存在,如果存在

  • 问题内容: 我在文件中有以下JSON : 如何使用PHP 添加到文件中? 这是我到目前为止的内容: 这给了我一个致命错误:无法在此行上将stdClass类型的对象用作数组: 我正在使用PHP5.2。有什么想法吗?谢谢! 问题答案: 错误消息中的线索是-如果您查看文档以了解它可能需要第二个参数,该参数控制返回数组还是对象-它默认为object。 因此,将您的通话更改为 并且它将返回一个关联数组,您的