java基础之IO流(二)之字符流

  字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢?

  字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写文本文件的。

  有的小朋友也会问,字节流称之为万能流,为什么还要设计字符流呢。没错,字节流可以读写任意类型的文件,包括文本文件,对于读取整个文本文件来说,字符流和字节流都可以轻松完成,但是对于某些情况,字节流读取文本文件却相当复杂:

  1)一个读取一个字符。

  2)一次读取文本文件的一行。

  当然这些问题统统是因为不同字符集编码造成的。另外也不难看出,构建一个字符流有一个很重要大家却经常忽略的参数,那就是字符集,由于缺省值的存在,所以字符编码的不指定在多数情况不会出现错误。

  Reader和Writer是字符流的两个顶层抽象类。

  Reader提供了三种读取数据的方法:读入一个字符(返回值为int)、读入一个字符数组,读入一个字符数组的一部分。

  Writer提供了五种写数据的方法:一次写入一个字符(传入int类型)、一次写入一个字符数组、一次写入一个字符数组的一部分、一次写入一个字符串、一次写入一个字符串的一部分。

  1.转换流(InputStreamReader和OutputStreamWriter)

  InputStreamRreader:

  InputStreamReader 是字节流通向字符流的桥梁:其内部维护了一个字节流,它使用底层字节流读取字节并按照指定的编码格式将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

  每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节(因为每个字符由不确定的字节个数组成)

  构造方法:

    InputStreamReader(InputStream in):传入一个字节流,使用默认的字符编码方式(平台默认字符集)

    InputStreamReader(InputStream in, String charsetName):传入指定字符集名称

    InputStreanRreader(InputStream in, Charset cs):传入指定字符集对象

  它的读取数据的方法并没有进行扩展和增加。

  OutputStreamWriter:

  OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。

  每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

  构造方法与InputStreamReader相对应。写数据的方法也没有进行扩展。

  2.FileReader和FileWriter

  这两个流是转换流的简化类(子类),从名字上也可以看出,其针对的是文件系统的文本文件的读取,它使用平台默认字符集,而且既然是转换流,内部肯定维护一个字节流,FileReader维护一个FileInputStream对象,FileWriter维护一个FileOutputStream。

  构造方法传入File对象或文件名,基本读写方法与其父类相同。

  3.BufferedReader和BufferedWriter(缓冲字符流)

  BufferedReader:

  从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求(开销比较大)。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader),便可减少底层读取次数,从缓冲区中读取。

  构造方法:

  BufferedReader(Reader in):默认缓冲区大小

  BufferedReader(Reader in, int sz):指定缓冲区大小

  读取方法中多了一个readLine()方法,每次可以读取文本文件的一行。

  BufferedWriter:

  将文本写入字符输出流,缓冲各个字符,从而提供单个字符、字符数组和字符串的写入。内部维护一个缓冲区,减少底层字节流或字符流写入文件的次数,提高效率。

  构造方法与BufferedReader想对应,多了一个自动换行的方法newLine()。

  3.PrintWriter

  向文本输出流打印对象的格式化表示形式。

  与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 printlnprintfformat 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。

  此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。

  提供了打印各种基本数据类型和String的方法。也提供了带有自动换行功能的打印方法println()。

java基础之IO流(二)之字符流的更多相关文章

  1. IO(二)----字符流

    计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此,从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符层次的编码和解码. 常见的码表 ASC ...

  2. Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律

    第一讲     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...

  3. java基础46 IO流技术(输出字符流/缓冲输出字符流)

    一.输出字符流 1.1.输出字符流体系 --------| Writer:输出字符流的基类(抽象类)  ----------| FileWriter:向文件输出数据输出字符流(把程序中的数据写到硬盘中 ...

  4. Java IO(十二) 字符流 Writer 和 Reader

    Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...

  5. java基础之io流总结四:字符流读写

    字符流读写只适用于字符文件. 基本字符流(转换流)读写文件 转换流本身是字符流,但是实例化的时候传进去的是一个字节流,所以叫做转换流 InputStreamReader isr = new Input ...

  6. IO流(二)字符流

    1.字符流:在字节流的基础上添加了编码机制.很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件.例如.txt,.java,.cpp,.html等 编码:每一个国家都有自 ...

  7. java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝

    接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...

  8. Java IO(五)——字符流进阶及BufferedWriter、BufferedReader

    一.字符流和字节流的区别 拿一下上一篇文章的例子: package com.demo.io; import java.io.File; import java.io.FileReader; impor ...

  9. Java基础之IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

随机推荐

  1. Spring 概念及特点 Spring下载地址 控制反转IoC实现原理

    Spring下载地址 http://repo.springsource.org/libs-release-local/org/springframework/spring/ Spring是开源full ...

  2. 《嵌入式linux应用程序开发标准教程》笔记——7.进程控制开发

    进程是系统资源的最小单元,很重要. 7.1 linux进程的基本概念 定义:一个程序的一次执行过程,同时也是资源分配的最小单元.程序是静态的,而进程是动态的. 进程控制块:linux系统用进程控制块描 ...

  3. Python网络爬虫(Get、Post抓取方式)

    简单的抓取网页 import urllib.request url="http://google.cn/" response=urllib.request.urlopen(url) ...

  4. Selenium启动项参数设置

    再Selenium中使用不同的Webdriver可能会有不一样的方法,有些相同的操作会得到不同的结果, 本文主要介绍的是Chrome()的使用方法. 其他的Webdriver可以参考官方文档 Chro ...

  5. php 注册与登录

    <body background="timg.jpg"><div class="dak"> <div class="zu ...

  6. 移动端没有session怎么处理

    (转:https://my.oschina.net/wanglihui/blog/150726) 手机客户端与服务器端的通信,不同于浏览器与服务器端的通信.浏览器和服务器端的通信依靠session去维 ...

  7. 使用Unity做2.5D游戏教程(一)

    最近在研究Unity 3D,看了老外Marin Todorov写的教程很详细,就翻译过来以便自己参考,翻译不好的地方请多包涵. 如果你不了解2.5D游戏是什么,它基本上是个3D游戏而你可以想象是压扁的 ...

  8. BZOJ 2946 [Poi2000]公共串 ——后缀自动机

    任意选择一个串作为模式串,构建出后缀自动机. 然后用其他的串在后缀自动机上跑匹配. 然后就到了理解后缀自动机性质的时候. 在某一个节点的最大值是可以沿着parent树上传的. 然后用dp[i][j]表 ...

  9. POJ 2411 Mondriaan's Dream ——状压DP 插头DP

    [题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...

  10. NOI2015 荷马史诗 【k-哈夫曼树】

    题目 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛> ...