一、概念

Reader

Reader用于读取的字符流抽象类,数据单位为字符。

int read(): 读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即Unicode值)。如果未读出字符则返回-1(返回值为-1表示读取结束)。

void close() : 关闭流对象,释放相关系统资源。

 /*字符输入流 Reader  仅用于字符(不算管中文还是英文)文件,不适合图片等
*字节流 FileInputStream 对应 字符流 FileReader
*字节流 FileOutputStream 对应字符流 FileWriter
* 字节流:图片 音乐 电影 文字 优先选用
* 字符流好处可以对中文字符进行有效处理,要处理中文是优先选字符流
1)字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元(2个字节)。
2)字节流默认不使用缓冲区;字符流使用缓冲区。
3)字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;
字符流通常处理文本数据,它支持写入及读取Unicode码元。
4)底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。
字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,为向IO设备写入或读取字符串提供了一点点方便。 跟字节流差不多,但是这里的每一滴水是一个占16位的字符(char型变量是2个字节,16位的) FileReader与字节流FileInputStream相似的方法
int read() 从字节流/字符流中读取单个字符,返回所读取的字节/字符数据
int read(type[] b/char c) 借助数组,从输入流中最多读取b.length()个字节或c.length()个字符的数据,将其存在字节数组b/
字符数组c ,返回实际读取的字节/字符数
int read(type[] b/char c,int off,int len) 从字节/字符流中最多读取len个字节或字符的数据,将它们存在字节数组b/字符数组c
中,但不是从数组下标0开始的而是从数组下标off位置开始存储,存储长度为len
*/
package cn.sxt.test; import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader; public class Test_0330_Reader {
public static void main(String[] args) throws IOException {
//1、获取源文件
File file=new File("src.txt");
//2、选择流
Reader reader=new FileReader(file); //整合第一步和第二步更加简单
//FileReader reader2=new FileReader("src.txt"); //3、进行操作 char:字符型16位占2个字节
char datas[]=new char[30];//开辟字符数组,接收读取的数据 //Reader类的read()方法:返回类型为int,作为整数读取的字符(占两个字节共16位)范围在 (0-65535),若已到流的末尾,返回 -1
//read()方法会将读取到的数据保存到开辟好的char型数组中,然后返回读取的字符长度,由于开辟的数组很大,内容无法全部填充
//在输出时将部分字符数组转换成字符串后输出。
int len=reader.read(datas,0,datas.length); //开始 取水滴,每个水滴是一个字符
for (int i=0;i<datas.length ;i++) {
System.out.printf("datas[%d]=%c;"+"\n",i,datas[i]);
} String msg=new String(datas,0,len);//字符转字符串输出,和字节输出时一样的
System.out.println(msg); //4、关闭流文件
reader.close(); } }

· Writer

Writer用于写入的字符流抽象类,数据单位为字符。

void write(int n): 向输出流中写入一个字符。

void close() : 关闭输出流对象,释放相关系统资源。

 /*
*输出字符流 Writer
*字节流 FileOutputStream 对应字符流 FileWriter
*二者共同类似的方法
*
*void write(int c); 将指定的字节/字符输出到输出流中 其中c在字节流中代指字节 在字符流中代指字符
*void write(byte[]/char[] buf) 借助字节/字符数组完成输出
*void write(byte[]/char[] buf,int off,int len) 将字节/字符数组buf从off位置开始长度为len的字节/字符输出到输出流中
*
*字符流直接以字符为操作单位,所以Writer相对于字节流还多了2个方法
*void write(String str) 将字符串str包含的字符输出到指定的输出流中
*void write(String str,int off ,int len) 将字符串str从off的位置开始长度为len的字符输出到指定输出流中
*
*/
package cn.sxt.test; import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer; public class Test_0330_Writer {
public static void main(String[] args) throws IOException {
/*File file=new File("des.txt");
Writer writer=new FileWriter(file,true); String src="1949中华人民共和国ABC";
writer.write(src);
writer.close();
*/ //\r是回车符 \n是换行符 "\r\n" 在一起是windows平台的换行符 单独“\n”是 linux平台换行符。 Java跨平台无所谓了
FileWriter fWriter =new FileWriter("poem.txt");
fWriter.write("锦瑟-李商隐\n");
fWriter.write("锦瑟无端五十弦,一弦一柱思华年。\r");
fWriter.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\n");
fWriter.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n");
fWriter.write("此情可待成追忆,只是当时已惘然。\r"); fWriter.close(); } }

二、字符缓冲类

 /**学习换缓冲字符类,是Reader和Writer类的亲儿子类
*缓冲字符流 BufferedReader/BufferedWriter 与 InputStreamReader/ OutputStreamWriter类平级
* 是前面常用的FileReader和FileWriter(文件字符类)的亲叔叔类
*关系:---------->1、BufferedReader/BufferedWriter(今天学习重点)
*Reader/Writer-->2、InputStreamReader/ OutputStreamWriter---》》2-1:FileReader和FileWriter(前边用过,文件字符类)
*--------------->3、
*/
package cn.sxt.test; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Test_0330_BufferedChar {
public static void main(String[] args) throws IOException {
FileReader file=new FileReader("TuLongDao.txt");
FileWriter file2=new FileWriter("TuLongDao_copy.txt"); BufferedReader src=new BufferedReader(file);
BufferedWriter dest=new BufferedWriter(file2); //1、带字符缓冲数组的
long a=System.currentTimeMillis();
String temp=null;//readLine()方法是BufferedReader特有的方法,可以对文本文件按行读取
while ((temp=src.readLine())!=null) { //返回值是一个字符串对象,即文本中的一行内容
//将读取的一行字符串写入文件中
dest.write(temp);
//下次写入之前先换行,否则会在上一行后边继续追加,而不是另起一行
dest.newLine();
}
long b=System.currentTimeMillis();
System.out.println("使用IO自带的字符缓冲类花费:"+(b-a)+"毫秒"); src.close();
dest.close();
//2、不带文件缓冲数组的
FileReader file3=new FileReader("TuLongDao.txt");
FileWriter file4=new FileWriter("TuLongDao_copy2.txt"); long c=System.currentTimeMillis();
int len=0;//一个一个字符复制
while ((len = file3.read()) != -1) {
file4.write(len);
}
long d=System.currentTimeMillis();
System.out.println("不使用IO自带的字符缓冲类花费:"+(d-c)+"毫秒");
file3.close();
file4.close(); } }

[19/03/31-星期日] IO技术_四大抽象类_字符流( 字符输入流 Reader、 字符输出流 Writer )(含字符缓冲类)的更多相关文章

  1. [19/03/30-星期六] IO技术_四大抽象类_ 字节流( 字节输入流 InputStream 、字符输出流 OutputStream )_(含字节文件缓冲流)

    一.概念及分类 InputStream(输入流)/OutputStream(输出流)是所有字节输入输出流的父类 [注]输入流和输出流的是按程序运行所在的内存的角度划分的 字节流操作的数据单元是8的字节 ...

  2. JAVA IO分析一:File类、字节流、字符流、字节字符转换流

    因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ...

  3. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)

    一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...

  4. Java IO 技术

    文章目录 流的概念 IO 流类体系 InputStream / OutputStream Reader / Writer 文件字节流 文件字符流 缓冲字节流 缓冲字符流 字节数组流 数据流 转换流 序 ...

  5. Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

  6. IO流回顾与总结第一篇之字节流与字符流的操作。。。。。

    一.引言 趁着年后的这点时间,抓紧点时间回顾下javase中的IO流,以往都是用到那些常用的IO类,这次来个全点的,有不对的地方还请大神指正一下,做到坚持写博的习惯来...... 回归正题,IO流顾名 ...

  7. Java IO编程——字符流与字节流

    在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...

  8. java:IO流(File,字节流/输入输出流(InputStream(FileInputStream),OutputStream(FileOutStream)),字符流(Reader,Writer))

    File: * java.io.File类:代表一个文件或目录. * 常用的构造方法: * File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例 ...

  9. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

随机推荐

  1. nodejs获取客户机ip

    /** * Created by chaozhou on 2015/11/24. */ var getIp = function(req){ var ipStr = req.headers['x-fo ...

  2. post方式发送接收文件

    //文件post发送 var express = require('express');var router = express.Router();var request = require(&quo ...

  3. MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用

    1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...

  4. dns-prefetch使用整理

    网站投放百度.谷歌联盟广告,百度分享.推荐等,由于不同的DNS请求,会增加了网页加载时间,用户等待时间过长会造成跳出率增高,对SEO有一定影响. DNS解析速度是造成页面延迟加载的最大的原因. DNS ...

  5. document.getElementsByTagName

    var elems = document.forms[form_name].getElementsByTagName("INPUT"); getElementsByTagName( ...

  6. 工厂模式(Factory Pattern)

    一.工厂模式(Factory Pattern)的介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使 ...

  7. java对象中含有Integer类型字段转json字符串问题

    问题:对于含有Integer类型字段的java对象,在通过下面这种方式转为json字符串时,Integer类型的字段如果为空的情况下,会默认转化为0,但是我想让它为空的时候直接转化为null,不要默认 ...

  8. jxls实现动态图表

    此文章是基于 jxls实现基于excel模板的报表 一. 制作excel动态图表模板 1. 安装 excel 2003 ,新建文件,命名为:runRecord.xls 2. 创建两个表格,分别命名为: ...

  9. yield* 表达式

    yield* 表达式用于委托给另一个generator 或可迭代对象. 委托给其他生成器 function* g1() { yield 2; yield 3; yield 4; } function* ...

  10. eclipse插件开发常见的问题及解决办法

    莫名其妙地我的某个Plug-in Projects出现了这样的Error:An API baseline has not been set for the current workspace.虽然后来 ...