一、Reader和Writer

1. 字符流原理

Reader是所有字符输入流的父类而Writer是所有字符输出流的父类。字符流是以字符(char)为单位读写数据的。一次处理一个unicode。字符流都是高级流,其底层都是依靠字节流进行读写数据的,所以底层仍然是基于字节读写数据的。
2. 常用方法

Reader的常用方法:
int read()
读取一个字符,返回的int”值低16”位有效。

其实返回的是char 若返回的是-1 则读取到末尾

int read(char[] chs)
从该流中读取一个字符数组length个字符并存入该数组,返回值为实际读取到的字符量。
Writer的常用方法:
void write(int c)
写出一个字符,写出给定int值”低16”位表示的字符。
void write(char[] chs)
将给定字符数组中所有字符写出。
void write(String str)
将给定的字符串写出
void write(char[] chs,int offset,int len):
将给定的字符数组中从offset处开始连续的len个字符写出

二、转换流
1. 字符转换流原理

InputStreamReader:字符输入流, 使用该流可以设置字符集,并按照指定的字符集从流中按照该编码将字节数据转换为字符并读取。
OutputStreamWriter:字符输出流,使用该流可以设置字符集,并按照指定的字符集将字符转换为对应字节后通过该流写出。

2. 指定字符编码

InputStreamReader的构造方法允许我们设置字符集:
InputStreamReader(InputStream in,String charsetName)
基于给定的字节输入流以及字符编码创建ISR
InputStreamReader(InputStream in)
该构造方法会根据系统默认字符集创建ISR
OutputStreamWriter:的构造方法:
OutputStreamWriter(OutputStream out,String charsetName)
基于给定的字节输出流以及字符编码创建OSW
OutputStreamWriter(OutputStream out)
该构造方法会根据系统默认字符集创建OSW
3. 使用InputStreamReader

public void testInput() throws IOException{
FileInputStream fis
= new FileInputStream("demo.txt");
/*
* 这里设置了字符编码为GBK
* 之后再通过ISR读取demo.txt文件时
* 就使用GBK编码读取字符了
*/
InputStreamReader reader
= new InputStreamReader(fis,"GBK");
int c = -1;
while((c = reader.read()) != -1){
System.out.print((char)c);
}
reader.close();
}

4. 使用OutputStreamWriter

public void testOutput() throws IOException{
FileOutputStream fos
= new FileOutputStream("demo.txt");
OutputStreamWriter writer
//这里使用的字符编码为UTF-8
= new OutputStreamWriter(fos,"UTF-8");
String str = "大家好!";//UTF-8中文为3个字节,英文符号占1个字节
writer.write(str);//写出后该文件大小应该为10字节
writer.close();
}
...

实例:

public class TestOutputStreamDemo {
public static void main(String[] args) throws IOException {
/*
* 向文件中按照指定的编码集写出字符串
* helleworld
* 大家好
* 使用UTF-8
*
*/
FileOutputStream fos =new FileOutputStream("osw.txt"); /*
* 不指定字符集 字符输出使用系统默认
*/
//OutputStreamWriter osw =new OutputStreamWriter(fos);
OutputStreamWriter osw =new OutputStreamWriter(fos,"utf-8"); osw.write("helloworld");
osw.write("大家好!");
osw.close(); }
/**
* 使用字符输入流读取一个文本文件
* @author Administrator
*
*/
class TestInputStreamReader{
public static void main(String[] args) throws IOException { FileInputStream fis =new FileInputStream("osw.txt");
InputStreamReader isr = new InputStreamReader(fis, "utf-8"); int d=-1;
while((d=isr.read())!=-1){
char c= (char)d;
System.out.print(c);
}
isr.close();
} }

三、BufferedReader
1. 构建BufferedReader对象

BufferedReader是缓冲字符输入流,其内部提供了缓冲区,可以提高读取效率。
BufferedReader的常用构造方法:
BufferedReader(Reader reader)
例如:

FileInputStream fis
= new FileInputStream("demo.txt");
InputStreamReader isr
= new InputStreamReader(fis);
BufferedReader br
= new BufferedReader(isr);

注:因为BufferedReader在构造实例时需要传入一个字符流,所以当我们想基于一个字节流进行读取时,要先将字节流转换为字符流后方可创建缓冲字符输入流BufferedReader。
2. 使用BR读取一行字符串

BufferedReader提供了一个可以便于读取一行字符串:
String readLine()
该方法连续读取一行字符串,直到读取到换行符为止,返回的字符串中不包含该换行符。若EOF则该方法返回null。
例如:

FileInputStream fis
= new FileInputStream("demo.txt");
InputStreamReader isr
= new InputStreamReader(fis);
BufferedReader br
= new BufferedReader(isr);
String str = null;
while((str = br.readLine()) != null){
System.out.println(str);
}
br.close();

  

/**
* 使用缓冲字符输入流获取文本文件
* @author Administrator
*
*/ class TestBufferedReaderDemo{
/*
* 1.创建字节流
* 2、创建字符流
* 3.创建缓冲字符流
*/
public static void main(String[] args) throws IOException {
//字节流
FileInputStream fis = new FileInputStream("pw.txt");
// 字符流( 按照给定的编码集转换为字符)
InputStreamReader isf =new InputStreamReader(fis,"utf-8");
//可以以行为单位读取字符串,缓冲流可以提高读取字符串
BufferedReader br =new BufferedReader(isf); String line = null;
/*
*
*/
while((line=br.readLine())!=null){
System.out.println(line); }
}
}

四、 PrintWriter
1. 创建PrintWriter对象

PrintWriter是具有自动行刷新的缓冲该字符输出流。其提供了比较丰富的构造方法:

PrintWriter(File file)
PrintWriter(String fileName)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out,boolean autoFlush)
PrintWriter(Writer writer)
PrintWriter(Writer writer,boolean autoFlush)

其中参数为OutputStream与Writer的构造方法提供了一个可以传入boolean值参数,该参数用于表示PrintWriter是否具有自动行刷新。

2. PrintWriter的重载print和println方法

使用PrintWriter写出字符串时我们通常不使用Writer提供的write()相关方法,而是使用print和println等方法,PrintWriter提供了若干重载的print与println方法,其中println方法是在写出数据后自动追加一个系统支持的换行符。
重载方法有:

void print(int i)//打印整数
void print(char c)//打印字符
void print(boolean b)//打印boolean值
void print(char[] c)//打印字符数组
void print(double d)//打印double值
void print(float f)//打印float值
void print(long l)//打印long值
void print(String str)//打印字符串

注:这些方法还有类似的println方法,参数与上面相同

/**
* 带有自动行刷新的缓冲字符输出流
* @author Administrator
*
*/
class TestPrintWriteDemo{
public static void main(String[] args) throws IOException {
/*
* 将一个字符串写入文本文件
*/
PrintWriter writer =new PrintWriter("pw.txt");
writer.print("helloworld!");
writer.println("hello");
writer.print("world");
writer.println("helloworld!"); writer.close();
}
}

3. 使用PW输出字符数据

FileOutputStream fos
= new FileOutputStream("demo.txt");
OutputStreamWriter osw
= new OutputStreamWriter(fos,"UTF-8");
//创建带有自动行刷新的PW
PrintWriter pw = new PrintWriter(osw,true);
pw.println("大家好!");
pw.close();

 

/**
* 使用指定字符集并带有自动行刷新
* @author Administrator
*
*/
class TestPrintWriteDemo2{
public static void main(String[] args) throws IOException {
FileOutputStream fos =new FileOutputStream("pw.txt"); //将字符转换为字节
OutputStreamWriter osw =new OutputStreamWriter(fos);
//提高写效率,可以以行为单位写出字符串
PrintWriter pw =new PrintWriter(osw,true);
/*
* 当PrintWrite带有自动行刷新
* 每当我们调用println方法写出字符串,都会自动的Flush
*/
pw.print("大家好!");
pw.println("呵呵");
pw.println("拜拜!");
pw.close();
}
}
public class TestCopy {
public static void main(String[] args) throws IOException {
/*
* 1、读取原文件
* 2、向目标文件写
* 使用缓冲流按行读取
*/
FileInputStream fos =new FileInputStream("src"+File.separator+"day430"+File.separator+"TestCopy.java");
//转换为字符输入流
InputStreamReader isr =new InputStreamReader(fos);
//按行为单位读取字符串
BufferedReader br =new BufferedReader(isr); PrintWriter pw = new PrintWriter("copy.java");
String line =null;
while((line=br.readLine())!=null){
pw.print(line);
}
pw.close();
br.close();
}
}

文本数据IO操作--字符流的更多相关文章

  1. JAVASE02-Unit08: 文本数据IO操作 、 异常处理

    Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...

  2. Day03:文本数据IO操作 / 异常处理

    文本数据IO操作 Reader和Writer 字符流原理  Reader是字符输入流的父类  Writer是字符输出流的父类. 字符流是以字符(char)为单位读写数据的.一次处理一个unicode. ...

  3. JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

    基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...

  4. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

  5. Java IO: 其他字符流(下)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...

  6. AI学习---数据IO操作&神经网络基础

    数据IO操作 TF支持3种文件读取:    1.直接把数据保存到变量中    2.占位符配合feed_dict使用    3. QueueRunner(TF中特有的) 文件读取流程 文件读取流程(多线 ...

  7. Java IO之字符流和文件

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

  8. java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

    字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...

  9. Java——文件操作字符流和字节流的区别

    转:http://blog.csdn.net/joephoenix/articles/2283165.aspx java的IO流分两种流 字节流 InputStream OutputStream 字符 ...

随机推荐

  1. SDU暑期集训排位(4)

    SDU暑期集训排位(4) C. Pick Your Team 题意 有 \(n\) 个人,每个人有能力值,A 和 B 轮流选人,A 先选,B 选人按照一种给出的优先级, A 可以随便选.A 想最大化己 ...

  2. 牛客网 Wannafly挑战赛 A 找一找 思考题

    链接:https://www.nowcoder.com/acm/contest/71/A来源:牛客网 题目描述 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的 ...

  3. Docker详解(一)

    目录 Docker简介 Docker组成 永远的HelloWorld 序言:众所周知,近几年的互联网各项技术发展的如火如荼,敏捷开发模式越来越普及,"快"似乎成为了行业的标准,于是 ...

  4. mysql 主主从配置

    配置主服务器:主服务器1 Ip:  192.168.0.1 主服务器2 Ip:  192.168.0.2 主服务器1配置 2.1.修改mysql配置文件 vim /etc/my.conf Server ...

  5. Redis哨兵(Sentinel)模式快速入门

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用. ...

  6. Protobuf 安装及 Python、C# 示例

    01| 简介02| 安装2.1 Windows 下安装03| 简单使用3.1 编译3.2 Python 示例3.3 C# 示例 01| 简介 Protobuf(Protocol Buffers),是 ...

  7. 【Offer】[8] 【中序遍历的下一个结点】

    题目描述 思路分析 Java代码 代码链接 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...

  8. Java的异常:Error与Exception

    一. 异常机制的概述      异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 程序错误分 ...

  9. Django之使用内置函数和celery发邮件

    邮箱配置 开启stmp服务 以163邮箱为例,点击设置里面的stmp 开启客户端授权密码 如上所示,因为我已经开启了,所以出现的是以上页面. 这样,邮箱的准备就已经完成了. 使用Django内置函数发 ...

  10. 1512: [POI2006]Pro-Professor Szu

    首先把边反向, 问题转化成求从主建筑楼走向各个点的方案数. 然后缩点,块中的方案数可以直接算. 设f[i]表示走到第i个点的方案数.显然f[i]=∑f[j](存在newedge(j,i))初始时,f[ ...