java - 修改并返回一个buffredInputStream。

问题描述 投票:0回答:1

我有一个BufferedInputStream,它是我从一个FileInputStream对象中得到的,比如.BufferedInputStream。

BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)

现在,我想删除这些字符 {} 的buffredInputStream(我知道文件里有这些字符).我想,我可以很容易地做到一些像 string replace 但我看到没有一个简单的方法可以用BufferedInputStream来做。

有什么办法能让我从BufferedInputStream中替换掉那些特定的字符,然后返回新的修改后的BufferedInputStream?

EDIT:最后,我想决定一个文件的字符集。{} 我想在决定一个文件的字符集之前,先把它们删除。

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;
    }
}
java stream buffer
1个回答
1
投票

NB:添加一个注释,以回应你对你的问题所做的编辑。: 除非你知道编码,否则你无法真正从一袋字节中过滤出},所以如果你想过滤出}来猜测编码,你就会陷入鸡飞蛋打的境地。我不明白去掉{和}对字符集编码检测器有什么帮助。这听起来像是检测器出了问题,或者你误解了它的工作。如果你必须这样做,重写你的大脑,把它当作 "从输入流中移除字节123和125",而不是 "从输入流中移除字符{和}",这样你就会接近一个可行的工作定义。同样的原理也适用,只是你要写一个 FilterInputStream 而非 FilterReader 几乎用同样的方法,除了 123125 而不是 '{''}'.

-- -- 原始答案

[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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.