首先说一下前面学习的字节流,它是一个一个字节的读取,我们创建的txt文件里面存放的也都是英文。但是当我们用字节流读取中文字符的时候,就会出现乱码,以UTF-8为例,一个中文字符是占了三个字节,而读取时却是一个字节一个字节的读取,将一个中文字符拆分了,所以出现了乱码。
下面将学习对字符进行操作的流:字符流。
字符流
字符流的父类(抽象类):
java.lang.Object ---> java.io.Reader
java.lang.Object ---> java.io.Writer
-
Reader:字符输入流
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
部分方法:
public int read(){} //读取单个字符。
public int read(char[] c){} //将字符读入数组。
public int read(char[] c, int off, int len){} //将字符读入数组的某一部分。
-
Writer:字符输出流
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。
部分方法:
public int write(int n){} //写入单个字符。
public int write(String str){} //写入字符串。
public int write(cahr[] c, int off, int len){} //写入字符数组的某一部分。
字符流抽象类的子子类:文件字符流
java.io.Reader--->java.io.InputStreamReader--->java.io.FileReader
java.io.Writer--->java.io.OutputStreamWriter--->java.io.FileWriter
-
FileReader:
-
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
-
public int read (char[] c) //从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
-
-
FileWriter:
- 用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
- public void write(String str) //一次写多个字符,将b数组中所有字符,写入输出流。
FileReader案例代码:
package com.wlw.io.demo02;
import java.io.FileReader;
/**
* 文件字符流
* 使用FileReader 读取文件
*/
public class FileReaderDemo {
public static void main(String[] args) throws Exception{
//1.创建文件字符流
FileReader fr = new FileReader("D:\\Program Files\\IDEAworkspace\\charaaa.txt");
//2.读取
//2.1 一个一个的读
/*
int data = 0;
while ((data = fr.read()) != -1){//读完数据
System.out.print((char) data);//转成字符输出
}
*/
//2.2 多个字符的读
// 将读到内容存入buf数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1。
char[] buf = new char[1024]; //用来接收数据
int count = 0; //存放读到的字符数 ,如果已到达流的末尾,则返回 -1
while ((count = fr.read(buf)) != -1){
System.out.println(new String(buf,0,count));
}
//3.关闭
fr.close();
}
}
FileWriter案例代码:
package com.wlw.io.demo02;
import java.io.FileWriter;
/**
* 文件字符流
* 使用FileWriter写入文件
*/
public class FileWriterDemo {
public static void main(String[] args)throws Exception {
//1.创建文件字符流FileWriter
FileWriter fw = new FileWriter("D:\\Program Files\\IDEAworkspace\\FileWriter.txt");
//2.写入
for (int i = 0; i < 10; i++) {
fw.write("java是世界上最好的语言\r\n");
fw.flush();
}
//3.关闭
fw.close();
System.out.println("写入完毕");
}
}
文件字符流复制文件:
package com.wlw.io.demo02;
import java.io.FileReader;
import java.io.FileWriter;
/**
* 使用文件字符流复制文本文件,不能复制图片和二进制文件
* 使用字节流可以复制任意文件
*/
public class FileReaderWriterCopyDemo {
public static void main(String[] args)throws Exception {
//1.创建文件字符流
FileReader fr = new FileReader("D:\\Program Files\\IDEAworkspace\\FileWriter.txt");
FileWriter fw = new FileWriter("D:\\Program Files\\IDEAworkspace\\FileWritercopy.txt");
//2.复制(边读边写)
int data = 0;
while ((data = fr.read()) != -1){
fw.write(data);
fw.flush();
}
//3.关闭
fr.close();
fw.close();
System.out.println("复制成功");
}
}
字符流抽象类的子类:字符缓冲流
java.io.Reader--->java.io.BufferedReader
java.io.Writer--->java.io.BufferedWriter
缓冲流: BufferedReader/BufferedWriter
- 高效读写。(缓冲区)
- 支持输入换行符。
- 可一次写一行、读一街。
-
BufferedReader:
- 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
- 构造方法:BufferedReader (Reader in)
-
BufferedWriter :
- 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
- 构造方法:BufferedWriter (Writer out)
BufferedReader代码:
package com.wlw.io.demo02;
import java.io.BufferedReader;
import java.io.FileReader;
/**
* 字符缓冲流 读取文件
* BufferedReader
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws Exception {
//1.创建缓冲流,需要传入一个字符输入流
FileReader fr = new FileReader("D:\\Program Files\\IDEAworkspace\\FileWriter.txt");
BufferedReader br = new BufferedReader(fr);
//2.读取
//2.1 br.read()
/*int data = 0;
while ((data = br.read()) != -1){
System.out.print((char)data);
}*/
//2.2
/* char[] buf = new char[1024];
int count = 0;
while ((count = br.read(buf)) != -1){
System.out.println(new String(buf,0,count));
}*/
//2.3
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//3.关闭
br.close(); //也会把文件字符输入流关闭
}
}
BufferedWriter 代码:
package com.wlw.io.demo02;
import java.io.BufferedWriter;
import java.io.FileWriter;
/**
* 字符缓冲流 写入文件
* BufferedWriter
*/
public class BufferedWriterDemo {
public static void main(String[] args) throws Exception{
//1.创建字符缓冲流 ,需要传入一个字符输出流
FileWriter fw = new FileWriter("D:\\Program Files\\IDEAworkspace\\BufferedWriter.txt");
BufferedWriter bw = new BufferedWriter(fw);
//2.写入
for (int i = 0; i < 10; i++) {
bw.write("好好学习,天天向上");
bw.newLine();
bw.flush();
}
//3.关闭流
bw.close();
System.out.println("写入完毕");
}
}
字符输出流的子类:打印流
java.io.Writer --->java.io.PrintWriter
- PrintWriter:
- 向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
- 封装了print() / println(方法, 支持写入后换行。
- 支持数据原样打印
代码:
package com.wlw.io.demo02;
import java.io.PrintWriter;
//PrintWriter 打印流的使用
public class PrintWriterDemo {
public static void main(String[] args) throws Exception {
//创建流
PrintWriter pw = new PrintWriter("D:\\Program Files\\IDEAworkspace\\PrintWriter.txt");
//打印
pw.println(97); //文件里为97
pw.println(true);//文件里为true
pw.println(3.14);//文件里为3.14
pw.println('a');//文件里为a
pw.flush();
//关闭
pw.checkError();//内部会自动调用pw.flush();
System.out.println("打印完毕");
}
}
字符流抽象类的子类:(桥)转换流
java.io.Reader--->java.io.InputStreamReader
java.io.Writer--->java.io.OutputStreamWriter
桥转换流:InputStreamReader/OutputStreamWriter
- 可将字节流转换为字符流
- 可设置字符的编码方式
- InputStreamReader:
- InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 字符集 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
- OutputStreamWriter:
- OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 字符集 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
InputStreamReader代码:
package com.wlw.io.demo02;
import java.io.FileInputStream;
import java.io.InputStreamReader;
//使用 转换流 读取文件
public class InputStreamReaderDemo {
public static void main(String[] args) throws Exception{
//1.创建转换流,需要传入一个字节流(输入流),和编码方式
FileInputStream fis = new FileInputStream("D:\\Program Files\\IDEAworkspace\\charaaa.txt");
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
//读取
/*int data = 0;
while ((data = isr.read()) != -1){
System.out.print((char) data);
}*/
char[] buf = new char[1024];
int count = 0;
while ((count = isr.read(buf)) != -1){
System.out.println(new String(buf,0,count));
}
//关闭流
isr.close();
}
}
OutputStreamWriter代码:
package com.wlw.io.demo02;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
//使用 转换流 写入文件
public class OutputStreamWriterDemo {
public static void main(String[] args) throws Exception{
//1.创建转换流,需要传入一个字节流(输出流),和编码方式
FileOutputStream fos = new FileOutputStream("D:\\Program Files\\IDEAworkspace\\转换流.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
//写入
for (int i = 0; i < 10; i++) {
osw.write("转换流写入文件\r\n");
osw.flush();
}
//关闭
osw.close();
System.out.println("执行完毕");
}
}
本文深入讲解Java中的字符流概念,包括其父类、子类及具体应用,如文件字符流、字符缓冲流、打印流和桥转换流等。通过代码示例详细介绍了各种流的操作方法,如读取、写入、复制文件等。

被折叠的 条评论
为什么被折叠?



