一、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. 牛客-2018多校算法第五场C-KMP

    字符串的问题 在原来的字符串中前缀与后缀相同,且原来的中间还含有这个子串: 这里加的num[]数组真是太厉害了,可以直接用来判断中间是否有子串: #include <iostream> # ...

  2. 树形动态规划 fjutoj-2392 聚会的快乐

    聚会的快乐 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 你要组织一个由你 ...

  3. lambda表达式不同对象根据对象某个属性去重

    1.有时候有两个list对象,我们想要去重,比如: List<User> userList和List<Person>personList 想通过User的id和Person的i ...

  4. Log4Net 日志记录的实现

    一.前言 在上一篇文章[(转载)非常完善的Log4net配置详细说明]介绍了Log4Net的配置说明,如果不知道的可以去看看,这里我们就介绍一下日志记录的实现,说得都比较基础,所以大神请绕过. 二.L ...

  5. 前端-HTML-web服务本质-HTTP协议-请求-标签-01(待完善)

    目录 前端 什么是前端 什么是后端 学习流程 前端三剑客的形容 web服务的本质 测试--浏览器作为客户端向服务器发起请求 浏览器输入网址回车发生了几件事 ***** HTTP协议(超文本传输协议) ...

  6. 实验吧CTF练习题---WEB---貌似有点难解析

    实验吧web之貌似有点难   地址:http://www.shiyanbar.com/ctf/32 flag值:SimCTF{daima_shengji}   解题步骤: 1.打开题目页面,观察题目要 ...

  7. flume learning---Flume 集群搭建

    在flume搭建集群模式时,首先需要进入conf目录, 1.cp flume-env.sh.template flume-env.sh 2.cp flume-conf.properties.templ ...

  8. Linux服务器端口access改为trunk all

    1.确认可用网卡及vlan id eth5可用 vlan25:10.118.25.0/24 2.编辑网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-et ...

  9. tensorflow 使用 cpu 而不使用 gpu 问题

    查看 tensorflow 版本 conda list 例如发现 tensorflow 1.10.0 tensorflow-gpu 1.10.0 当两个版本相同时,默认会使用 cpu 版本 如果同时存 ...

  10. Day 25 网络基础2

    ip地址划分 ip地址由32位二进制组成. 什么是二进制?0101 10进制 0-9 10 2进制 0-1 10 二进制1100 ==1X2^3+1X2^2+0X2^1+0X2^0 =12 十进制15 ...