我正在使用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复制了您看到的内容,并显示了隐藏的字符,然后使用以下代码重新进行了编码,尾随的null消失了。关键更改是跟踪实际写入的字节数,然后将文件截断为该长度。
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在文件末尾写入空字符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59537674/