在这个简短的Java IO教程中,学习如何将Reader转换为InputStream,同时将InputStream转换为Reader。
注意,Reader是用来读取字符的,而InputStream是用来读取原始字节的。两者都是为不同的目的而设计的,所以要注意你在应用中如何使用它们。
1.将阅读器转换为InputStream
读取器持有字符数据,通常是一个字符串或字符数组。如果我们可以访问String或char[],那么我们可以直接从它那里获得InputStream。
try(InputStream inputStream = new ByteArrayInputStream(
content.getBytes(StandardCharsets.UTF_8))){
//Use InputStream
}
如果我们引用了一个现有的Reader,那么我们可以使用以下技术来获得InputStream。
1.1.Reader -> byte[] -> InputStream
我们首先从Reader获取内容到byte[]。使用*BufferedReader以获得更好的性能。然后我们使用byte[]来创建一个InputStream*。
这个转换过程可以用很多方法和不同的库来实现。例如,让我们从本地的IO APIs开始。
try(Reader reader = new BufferedReader(
new StringReader(content))){
char[] charBuffer = new char[8 * 1024];
int numCharsRead;
while ((numCharsRead = reader.read(charBuffer, 0,
charBuffer.length)) != -1) {
builder.append(charBuffer, 0, numCharsRead);
}
}
try(InputStream inputStream = new ByteArrayInputStream(
builder.toString().getBytes(StandardCharsets.UTF_8))){
//Use InputStream
}
同样的,我们可以使用Common IO的IOUtils.toString(reader) 类来将内容从Reader读成String。
String content = "Hello world";
try(Reader reader = new BufferedReader(new StringReader(content));
InputStream inputStream = IOUtils.toInputStream(IOUtils.toString(reader), Charsets.UTF_8);) {
//Use InputStream
}
我们也可以使用Guava的CharStreams.toString(reader) 类,与前面的解决方案类似。
try(
Reader reader = new BufferedReader(new StringReader(content));
InputStream inputStream = new ByteArrayInputStream(
CharStreams.toString(reader).getBytes(StandardCharsets.UTF_8))){
//Use InputStream
}
1.2.Commons IO的ReaderInputStream
ReaderInputStream是一个InputStream的实现,从Reader中读取字符流。
所有的read()操作都是缓冲的,所以不需要把底层的Reader包裹在一个BufferedReader中。
try(Reader reader = new StringReader("Hello world");
InputStream inputStream = new ReaderInputStream(reader, StandardCharsets.UTF_8);){
//Use inputStream
}
2.将InputStream转换为Reader
Java的InputStreamReader 是专门为此目的而设计的。这个类的作用是作为从字节流到字符流的桥梁。
为了获得最高的效率,可以考虑将一个InputStreamReader包裹在一个BufferedReader中。
InputStream inputStream = new ByteArrayInputStream("Hello world".getBytes());
Reader reader = new BufferedReader(new InputStreamReader(inputStream));
3.总结
在这个Java IO教程中,我们通过简单易懂的例子学习了Reader和InputStream之间的转换。
祝你学习愉快!!