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)

(0)

相关推荐

  • javascript结合fileReader 实现上传图片

    关于File API这里就不详细解释了,小伙伴们自行度娘吧,来我们就要利用文件句柄来读取文件内容,这是通过FileReader来实现的,通过FileReader接口,我们可以异步地将文件内容加载到内存中,赋予某个js变量. 复制代码 代码如下: function getImgSrc(target, callback) {     if (window.FileReader) {         var oPreviewImg = null, oFReader = new window.FileR

  • 解析Java的InputStream类并借助其读取ppt文件

    1. 关于InputStream.read()      在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节. 2. 关于InputStream类的available()方法     要一次读取多个字节时,经常用到InputSt

  • 谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法

    发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"upload",其它的不做任何处理: <form method="POST" action="upload" enctype="multipart/form-data"> 名字 <input type="text&q

  • 基于C#中XmlReader读取Xml的深入分析

    XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存,而在有些场景下我们必须考虑尽可能节省内存.这时候就该XmlReader和XmlWriter出场了.XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false.如下读取Xml内容实例代码和注释说明 复制代码 代码如下: using System; using Sys

  • File, FileReader 和 Ajax 文件上传实例分析(php)

    File FileReader 可以干什么? Ajax文件上传例子 FileReader 对象可以读取文件的 Base64编码数据(readAsDataURL),2进制字符串(readAsBinaryString),文本(readAsText)并且都是异步的. 对了,Email拖拽附件上传就可以利用 FileReader 配合 Ajax 完成. File 对象 File对象可以从 input[type=file].files 数组,和拖拽事件 event.dataTransfer.files 中

  • c#中executereader执行查询示例分享

    ExecuteReader执行查询实例 ExecuteReader方法存在的目的只有一个:尽可能快地对数据库进行查询并得到结果.ExecuteReader 返回一个DataReader对象:如果在SqlCommand对象中调用,则返回SqlDataReader:如果在OleDbCommand对象中调用,返回的是OleDbDataReader.可以调用DataReader的方法和属性迭代处理结果集.它是一个快速枚举数据库查询结果的机制,是只读.只进的.对SqlDataReader.Read的每次调

  • Android 数据存储之 FileInputStream 工具类及FileInputStream类的使用

    安卓的三种本地的典型数据存储方式 SharedPreferences 以文件格式保存在本地存储中 SQL数据库 这篇文章就是讲解一下如何使用 SharedPreferences 保存文件.主要解释什么都写在注释里面的. IDE : Android Studio 参考文章:http://www.jb51.net/article/74215.htm 絮叨一下:本来文件操作这一块上周就想把其弄懂,然后继续进一步的学习.但是因为官方的 Android Training 之中的概念太过于繁杂.导致我认为存

  • 解析StreamReader与文件乱码问题的解决方法

    相信很多人在读取文件的时候都会碰到乱码的情况,所谓乱码就是错乱的编码的意思,造成乱码的是由于编码不一致导致的. 演示程序: 新建3个文本文件: 编码和名字一样,分别是ansi,Unicode,utf8 里面的内容都是: ~!@#¥%--&*() abcdefg 123456789 测试数据 读取这些文件的代码如下: public static void Main() { List<string> lstFilePath = new List<string>() { &quo

  • InputStreamReader 和FileReader的区别及InputStream和Reader的区别

    首先给大家介绍InputStreamReader 和FileReader的区别,具体内容如下所示: InputStreamReader 和 BufferedReader .其中最重要的类是 InputStreamReader ,它是字节转换为字符的桥梁. 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等. FileReader 与 InputStreamReader 涉及编码转换 ( 指定编码方式或者采用 os 默认编码 ) ,可能在不同的平台上出

  • InputStreamReader和BufferedReader用法及实例讲解

    一.BufferedReader类 . 所属类库: java.lang.Object java.io.Reader java.io.BufferedReader . 基本概念 : public class BufferedReader    extends Reader 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值足够大. 通常, Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取

  • php之header的不同用法总结(实例讲解)

    1.header()函数的作用是:发送一个原始 HTTP 标头[Http Header]到客户端. header(string,replace,http_response_code) /*string:必需.规定要发送的报头字符串. replace:可选.指示该报头是否替换之前的报头,或添加第二个报头. 默认是 true(替换).false(允许相同类型的多个报头). http_response_code:可选.把 HTTP 响应代码强制为指定的值.*/ 注意:必须在任何实际的输出被发送之前调用

  • PHP join()函数用法与实例讲解

    PHP join() 函数 实例 把数组元素组合为一个字符串: <?php $arr = array('Hello','World!','Beautiful','Day!'); echo join(" ",$arr); ?> 定义和用法 join()函数返回一个由数组元素组合成的字符串. join() 函数是 implode() 函数的别名. 注释: join() 函数接受两种参数顺序.但是由于历史原因,explode() 是不行的,您必须保证 separator 参数在

  • PHP htmlspecialchars()函数用法与实例讲解

    PHP htmlspecialchars() 函数 实例 把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体: <?php $str = "This is some <b>bold</b> text."; echo htmlspecialchars($str); ?> 上面代码的 HTML 输出如下(查看源代码): <!DOCTYPE html> <html

  • PHP中ltrim()函数的用法与实例讲解

    PHP ltrim() 函数 实例 移除字符串左侧的字符: <?php $str = "Hello World!"; echo $str . "<br>"; echo ltrim($str,"Hello"); ?> 定义和用法 ltrim()函数移除字符串左侧的空白字符或其他预定义字符. 相关函数: rtrim() - 移除字符串右侧的空白字符或其他预定义字符. trim() - 移除字符串两侧的空白字符或其他预定义字符.

  • Java的RxJava库操作符的用法及实例讲解

    操作符就是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件.RxJava提供了很多很有用的操作符. 比如map操作符,就是用来把把一个事件转换为另一个事件的. Observable.just("Hello, world!") .map(new Func1<String, String>() { @Override public String call(String s) { r

  • 易语言多项选择用法及实例讲解

    最近发现个好玩的易语言命令啊...相当于几个如果真 就是多项选择这个命令...看下多项选择的说明 调用格式:〈通用型〉 多项选择 (整数型 索引值,通用型 待选择项数据,... ) - 系统核心支持库->其他 英文名称:choose 从参数列表项目中选择并返回一个值.本命令为初级命令.命令参数表中最后一个参数可以被重复添加. 参数<1>的名称为"索引值",类型为"整数型(int)".命令会根据本索引值来返回选择项列表中的某个值.如果索引值是 1,则

  • 基于多线程中join()的用法实例讲解

    Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行. public class TestThread5 { public static void main(String[] args) throws InterruptedException { Runner0 run5 = new Runner0(); Thread th5 = new Thread(run5); th5.start(); th5.join();//join()方法用在此处是为了等待主线程结束后运

  • 实例讲解JS中setTimeout()的用法

    本文实例讲解了JS中setTimeout()的用法,分享给大家供大家参考,具体内容如下 效果图: 具体代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script type="text/javascript"&

  • Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)

    在这之前,我已经分享过组件与组件的通信机制以及父子组件之间的通信机制,而我们的vuex就是为了解决组件通信问题的 vuex是什么东东呢? 组件通信的本质其实就是在组件之间传递数据或组件的状态(这里将数据和状态统称为状态),但可以看到如果我们通过最基本的方式来进行通信,一旦需要管理的状态多了,代码就会变得十分臃肿和庞大.对所有状态的管理便会显得力不从心,因此,vuex出现了,他就是帮助我们把公用的状态全抽出来放在vuex的容器中,然后根据一定的规则来进行管理,我们赶紧来用一下吧,想要掌握vuex的

随机推荐