我使用此函数在特定索引中写入一行:
private void write_line(Student s,int index){
try {
Student_pool.seek(0);
Student_pool.seek(index*(25*Integer.SIZE+4*Character.SIZE));
Student_pool.writeChars(s.getId());
Student_pool.writeChars(s.getHw().substring(0,2));
Student_pool.writeChars(".");
Student_pool.writeChars(s.getHw().substring(3,5));
Student_pool.writeChars(s.getPrj().substring(0,2));
Student_pool.writeChars(".");
Student_pool.writeChars(s.getPrj().substring(3,5));
Student_pool.writeChars(s.getMidtermExam().substring(0,2));
Student_pool.writeChars(".");
Student_pool.writeChars(s.getMidtermExam().substring(3,5));
Student_pool.writeChars(s.getFinalExam().substring(0,2));
Student_pool.writeChars(".");
Student_pool.writeChars(s.getFinalExam().substring(3,5));
Student_pool.writeChars("\n");
Student_pool.getFD().sync();
} catch (IOException ex) {
Logger.getLogger(Storagelmpl.class.getName()).log(Level.SEVERE, null, ex);
}
}
但是当我尝试打开文件时,结果不正确,并且每个角色都有一个空格。 结果如下:
8 1 0 1 8 7 3 1 2 2 0 . 0 0 2 0 . 0 0 2 0 . 0 0 2 0 . 0 0
8 1 0 1 8 8 2 7 5 1 6 . 0 0 1 0 . 0 0 1 3 . 0 0 1 9 . 0 0
我认为我的编码存在问题,而我的搜索操作数存在另一个问题。 但我不知道如何解决它。
答案 0 :(得分:3)
它的行为完全符合记录:
writeChars
的文档:
将字符串作为字符序列写入文件。每个字符都写入数据输出流,就像writeChar方法一样。写操作从文件指针的当前位置开始。
writeChar
的文档:
将char作为双字节值写入文件,首先是高字节。写操作从文件指针的当前位置开始。
你真的需要RandomAccessFile
吗?没有使用FileOutputStream
包裹OutputStreamWriter
使用您想要的任何编码的原因?有什么办法可以避免在这样的任意位置写数据吗?
你可以使用writeBytes
代替writeChars
- 这基本上只会写 ISO-8859-1字符 - 这样就足够了为了你?虽然......它不会保留非ISO-8859-1数据。