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
,除了 123
和 125
而不是 '{'
和'}'
.
-- 原答案--
[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;
}
}
}
我有一个从 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
,除了 123
和 125
而不是 '{'
和'}'
.
-- 原答案--
[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;
}
}
}