異なるオフセットでファイルにデータを書き込みたい。たとえば、0番目の位置、(size / 2)番目の位置、(size / 4)番目の位置など。sizeは、作成されるファイルのファイルサイズを表します。これは、別のファイルパーツを作成して結合しなくても可能ですか?
3 に答える
RandomAccessFileを使用して、ファイル内の好きな場所に書き込むことができますseek
。適切な場所に移動して、書き込みを開始するために使用するだけです。
ただし、これはそれらの場所にバイトを挿入しません-単にそれらを上書きします(または、もちろん、現在のファイル長の終わりを超えて書き込んでいる場合は、最後にデータを追加します)。それがあなたが望むものであるかどうかは明らかではありません。
あなたが探しているのは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);
}
これが巨大なファイルでない場合は、すべてを読み取って配列を編集することができます。
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);
]
次に、それをファイルに書き戻します(または、古いファイルを削除して、バイト配列を同じ名前の新しいファイルに書き込みます)