我希望以不同的偏移量将数据写入文件。例如,在第 0 位置、第 (size/2) 位置、第 (size/4) 位置等。 size 表示要创建的文件的文件大小。如果不创建不同的文件部分并加入它们,这是否可能?
3 回答
好吧,您可以使用RandomAccessFile写入文件中您喜欢的任何位置- 只需使用seek
它到达正确的位置,然后开始写入。
但是,这不会在这些位置插入字节 - 它只会覆盖它们(当然,如果您正在写入超过当前文件长度的末尾,则在末尾添加数据)。目前尚不清楚这是否是您想要的。
您正在寻找的是Random access files
. 来自官方的 sun java 教程网站-
随机访问文件允许对文件内容进行非顺序或随机访问。要随机访问文件,您需要打开文件,寻找特定位置,然后读取或写入该文件。
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);
}
如果这不是一个大文件,您可以阅读整个内容,然后编辑数组:
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);
]
然后将其写回文件(或者只是删除旧的并将字节数组写入具有相同名称的新文件)