gpt4 book ai didi

java - 如何防止 MappedByteBuffer put 在文件末尾写入空字符?

转载 作者:行者123 更新时间:2023-12-02 01:10:03 24 4
gpt4 key购买 nike

我正在使用具有固定缓冲区大小的 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 put 在文件末尾写入空字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com