一、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. E-Explorer_2019牛客暑期多校训练营(第八场)

    题意 n个点,m条边,u,v,l,r表示点u到点v有一条边,且只有编号为\([l,r]\)的人能通过,问从点1到点n有哪些编号的人能通过 题解 先对\(l,r\)离散化,用第七场找中位数那题同样的形式 ...

  2. H-Magic Line_2019 牛客暑期多校训练营(第三场)

    题目连接: https://ac.nowcoder.com/acm/contest/883/H Description There are always some problems that seem ...

  3. 洛谷P1372 又是毕业季I+数学

    P1372 又是毕业季I 题意:在1-n中找到k个数,使得这k个数的最大公因数最大: 思路,题解: 因为两个数成倍数关系时,它们的最大公因数是两数中的较小数,也就是相对来说最大公因数较大 返回题目,这 ...

  4. CodeForces 948B Primal Sport

    Primal Sport 题意:2个人玩游戏, 每次轮到一个人选择一个比当前值小的素数, 然后在找到比素数的倍数中最小的并且不小于当前数的一个数. 现在这个游戏玩了2轮, 现在想找到最小的那个起点X0 ...

  5. CodeForces 340E Iahub and Permutations 错排dp

    Iahub and Permutations 题解: 令 cnt1 为可以没有限制位的填充数字个数. 令 cnt2 为有限制位的填充数字个数. 那么:对于cnt1来说, 他的值是cnt1! 然后我们对 ...

  6. CodeForces 590C Three States BFS

    Three Statesy 题解: 以3个大陆为起点,都dfs一遍,求出该大陆到其他点的最小距离是多少, 然后枚举每个点作为3个大陆的路径交点. 代码: #include<bits/stdc++ ...

  7. SpringBoot + JPA问题汇总

    实体类有继承父类,但父类没有单独标明注解 异常表现 Caused by: org.hibernate.AnnotationException: No identifier specified for ...

  8. Dinic算法学习

    转自 此文虽为转载,但博主的网络流就是从这开始的,认为写的不错 网络流基本概念 什么是网络流 在一个有向图上选择一个源点,一个汇点,每一条边上都有一个流量上限(以下称为容量),即经过这条边的流量不能超 ...

  9. 【Redis】SpringBoot+Redis+Ehcache实现二级缓存

    一.概述 1.1 一些疑惑? 1.2 场景 1.3 一级缓存.两级缓存的产生 1.4 流程分析 二.项目搭建 一.概述 1.1 一些疑惑? Ehcache本地内存 Redis 分布式缓存可以共享 一级 ...

  10. 十天快速入门Python

    课程导学 001 课程定位和目标 002 课程导学 第一部分 Python快速入门 第1天 Python基本语法元素 003 Python基本语法元素 004 程序设计基本方法 005 Python开 ...