我正在尝试将行写入行位置n的文件中。
即使行n不存在。在这种情况下,文件必须用空行增长才能达到n。基本上类似于writer.writeLine(n, mycontent)
。 mycontent是来自ObjectOutputStream
的二进制表示。该文件的每一行都包含一个序列化对象。行号是索引。
如何写入特定行? - 不使用FileUtils或任何非标准API组件。
This answer几乎总结了我想要的东西 - 但是写作似乎表现得与众不同。
编辑:由于评论
,我澄清了我的问题答案 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 :(得分: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)