07 字符流
传统字节流读取
//1.创建FileInputStream并指定文件路径
FileInputStream fis = new FileInputStream("E:\\1.txt");
//上述进行优化
int data = 0;
while ((data = fis.read()) != -1){
System.out.print((char)data);
}
//3.关闭
fis.close();
读取中文会产生乱码
7.1、字符流的父类(抽象类)
FileReader(字符输入流)是用于读取字符流
- public int read(){}
- public int read(char[] c){}
- public int read(char[] b, int off, int len){}
FileWriter(字符输出流)是用于写入字符流
- public void write(int n){}
- public void write(String str){}
- public void write(char[] c){}
package com.itheima;
import java.io.FileReader;
/**
*使用FileReader 读取文件
/
public class TestFileReader {
public static void main(String[] args) throws Exception{
//1.创建缓冲流
FileReader fileReader = new FileReader("E:\\4.txt");
//2.读取
//1.第一种方式
char[] buff = new char[1024];
int count = 0;
while ((count = fileReader.read(buff)) != -1){
System.out.println(new String(buff,0,count));
}
//3.关闭
fileReader.close();
}
}
package com.itheima;
import java.io.FileWriter;
/**
* 使用FileWriter 写入文件
*/
public class TestFileWriter {
public static void main(String[] args) throws Exception{
//1.创建FileWriter对象
FileWriter fileWriter = new FileWriter("E:\\write.txt");
//2.写入
for (int i = 0; i < 10; i++) {
fileWriter.write("中国共产党万岁!\r\n");
fileWriter.flush();
}
//3.关闭
fileWriter.close();
System.out.println("执行完毕");
}
}
7.2、使用上述内容进行文本文件复制(案例)
字符流不能复制图片或者二进制文件,使用字节流可以复制任意文件
package com.itheima;
import java.io.FileReader;
import java.io.FileWriter;
/**
* 使用FileReader和FileWriter复制文本文件,不能复制图片或者其他二进制文件
* 字节流可以复制所有文件
*/
public class Copy {
public static void main(String[] args) throws Exception{
//1.创建
FileReader fileReader = new FileReader("E:\\write.txt");
FileWriter fileWriter = new FileWriter("E:\\write2.txt");
//2.读写
int data = 0;
while ((data = fileReader.read()) != 0){
fileWriter.write(data);
fileWriter.flush();
}
//3.关闭
fileWriter.close();
fileReader.close();
System.out.println("复制完毕");
}
}
7.3、字符缓冲流
BufferedReader
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
BufferedWriter
将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
提供了一个newLine()方法,调用此方法来终止每个输出行,因此优选直接写入换行符。
高效读写、支持输入换行符、可一次写一行读一行
package com.itheima;
import java.io.BufferedReader;
import java.io.FileReader;
/**
* 使用bufferedReader读取数据
*/
public class TestBufferedReader {
public static void main(String[] args) throws Exception{
//1.创建缓冲流
FileReader fileReader = new FileReader("E:\\write.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
//2.读取
//2.1 第一种方法
/*char[] buff = new char[1024];
int count = 0;
while ((count = bufferedReader.read(buff)) != -1){
System.out.println(new String(buff,0,count));
}*/
//2.第二种方法:一行一行的读
String line = null;
while ((line = bufferedReader.readLine()) != null){
System.out.println(line);
}
bufferedReader.close();
}
}
package com.itheima;
import java.io.BufferedWriter;
import java.io.FileWriter;
/**
* 使用BufferedWriter写入文本文件
* bufferedWriter.newLine();//写入一个换行符
*/
public class TestBufferedWriter {
public static void main(String[] args) throws Exception{
//1.创建BufferedWriter文件
FileWriter fileWriter = new FileWriter("E:\\5.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//2.写入
for (int i = 0; i < 10; i++) {
bufferedWriter.write("发生了什么事了!");
bufferedWriter.newLine();//写入一个换行符
bufferedWriter.flush();
}
//3.关闭
bufferedWriter.close();
}
}
7.4、PrintWriter
将对象的格式表示打印到文本输出流。
PrintStream在输出字符,将字符转换为字节时采用的是系统默认的编码格式,这样当数据传输另一个平台,而另一个平台使用另外一个编码格式解码时就会出现问题,存在不可控因素。而PrintWriter可以在传入Writer时可由程序员指定字符转换为字节时的编码格式,这样兼容性和可控性会更好。
package com.itheima;
import java.io.PrintWriter;
/**
* 使用TestPrintWriter来把打印内容写入磁盘
*/
public class TestPrintWriter {
public static void main(String[] args) throws Exception{
//1.创建打印流
PrintWriter printWriter = new PrintWriter("E:\\6.txt");
//2.打印
printWriter.println(12);
printWriter.println(true);
printWriter.println(3.14);
printWriter.println('a');
//3.关闭
printWriter.close();
}
}
7.5、转换流
InputStreamReader / OutputStreamWriter
InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
为了最大的效率,请考虑在BufferedReader中包装一个InputStreamReader。
例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
为了最大的效率,请考虑在BufferedWriter中包装一个OutputStreamWriter,以避免频繁的转换器调用。 例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
package com.itheima;
import java.io.FileInputStream;
import java.io.InputStreamReader;
/**
* 使用InputStreamReader读取文件,指定使用的编码
*/
public class TestInputStreamReader {
public static void main(String[] args) throws Exception{
//1.创建InputStreamReader类
FileInputStream fileInputStream = new FileInputStream("E:\\write.txt");
InputStreamReader isr = new InputStreamReader(fileInputStream,"utf-8");
//2.读取文件
int data = 0;
while ((data = isr.read()) != -1){
System.out.print((char)data);
}
//3.关闭
isr.close();
}
}
package com.itheima;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
/**
* 使用OutputStreamWriter 写入文件,指定使用的编码
*/
public class TestOutputStreamWriter {
public static void main(String[] args) throws Exception{
//1.创建OutputStreamWriter对象
FileOutputStream fileOutputStream = new FileOutputStream("E:\\info.txt");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
//2.写入
for (int i = 0; i < 10; i++) {
outputStreamWriter.write("可恶的假面骑士\r\n");
outputStreamWriter.flush();
}
//3。关闭
outputStreamWriter.close();
}
}