首页 > 解决方案 > java - 修改并返回一个buffredInputStream

问题描述

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

BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)

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

任何想法如何从 BufferedInputStream 替换那些特定字符并返回新修改的 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;
    }
}

标签: javafile-iostreambuffer

解决方案


注意:添加注释以响应您对问题所做的编辑:除非您知道编码,否则您无法真正从字节袋中过滤 },因此如果您想过滤 } 以猜测编码您'处于先有鸡还是先有蛋的境地。不过,我不明白删除 { 和 } 如何以某种方式帮助字符集编码检测器。这听起来像是探测器有问题,或者你误解了它在做什么。如果必须,请重写您的大脑,将其视为“从输入流中删除字节 123 和 125”,而不是“从输入流中删除字符 { 和 }”,这样您就更接近于可行的工作定义。同样的原则也适用,除了你用几乎相同的方法编写 aFilterInputStream而不是 a ,FilterReader123125'{''}'

——原始答案——

[1]InputStream指的是字节,Reader是同一个概念,除了,对于字符。说:“从输入流中过滤所有{”是没有意义的。说“从输入流中过滤所有出现的字节'123'”是有道理的。如果是 UTF-8 或 ASCII,这两者是等价的,但不能保证,它在任何方面都不是“好”的代码。要将文件作为文本读取,方法如下:

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] 要过滤掉某些字符,您可以“内联”(在从阅读器读取字符的代码中)执行此操作,这很简单,或者您可以创建一个可以执行此操作的包装流。就像是:

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;
        }
    }
}

推荐阅读