7

我希望以不同的偏移量将数据写入文件。例如,在第 0 位置、第 (size/2) 位置、第 (size/4) 位置等。 size 表示要创建的文件的文件大小。如果不创建不同的文件部分并加入它们,这是否可能?

4

3 回答 3

7

好吧,您可以使用RandomAccessFile写入文件中您喜欢的任何位置- 只需使用seek它到达正确的位置,然后开始写入。

但是,这不会在这些位置插入字节 - 它只会覆盖它们(当然,如果您正在写入超过当前文件长度的末尾,则在末尾添加数据)。目前尚不清楚这是否是您想要的。

于 2013-03-27T07:04:20.710 回答
0

您正在寻找的是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);
}
于 2013-03-27T07:08:28.993 回答
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);
]

然后将其写回文件(或者只是删除旧的并将字节数组写入具有相同名称的新文件)

于 2013-03-27T07:13:13.030 回答