将特定行写入文件

时间:2011-01-15 13:02:43

标签: java java-api file-io

我正在尝试将行写入行位置n的文件中。

即使行n不存在。在这种情况下,文件必须用空行增长才能达到n。基本上类似于writer.writeLine(n, mycontent)。 mycontent是来自ObjectOutputStream的二进制表示。该文件的每一行都包含一个序列化对象。行号是索引。

如何写入特定行? - 不使用FileUtils或任何非标准API组件。

This answer几乎总结了我想要的东西 - 但是写作似乎表现得与众不同。

编辑:由于评论

,我澄清了我的问题

3 个答案:

答案 0 :(得分:2)

这不起作用,因为每个序列化对象可能包含一个或多个换行符作为其二进制表示的一部分。因此,如果您在第3行编写一个新对象,您可能会在第一个对象的二进制表示中间写入该对象。 测试一下:

public class OOSTest {
    public static void main(String[] args) throws IOException {
        String s = "Hello\nWorld";
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(s);
        oos.flush();
        oos.close();
        System.out.println(new String(bos.toByteArray()));
    }
}
恕我直言,你有三个选择:

  1. 选择一个可以处理二进制数据的协议(例如:对于每个对象,将其长度(以字节为单位)写为整数(4个字节),然后是对象本身的字节;
  2. 使用Base64将序列化字节编码为字符串,并在对象之间使用不属于编码的分隔符;
  3. 使用ObjectOutputStream序列化对象数组。编写一个新条目将包括反序列化数组,确保它具有正确的大小或将其复制到适当大小的新数组,将对象插入其位置,并重新序列化整个数组。

答案 1 :(得分:2)

线的概念对你来说非常重要吗?否则,您可能会在文件中序列化Map,并使用它在特定索引处写入或读取对象(在这种情况下,索引将是映射的关键字)。

这是一个小例子。

    public static void main(String[] args) throws Exception {
    ObjectOutputStream tocStream = new ObjectOutputStream(new FileOutputStream("myfile.toc"));
    Map<Integer,Object> tableOfContent = new HashMap<Integer, Object>();
    String myString = "dataOne";
    Date myDate = new Date();
    tableOfContent.put(0,myDate);
    tableOfContent.put(1,myString);
    tocStream.writeObject(tableOfContent);
    tocStream.flush();
    tocStream.close();
    ObjectInputStream tocInputStream = new ObjectInputStream(new FileInputStream("myfile.toc"));
    Map<Integer,Object> restoredTableOfContent = (Map<Integer, Object>) tocInputStream.readObject();
    Object restoredMyString  =  restoredTableOfContent.get(1);
    System.out.println(restoredMyString);
    tocInputStream.close();
}

答案 2 :(得分:0)

  • 循环浏览文件 当前价值。
  • 写出每个值 到一个新的临时文件。
  • 如果是旧文件 在您的行号保持之前结束 写出空白行。
  • 然后一次 你得到你想要的行号 更新写出新数据。
  • 如果旧的线路更多 文件继续写。
  • 删除旧的 文件。重命名临时文件。