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流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
随机推荐
- java在线聊天项目0.8版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能
迭代器的方式会产生锁定 服务器端增加发送给每个客户端已收到信息的功能 所以当获取到一个socket,并打开它的线程进行循环接收客户端发来信息时,我们把这个内部类的线程Client保存到集合List&l ...
- 1008: ASCII码
题目描述 相信大家一定都知道大名鼎鼎的ASCII码,这次给你的任务是输入数字(表示ASCII码),输出相对应的字符信息. 输入 第一行为一个整数T(1<=T<=1000).接下来包括T个正 ...
- C++系统学习一:基本数据类型和变量
程序语言 程序语言最基本的特征 整型.字符型等内置类型 变量,用来为对象命名 表达式和语句,操纵上述数据类型的具体值 if等控制结构 函数,定义可供随时调用的计算单元 程序语言的扩展 自定义数据类型 ...
- AT2172 Shik and Travel
题目描述: luogu 题解: 二分+暴力$vector$+$dfs$. 记录下所有可能的子树内合法方案,双指针+归并合并. 代码: #include<vector> #include&l ...
- python基础知识13-迭代器与生成器,导入模块
异常处理作业讲解 file = open('/home/pyvip/aaa.txt','w+') try: my_dict = {'name':'adb'} file.write(my_dict['a ...
- shell中的$(( )) 的用途:主要用在整数的运算$(( a+b*c ))
$ a=5; b=7; c=2 $ echo $(( a+b*c ))//注意在进行这些运算时必须是双括号 $ echo $(( (a+b)/c )) $ echo $(( (a*b)%c))
- HashMap图解
HashMap的数据结构和put.get.resize等操作的图解,看图轻松掌握HashMap (目前还不包括红黑树相关的部分) HashMap数据结构如下图 HashMap之put操作如下图 Has ...
- Git常用的基本操作
一.如何学习git指令 1.查看帮助:git help2.查看指定命令:git help clone3.搜索关键字:/chone 4.退出帮助文档:输入Q 二.常见命令 1.初始化git本地仓库:先进 ...
- c#中的String方法
1.Replace(替换字符):public string Replace(char oldChar,char newChar);在对象中寻找oldChar,如果寻找到,就用newChar将oldCh ...
- python 跨域
CORS跨域请求 CORS即Cross Origin Resource Sharing 跨域资源共享, 那么跨域请求还分为两种,一种叫简单请求,一种是复杂请求~~ 简单请求 HTTP方法是下列方法之一 ...