file - 如何逐行读取可能不是有效 UTF-8 的文件?

标签 file rust vector utf-8

我有一个非常大的文件,应该由 JSON 字符串组成。但是,当我使用以下代码时,我收到“流不包含有效的 UTF8”。

let file = File::open("foo.txt")?;
let reader = BufReader::new(file);

for line in reader.lines() {
    println!("{}", line?);
}

Ok(())

现在的答案是使用 Vec<u8>而不是String 。但我见过的所有代码都有 file.read_to_end(buf)作为答案,它不适用于我必须使用的文件大小。

我正在寻找的是逐行读取文件,使用有损 utf8 转换,然后进行一些计算并将输出推送到另一个文件。

最佳答案

您可以使用BufReader的read_until功能。它与 File 的 read_to_end 非常相似,但也采用字节分隔符参数。该分隔符可以是任何字节,换行符 \n 字节适合您。之后,您可以将缓冲区从 UTF-8 进行有损转换。它看起来像这样:

let file = File::open("foo.txt")?;
let mut reader = BufReader::new(file);
let mut buf = vec![];

while let Ok(_) = reader.read_until(b'\n', &mut buf) {
    if buf.is_empty() {
        break;
    }
    let line = String::from_utf8_lossy(&buf);
    println!("{}", line);
    buf.clear();
}

Ok(())

当然,这可以抽象为迭代器,就像 Lines 一样。完成了,但是基本逻辑和上面是一样的。

注意:与 lines 函数不同,生成的字符串将包含换行符和回车符 (\r)(如果有)。如果解决方案的行为必须与 lines 函数相匹配,则需要去掉这些字符。

关于file - 如何逐行读取可能不是有效 UTF-8 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62721880/

相关文章:

Java:如何读取字体文件的属性?

rust - 为什么 cargo build 不能提供丰富多彩的错误信息?

rust - 为什么 Rust 在引用可变变量时重新声明可变性?

java - 两个 3D vector 之间的角度

java - 如何在 Java 中将线从光栅转换为 vector ?

c++ - 在 stdout 上格式化 vector 字符串

java - 如何从 Apache 的 UploadedFile 类中获取 java.io.File?

c++ - 我们如何将 SECURITY_ATTRIBUTES 与 SHCreateDirectoryEx() 一起使用?

python - 带套接字的 TCP 客户端/服务器、服务器向客户端发送文件、客户端挂起、Python

rust - 为什么 `std::mem::drop` 与高级特征边界中的闭包 |_|() 不完全相同?