java - 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;
}
}
解决方案
注意:添加注释以响应您对问题所做的编辑:除非您知道编码,否则您无法真正从字节袋中过滤 },因此如果您想过滤 } 以猜测编码您'处于先有鸡还是先有蛋的境地。不过,我不明白删除 { 和 } 如何以某种方式帮助字符集编码检测器。这听起来像是探测器有问题,或者你误解了它在做什么。如果必须,请重写您的大脑,将其视为“从输入流中删除字节 123 和 125”,而不是“从输入流中删除字符 { 和 }”,这样您就更接近于可行的工作定义。同样的原则也适用,除了你用几乎相同的方法编写 aFilterInputStream
而不是 a ,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;
}
}
}
推荐阅读
- linux - 使用 Certbot 的证书在 docker 容器中设置 MongoDB
- swift - 如何使用带有可变数据的贝塞尔曲线绘制半圆?
- java - 无法编译值文件android studio
- java - 如何在实例方法中从抽象类中创建新实例?
- html - Bootstrap-保证金问题
- php - 如何告诉变量是 PHP 中类函数的特定自定义类型
- r - 如何在 RMarkdown 中将表号添加到编码为图像的表中?
- reactjs - 如何使用 Auth0-react SDK 处理深度链接
- python - Discord py 检测反应
- typescript - 如何使用 Typescript 在 Vue 3 中获取输入的“已检查”状态