java基础之IO流(二)之字符流
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 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。
此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。
提供了打印各种基本数据类型和String的方法。也提供了带有自动换行功能的打印方法println()。
java基础之IO流(二)之字符流的更多相关文章
- IO(二)----字符流
计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此,从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符层次的编码和解码. 常见的码表 ASC ...
- Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律
第一讲 IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...
- java基础46 IO流技术(输出字符流/缓冲输出字符流)
一.输出字符流 1.1.输出字符流体系 --------| Writer:输出字符流的基类(抽象类) ----------| FileWriter:向文件输出数据输出字符流(把程序中的数据写到硬盘中 ...
- Java IO(十二) 字符流 Writer 和 Reader
Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...
- java基础之io流总结四:字符流读写
字符流读写只适用于字符文件. 基本字符流(转换流)读写文件 转换流本身是字符流,但是实例化的时候传进去的是一个字节流,所以叫做转换流 InputStreamReader isr = new Input ...
- IO流(二)字符流
1.字符流:在字节流的基础上添加了编码机制.很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件.例如.txt,.java,.cpp,.html等 编码:每一个国家都有自 ...
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...
- Java IO(五)——字符流进阶及BufferedWriter、BufferedReader
一.字符流和字节流的区别 拿一下上一篇文章的例子: package com.demo.io; import java.io.File; import java.io.FileReader; impor ...
- Java基础之IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
随机推荐
- shell脚本,提取ip地址和子网掩码,和查外网ip地址信息。
#提取IP地址和子网掩码 [root@localhost ~]# ifconfig eth0|grep 'inet addr'|awk -F'[ :]+' '{print $4"/& ...
- Philipp Wagner
本文大部分来自OpenCV官网上的Face Reconition with OpenCV这节内容(http://docs.opencv.org/modules/contrib/doc/facerec/ ...
- 【贪心优化dp决策】bzoj1571: [Usaco2009 Open]滑雪课Ski
还有贪心优化dp决策的操作…… Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里 ...
- shell-code-2-传参
#在执行shell脚本时,带参数,如./test.sh 1 2 3,则在脚本test.sh内,参数表示为$n的形式,$1为第一个参数,以此类推. echo "第一个参数为:$1"; ...
- TSOJ--方格上的路径
题目描述: 试求 n × m 的方格图形中,从点 (0, 0) 到点 (n, m) 的最短路径数目. 输入描述: 有多组测试数据.输入的第一行为一个正整数 N,表示接下来有 N 组测试数据. 在接下来 ...
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 167: illegal multibyte sequence
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 167: illegal multibyte sequence文件 ...
- SpringData及SpringData JPA的理解和简单应用
SpringData是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得 数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务.此外,它还支持 基于关系型数据库的数据 ...
- luogu3698 [CQOI2017]小Q的棋盘
最长链是根节点到深度最深的结点的路径. 显然,要么直接走最长链,要么兜兜转转几个圈圈再走最长链,而最长链以外的结点因为要"兜圈",所以要经过两次. #include <ios ...
- 2017ACM/ICPC广西邀请赛-重现赛(感谢广西大学)
上一场CF打到心态爆炸,这几天也没啥想干的 A Math Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- php 投票
1.投票主界面(问题界面) <?php$db = new Mysqli("localhost","root","root"," ...