7

異なるオフセットでファイルにデータを書き込みたい。たとえば、0番目の位置、(size / 2)番目の位置、(size / 4)番目の位置など。sizeは、作成されるファイルのファイルサイズを表します。これは、別のファイルパーツを作成して結合しなくても可能ですか?

4

3 に答える 3

7

RandomAccessFileを使用して、ファイル内の好きな場所に書き込むことができますseek。適切な場所に移動して、書き込みを開始するために使用するだけです。

ただし、これはそれらの場所にバイトを挿入しません-単にそれらを上書きします(または、もちろん、現在のファイル長の終わりを超えて書き込んでいる場合は、最後にデータを追加します)。それがあなたが望むものであるかどうかは明らかではありません。

于 2013-03-27T07:04:20.710 に答える
0

あなたが探しているのはRandom access filesです。公式のsunjavaチュートリアルサイトから-

ランダムアクセスファイルは、ファイルの内容への非順次またはランダムアクセスを許可します。ファイルにランダムにアクセスするには、ファイルを開き、特定の場所を探し、そのファイルの読み取りまたは書き込みを行います。

この機能は、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 に答える