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