Java中Reader与InputStream互相转换的方法

1,304 阅读2分钟

在这个简短的Java IO教程中,学习如何Reader转换为InputStream,同时InputStream转换为Reader

注意,Reader是用来读取字符的,而InputStream是用来读取原始字节的。两者都是为不同的目的而设计的,所以要注意你在应用中如何使用它们。

1.将阅读器转换为InputStream

读取器持有字符数据,通常是一个字符串或字符数组。如果我们可以访问Stringchar[],那么我们可以直接从它那里获得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之间的转换

祝你学习愉快!!