如何防止 MappedByteBuffer put 在文件末尾写入空字符?
How to prevent MappedByteBuffer put from writing null characters at the end of file?
我正在使用 Java 的具有固定缓冲区大小的 MappedByteBuffer 写入文件,作为作业的一部分。它应该逐字符写入,因为缓冲区大小可以小于行长度。但问题是它将文件末尾缓冲区的剩余位置写入为空字符。我怎样才能删除那些空字符?
这是一个示例代码:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class Main {
public static void main(String[] args) throws IOException {
int bufferSize = 20;
RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, bufferSize);
for (char c : "Line1".toCharArray()) {
buffer.put((byte) c);
}
buffer.put((byte)'\n');
for (char c : "Line2".toCharArray()) {
buffer.put((byte) c);
}
}
}
这是输出(使用 Sublime Text utf-8 编码打开):
如 Progman 所述,截断将解决您遇到的问题。我使用 TextWrangler 复制了您看到的内容并显示了隐藏的字符,然后我使用以下代码重做了它,尾随的空值消失了。关键的变化是跟踪实际写入的字节数,然后将文件截断到该长度。
int bufferSize = 20;
int bytesWritten = 0;
RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, bufferSize);
for (char c: "Line1".toCharArray()) {
buffer.put((byte) c);
bytesWritten++;
}
buffer.put((byte)
'\n');
bytesWritten++;
for (char c: "Line2".toCharArray()) {
buffer.put((byte) c);
bytesWritten++;
}
buffer.force(); //make sure all is written before messing with truncating
file.getChannel().truncate(bytesWritten);
我正在使用 Java 的具有固定缓冲区大小的 MappedByteBuffer 写入文件,作为作业的一部分。它应该逐字符写入,因为缓冲区大小可以小于行长度。但问题是它将文件末尾缓冲区的剩余位置写入为空字符。我怎样才能删除那些空字符?
这是一个示例代码:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class Main {
public static void main(String[] args) throws IOException {
int bufferSize = 20;
RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, bufferSize);
for (char c : "Line1".toCharArray()) {
buffer.put((byte) c);
}
buffer.put((byte)'\n');
for (char c : "Line2".toCharArray()) {
buffer.put((byte) c);
}
}
}
这是输出(使用 Sublime Text utf-8 编码打开):
如 Progman 所述,截断将解决您遇到的问题。我使用 TextWrangler 复制了您看到的内容并显示了隐藏的字符,然后我使用以下代码重做了它,尾随的空值消失了。关键的变化是跟踪实际写入的字节数,然后将文件截断到该长度。
int bufferSize = 20;
int bytesWritten = 0;
RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, bufferSize);
for (char c: "Line1".toCharArray()) {
buffer.put((byte) c);
bytesWritten++;
}
buffer.put((byte)
'\n');
bytesWritten++;
for (char c: "Line2".toCharArray()) {
buffer.put((byte) c);
bytesWritten++;
}
buffer.force(); //make sure all is written before messing with truncating
file.getChannel().truncate(bytesWritten);