当前位置: 首页 > 编程笔记 >

InputStreamReader和BufferedReader用法及实例讲解

尉迟子民
2023-03-14
本文向大家介绍InputStreamReader和BufferedReader用法及实例讲解,包括了InputStreamReader和BufferedReader用法及实例讲解的使用技巧和注意事项,需要的朋友参考一下

一、BufferedReader类

. 所属类库:

         java.lang.Object 

              java.io.Reader 

                         java.io.BufferedReader

. 基本概念 :

           public class BufferedReader    extends Reader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值足够大。

通常, Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader (如 FileReader 和 InputStreamReader )。

BufferedReader 流能够读取文本行 , 通过向 BufferedReader 传递一个 Reader 对象 , 来创建一个 BufferedReader 对象 , 之所以这样做是因为 FileReader 没有提供读取文本行的功能 .

. Demo :

通过 Bufferedreader 捕获所输入的语句 :

import java.io.*;
class BufferedReaderDemo{
 public static void main(String[] args)throws IOException { 
  BufferedReader bufferedReader =new BufferedReader(
    new InputStreamReader(System.in));
  System.out.print("请输入一系列文字,可包括空格:"); 
  String text =bufferedReader.readLine(); 
  System.out.println("请输入文字:"+text);
 } 
}

注解:

throws IOException   抛出异常

InputStreamReader 是字节流通向字符流的桥梁

二、InputStreamReader类

InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。

构造方法 : 

    InputStreamReader isr = new InputStreamReader(InputStream in);//构造一个默认编码集的InputStreamReader类
    InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);//构造一个指定编码集的

InputStreamReader类。  

   参数 in对象通过 InputStream in = System.in;获得。//读取键盘上的数据。 

    或者 InputStream in = new FileInputStream(String fileName);//读取文件中的数据。可以看出 FileInputStream 为InputStream的子类。

主要方法 :int read();//读取单个字符。 

                 int read(char []cbuf);//将读取到的字符存到数组中。返回读取的字符数。

. Demo :

import java.io.*;
class InputStreamReaderDemo {
 public static void transReadNoBuf() throws IOException {
  /**
   * 没有缓冲区,只能使用read()方法。
   */
  //读取字节流
  //InputStream in = System.in;//读取键盘的输入。
  InputStream in = new FileInputStream("D:\\demo.txt");//读取文件的数据。
  //将字节流向字符流的转换。要启用从字节到字符的有效转换,
  //可以提前从底层流读取更多的字节.
  InputStreamReader isr = new InputStreamReader(in);//读取
  //综合到一句。
  //InputStreamReader isr = new InputStreamReader(
  //new FileInputStream("D:\\demo.txt"));
  char []cha = new char[1024];
  int len = isr.read(cha);
  System.out.println(new String(cha,0,len));
  isr.close();
 }
 public static void transReadByBuf() throws IOException {
  /**
   * 使用缓冲区 可以使用缓冲区对象的 read() 和 readLine()方法。
   */
  //读取字节流
  //InputStream in = System.in;//读取键盘上的数据
  InputStream in = new FileInputStream("D:\\demo.txt");//读取文件上的数据。
  //将字节流向字符流的转换。
  InputStreamReader isr = new InputStreamReader(in);//读取
  //创建字符流缓冲区
  BufferedReader bufr = new BufferedReader(isr);//缓冲
  //BufferedReader bufr = new BufferedReader(
  //new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以综合到一句。
   /*int ch =0;
  ch = bufr.read();
  System.out.println((char)ch);
  */
  String line;
  while((line = bufr.readLine())!=null){
   System.out.println(line);
  }
  isr.close();
 }
}

三、InputStreamReader、BufferedReader真实案例(非编码集)

import java.io.*;
class UtilResource {
 private void initializeResource() {
  try {
   //读取文件,并且以utf-8的形式写出去
   BufferedReader bufread;
   String read;
   bufread = new BufferedReader(new InputStreamReader(ResourceHelper
     .getResourceInputStream("pinyin.txt")));
   while ((read = bufread.readLine()) != null) {
    System.out.println(read);
   }
   bufread.close();
  } catch (FileNotFoundException ex) {
   ex.printStackTrace();
  } catch (IOException ex) {
   ex.printStackTrace();
  }
 }
}

注:其中 pinyin.txt 放于项目的根目录下

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
class ResourceHelper {
 /**
  * @param resourceName
  * @return 
  * @return 
  */
 static BufferedInputStream getResourceInputStream(String resourceName) {
  try {
   return new BufferedInputStream(new FileInputStream(resourceName));
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
 }
}

总结:

InputStreamReader 类

是字节流通向字符流的桥梁,封裝了InputStream在里头, 它以较高级的方式,一次读取一个一个字符,以文本格式输入 / 输出,可以指定编码格式;

BufferedReader 类

BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取一个文本行,从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。

ps:InputStream、InputStreamReader和Reader的关系

InputStream:得到的是字节输入流,InputStream.read("filename")之后,得到字节流

Reader:读取的是字符流

InputStreamReader:从字节到字符的桥梁。InputStreamReader(InputStream.read("filename"));

reader.read(InputStreamReader(InputStream in));便可从字节变为字符,打印显示了。

java.io.Reader 和 java.io.InputStream 组成了Java 输入类。

Reader 用于读入16位字符,也就是Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。

Reader支持16位的Unicode字符输出,InputStream支持8位的字符输出。

Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,1byte = 8bits  InputStream、OutputStream是用来处理8位元的流,Reader、Writer是用来处理16位元的流。

而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。

值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配和由OutputStream到Writer的适配。

在 Java中,有不同类型的 Reader 输入流对应于不同的数据源:

FileReader 用于从文件输入; CharArrayReader 用于从程序中的字符数组输入; StringReader 用于从程序中的字符串输入; PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。

相应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。

另外,还有两种没有对应 Reader 类型的 InputStream 输入流: Socket 用于套接字; URLConnection 用于 URL 连接。 这两个类使用 getInputStream() 来读取数据。

相应的,java.io.Writer 和 java.io.OutputStream 也有类似的区别。

 关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:

  byte[] b = new byte[count];
 int readCount = 0; // 已经成功读取的字节的个数
 while (readCount < count) {
  readCount += in.read(bytes, readCount, count - readCount);
 }

      用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)

 类似资料:
  • 关于已回答的问题:Java BufferedReader,将InputStream转换为BufferedReader,Java的BufferedReader和InputStreamReader类之间有什么区别? BufferedReader[BR]和InputStreamReader[ISR]都实现了相同的接口。BR拥有ISR拥有的所有方法以及其他方法,包括非常有用的readLine()方法和不那

  • 问题内容: Java 和类之间有什么区别? 问题答案: BufferedReader是“ InputStreamReader / FileReader”的包装,它在每次调用本机I / O时都缓冲信息。 您可以想象在读取一个字符(或字节)与读取一个大号时的效率差异。一圈(或字节)中的字符数。使用BufferedReader,如果您希望读取单个字符,它将存储内容以填充其缓冲区(如果为空),并且对于进一

  • 我不明白InputStream、InputStreamReader和BufferedReader到底是做什么的。它们都有一个read()方法,对于BufferedReader,还有readLine()。为什么我不能只使用InputStream或者只添加inputStreamReader呢?为什么我需要添加BufferedReader?我知道这与效率有关,但我不明白怎么做。 我一直在研究Buffer

  • 计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两

  • 本文向大家介绍java封装实例用法讲解,包括了java封装实例用法讲解的使用技巧和注意事项,需要的朋友参考一下 我们可以选择把类的方法、属性装起来,便于日后的程序书写和使用,这种处理方法就是封装的思想。因为封装类之后,其他的外部类方法就不能在混入其中,对代码的安全性进行了提高。接下来我们就对java中封装的概念、目的进行介绍,然后在实例中为大家演示封装的方法。 1.概念 封装性是面向对象三大特征之

  • 本文向大家介绍Android  CardView详解及使用方法和实例,包括了Android  CardView详解及使用方法和实例的使用技巧和注意事项,需要的朋友参考一下 Android  CardView详解 Android5.0中向我们介绍了一个全新的控件–CardView,从本质上看,可以将CardView看做是FrameLayout在自身之上添加了圆角和阴影效果。请注意:CardView被