java - 修改并 return 一个 buffredInputStream

java - modify and return a buffredInputStream

我有一个从 FileInputStream 对象获得的 BufferedInputStream,例如:

BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)

现在,我想从 buffredInputStream 中删除字符 {}(我知道文件中有这些字符)。 我以为我可以像 string replace 那样轻松地做到这一点,但我发现没有简单的方法可以使用 BufferedInputStream 来做到这一点。

任何想法如何替换 BufferedInputStream 中的那些特定字符和 return 新修改的 BufferedInputStream?

编辑: 最后我想决定一个文件的字符集。虽然字符 {} 给我带来了一些问题,所以我想在决定文件的字符集之前删除它们。这表明我正在尝试确定字符集:

static String detectCharset(File file) {
    try (FileInputStream fileInputStream = new FileInputStream(file);
             BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) {
        CharsetDetector charsetDetector=new CharsetDetector();
        charsetDetector.setText(bufferedInputStream);
        charsetDetector.enableInputFilter(true);
        CharsetMatch cm=charsetDetector.detect();
        return cm.getName();
    } catch (Exception e) {
        return null;
    }
}

注意:添加注释以回应您对问题所做的编辑:除非您知道编码,否则您无法真正从一袋字节中过滤},因此,如果您想过滤掉 } 以猜测编码,那么您处于先有鸡还是先有蛋的情况。不过,我不明白删除 { 和 } 如何以某种方式帮助字符集编码检测器。这听起来像是检测器有问题,或者您误解了它在做什么。如果必须,请重写您的大脑,将其视为 'removing byte 123 and 125 from an inputstream' 而不是 'remove chars { and } from an inputstream',并且您更接近可行的工作定义。同样的原则适用,除了你会用几乎相同的方法写一个 FilterInputStream 而不是 FilterReader,除了 123125 而不是 '{''}'.

-- 原答案--

[1] InputStream 指的是字节,Reader 是相同的概念,除了字符。说:"filter all { from an inputstream" 没有意义。说 "filter all occurrences of byte '123' from an inputstream" 是有道理的。如果它是 UTF-8 或 ASCII,这两个是等价的,但不能保证,而且它不是任何形式的 'nice' 代码。要以文本形式读取文件,方法如下:

import java.nio.file.*;

Path p = Paths.get("/path/to/file");
try (BufferedReader br = Files.newBufferedReader(p)) {
    // operate on the reader here
}

请注意,与大多数 java 方法不同,Files 中的方法假定 UTF_8。您可以显式指定编码 (Files.newBufferedReader(p, [ENCODING HERE]))。您永远不应该依赖系统默认编码是正确的;除非您知道文件是用什么文本编码编写的,否则您无法将文件作为文本读取!

如果必须使用旧的API:

try (FileInputStream fis = new FileInputStream("/path/to/file");
     InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
     BufferedReader br = new BufferedReader(isr)) {
}

请注意,您必须在此处指定字符集,否则事情会以微妙的方式中断。

[2] 过滤掉某些字符,您可以这样做 'inline'(在从 reader 读取字符的代码中),这是微不足道的,或者您可以创建一个包装器可以做到的流。类似于:

class RemoveBracesReader extends java.io.FilterReader {
    public RemoveBracesReader(Reader in) {
        super(in);
    }

    public int read() throws java.io.IOException {
        while (true) {
            int c = in.read();
            if (c != '{' && c != '}') return c;
        }
    }
}