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流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
随机推荐
- 用函数式编程思维解析anagrams函数
//函数式编程思维分析 这个排列函数 const anagrams = str => { if (str.length <= 2) return str.length === 2 ? [s ...
- css去除链接 input 虚框
/* css去掉虚框 */ :focus{-webkit-outline-style:none;-moz-outline-style:none;-ms-outline-style:none;-o-ou ...
- [LUOGU] P2759 奇怪的函数
题目描述 使得 x^x x x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^xx x 达到 n 位数字的最小正整数 x 输入输出样 ...
- centOS下jenkins
转:centos7搭建jenkins小记 转自:https://segmentfault.com/a/1190000007086764 安装java环境 1.查看服务器版本 centos7,继续. c ...
- 控制mysql数字转换
在实际工作中我们常常需要将数字进行格式化,比如将12.0073233变为12.01,或把12变为12.00,或把12变为0000012,这种格式之间的转换总结如下: 一,浮点数的转换--直接设 ...
- BFS:UVa220 ACM/ICPC 1992-Othello(黑白棋)
Othello Othello is a game played by two people on an 8 x 8 board, using disks that are white on one ...
- leetcode刷题——查找
知识点 备忘-必备算法 题目 顺序查找 二分查找 树表搜索 广度优先搜索算法(BFS) 深度优先搜索算法(DFS) 回溯(Backtracking) 题解 CS-Notes Algorithm_Int ...
- jq:mouseover和mouseout多次触发解决办法
区别: mouseover与mouseenter 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件. 只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件. mou ...
- Java-确定被加载类的路径
如何输出当前类在硬盘的物理路径 package com.tj; import java.net.URL; import java.security.CodeSource; import java.se ...
- 【0门槛】PR稿的自我修养
本文来自网易云社区 作者:巩爽 十一过完,离2018年结束就只剩下85天啦!是不是2016年许下的2017年的梦想,在2018年还没有实现? 做过的项目仿佛都小有成就,可惜只是内部自嗨,想做域外宣传却 ...