我正在使用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/

10-13 03:43
查看更多