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流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
随机推荐
- ios之UITabelViewCell的自定义(代码实现)
在用到UITableVIew的时候,经常会自定义每行的Cell 在IOS控件UITableView详解中的下面代码修改部分代码就可以实现自定义的Cell了 [cpp] view plaincopy - ...
- clover如何使用UEFI引导和EFI驱动选择
EFI分区实际上是一个FAT格式的分区,不一定要是第一个分区,GPT磁盘下任何一个FAT文件格式的分区都可以用来放EFI引导文件.主板UEFI先默认引导你所设置的第一优先启动分区下的\EFI\boot ...
- std::ios::sync_with_stdio和tie()——给cin加速
平时在Leetcode上刷题的时候,总能看到有一些题中最快的代码都有这样一段 static const auto init = []() { std::ios::sync_with_stdio(fal ...
- 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
算是挺基础的东西 Description 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P ...
- linux各种终端类型的区别和概念
1 pty(虚拟终端或伪终端): 当我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty). 2 tty(终端设备的统称):tty一词源 ...
- centos6 安装windows字体
注意:字体文件必须是TTF或者ttf格式的文件, 1.yum install -y fontconfig mkfontscale2.mkdir -p /usr/share/fonts/windows_ ...
- CSS3中制作倒影box-reflect
目前仅在Chrome.Safari和Opera浏览器下支持 box-reflect:none | <direction> <offset>? <mask-box-imag ...
- uboot的readme
## (C) Copyright 2000 - 2008# Wolfgang Denk, DENX Software Engineering, wd@denx.de.## See file CREDI ...
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity
E. The Untended Antiquity 题目链接http://codeforces.com/contest/869/problem/E 解题心得: 1.1,x1,y1,x2,y2 以(x1 ...
- 转:Ubuntu下ibus-sunpinyin的安装及翻页快捷键设置!
在windows下,好多人都已经习惯了使用搜狗拼音,到ubuntu下,忽然没有极为顺手的输入法,实为郁闷,但是确实还没有for linux版本的搜狗使用,这是搜狗的商业策略,我们无法掌控,但是,如果你 ...