我希望将数据写入不同偏移量的文件。例如,在第0个位置,在(第(2)个位置,在(第(4)个位置等处)大小表示要创建的文件的文件大小。这可能不创建不同的文件部分并加入它们吗?
答案 0 :(得分:6)
您可以使用RandomAccessFile在文件中随意写信 - 只需使用seek
即可到达正确的位置,然后开始写作。
但是,这不会在那些地方插入字节 - 它只会覆盖它们(或者如果你写的是结尾的话,最后添加数据)当然是当前的文件长度)。目前尚不清楚这是否是你想要的。
答案 1 :(得分:0)
您要找的是Random access files
。来自official sun java tutorial site -
随机访问文件允许对a的非顺序或随机访问 文件的内容。要随机访问文件,请打开文件,查找 特定位置,读取或写入该文件。
使用SeekableByteChannel界面可以实现此功能。 SeekableByteChannel接口使用概念扩展了通道I / O. 当前的位置。方法使您可以设置或查询 位置,然后您可以从中读取数据或将数据写入, 那个位置。 API由一些易于使用的方法组成:
position - 返回通道的当前位置
position(long) - 设置通道的位置
read(ByteBuffer) - 从通道
读取缓冲区中的字节 write(ByteBuffer) - 将缓冲区中的字节写入通道
truncate(long) - 截断连接到通道的文件(或其他实体)
和一个例子,在那里提供 -
String s = "I was here!\n";
byte data[] = s.getBytes();
ByteBuffer out = ByteBuffer.wrap(data);
ByteBuffer copy = ByteBuffer.allocate(12);
try (FileChannel fc = (FileChannel.open(file, READ, WRITE))) {
// Read the first 12
// bytes of the file.
int nread;
do {
nread = fc.read(copy);
} while (nread != -1 && copy.hasRemaining());
// Write "I was here!" at the beginning of the file.
// See how they are moving back to the beginning of the
// file?
fc.position(0);
while (out.hasRemaining())
fc.write(out);
out.rewind();
// Move to the end of the file. Copy the first 12 bytes to
// the end of the file. Then write "I was here!" again.
long length = fc.size();
// Now see here. They are going to the end of the file.
fc.position(length-1);
copy.flip();
while (copy.hasRemaining())
fc.write(copy);
while (out.hasRemaining())
fc.write(out);
} catch (IOException x) {
System.out.println("I/O Exception: " + x);
}
答案 2 :(得分:0)
如果这不是一个巨大的文件,你可以阅读整个文件而不是编辑数组:
public String read(String fileName){
BufferedReader br = new BufferedReader(new FileReader(fileName));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append("\n");
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
}
public String edit(String fileContent, Byte b, int offset){
Byte[] bytes = fileContent.getBytes();
bytes[offset] = b;
return new String(bytes);
]
然后将其写回文件(或者只删除旧文件并将字节数组写入具有相同名称的新文件)