【问题标题】:How should I write a POJO representation to a RandomAccessFile?我应该如何将 POJO 表示写入 RandomAccessFile?
【发布时间】:2018-06-18 10:44:55
【问题描述】:

我有一个POJO,其中有许多String 字段。我想将此对象的实例(按自然顺序排序)写入RandomAccessFile,然后最终在此文件中搜索我需要的对象。

问题是我不太确定该怎么做——例如,在纯文本文件中,我会用换行符来分隔一个新的对象实例。对于RandomAccessFile,我是否应该使用对象的大小(以字节为单位)来指示文件中的新对象 - 如果我知道我想要第二个对象,我会在文件中查看 2 个对象的字节数?

我遵循将排序的integers 写入文件的教程 - 如果我想找到第二个匹配项,我会在文件中查找 8 个字节。我应该对我的 POJO 应用相同的逻辑 - 还是可以只使用 new line 进行分隔?

编辑*这些是我的对象的字段:

import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;

/**
 * A RegradeRule is an individual rule found in the Regrade .dat file (one
 * line).
 * 
 * @author E Rowlands
 */
public class RegradeRule implements Serializable,  Comparable<RegradeRule> { 

    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;

    // getters & setters
}

【问题讨论】:

  • 请提供您的 POJO 代码以及到目前为止您尝试过的内容...
  • 现在就这样做。对于“到目前为止我尝试过的”,我只有排序整数示例代码——我在概念上一直被困在如何去做这件事上。
  • 我已经实现了这个例子:geekrai.blogspot.com/2014/09/…

标签: java randomaccessfile


【解决方案1】:

你有几种通用的方法来实现它:

  • 使用固定长度的字符串 - 确定您的字符串有一个特定的最大长度,并用一些未使用的字符(例如零)填充您写入的所有字符串到该长度。如果要允许 Unicode 代码点超过 127,则需要处理字符串的编码。
  • 在文件顶部或单独文件中编写索引 - 在文件顶部添加单独的数据块,以帮助您导航到正确的项目。这种方法很难将文件增长到超过一定限制,因为需要将内容复制或读入内存以进行扩展。
  • 如果您总是一次获得整个文件,请不要使用RandomAccessFile - 这是最简单的实现方法,您会获得一个人工可查看/可编辑的文本文件。这种方法的缺点是您无法在不阅读其余项目的情况下导航到特定项目。

【讨论】:

  • OldCurmudgeon 和您自己都提供了很好的答案 - 由于制定了策略,因此将其标记为官方答案。
【解决方案2】:

将可变长度记录放入随机访问文件有两种主要策略。

  1. 为所有记录选择一个固定的最大长度并乘以该值来定位您想要的字符串。 您将需要选择一个 null 字符来填充每条记录的未使用部分,在读取时将其删除并在写入时将其添加为填充。
  2. 维护每个字符串的开头和长度的索引(在文件中或内存中),并通过该索引传递每个文件访问。 维护文件中的索引可能很棘手,尤其是当您需要添加更多记录时。您可能更喜欢使用第二个文件作为索引,或者每次打开文件时都重新构建它。

各有各的优点。 (1) 不需要索引但可以显着增加文件大小。 (2) 不会增加文件大小,但需要维护索引。

【讨论】:

  • 正是我需要的。谢谢。
【解决方案3】:

您可以为您的 POJO 提供一个单行 csv 格式的 toString() 方法,并始终将其作为单行写入您的随机访问文件。

public class RegradeRule implements Serializable,  Comparable<RegradeRule> { 

    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;
    private String privateData;

    // getters & setters

    @override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(privateData);
        sb.append(";");
        sb.append(privateData);
        sb.append(";");
        // do that until your last String attribute and then the last one without a semicolon
        sb.append(privateData);
        return sb.toString();
    }
}

这样做会编写一个 csv 文件(您可以在其中提供标题行)。

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多