字符流
1.什么是字符流:
(1) 字符流是以字符为单位读取文件中的数据
(2) 字符流更加适合操作字符文件(如:txt,java,properties)
(3) 文本文件是有编码方式的,常用的编码集:
(1) ISO-8859-1:西方编码,不支持中文
(2) GBK:中国标准编码,支持简体中文,也支持繁体中文
(3) GB2312:中国标准编码,只支持简体中文
(4) UTF-8:国际编码,支持全球所有国家的语言
(5) Unicode:Java使用的编码
(6) ANSI:表示使用平台编码(GBK|GB2312)
(4) 文本文件是有编码的,在使用IO操作文本文件时必须考虑编码问题,编码不同中文就会出现乱码
(5) 在使用IO流操作文件时,需要进行编码转换,因为Java所使用的编码和文本文件的编码是不对应
(1) 将Java的Unicode编码转换为文本文件的编码,我们称为解码
(2) 将文本文件的编码转换为Java的Unicode编码,我们称为编码
(6) Java默认使用UTF-8编码进行编码或解码(转换)
2.字节流到字符流的桥接流(InputStreamReader,OutputStreamWriter)
(1) 将字节转换字符的一个转换流
(2) 字节到字符的桥接流使用更加灵活,它可以根据需要设置编码集
(3) 在使用时可以通过InputStreamReader设置外部文件以指定的编码方式转换为Java的Unicode编码
(4)在使用时可以通过OutputStreamWriter设置Java的Unicode编码以指定的编码方式转换为外部文件的内容
3.字符流的使用
( 1) 字符流是字节到字符转换流的简洁实现
(2) 字符流将转换时所使用的编码固定了,如果和外部文件的编码不一致则会出现乱码,此时需要使用字节到字符的转换流进行处理
(3) 字符流有两个抽象类Reader和Writer,我们在使用时使用他们的子类FileReader,FileWriter
(4) FileWriter使用UTF-8编码将Java的Unicode编码转换为外部文件编码,如果外部文件编码使用的不是UTF-8则会出现乱码
(5) FileReader使用UTF-8编码将外部文件的字符转换Java的Unicode编码,如果外部文件编码使用的不是UTF-8则会出现乱码
4.带有缓冲区的字符流(包装流)
(1) BufferedReader带有缓冲区的字符输入流和BufferedWriter带有缓冲区的字符输出流
(2) 带有缓冲区的字符流中提供很方便的操作字符文件的方法(推荐使用)
(3) BufferedReader的方法:
readLine():读取一行字符数据,读到换行符结束
(4) BufferedWriter的方法:
(1) write(String str):输出一行数据但不换行
(2) newLine():输出一个换行符
案例
1.字符流的使用
package io.字符流;
import java.io.*;
public class 字符流的使用 {
public static void main(String[] args) throws IOException {
readerDemo();
}
/**
* 字符输出流
*/
public static void writerDemo() throws IOException {
//创建字符输出流对象,FileWriter使用UTF-8编码,如果外部文件的编码不是UTF-8就会出现乱码
Writer writer = new FileWriter("f:/abc.txt",true);
writer.write("字符输出流能看明白吗?");
writer.close();
}
/**
* 字符输入流
*/
public static void readerDemo() throws IOException {
//创建字符输入流对象
Reader reader = new FileReader("f:/abc.txt");
char[] cs = new char[1024];
//将外部文件的字符读入到字符数组中,返回实际读取的字符数
int len = reader.read(cs);
//将字符数组转换为字符串
String str = String.valueOf(cs,0,len);
System.out.println(str);
reader.close();
}
}
2.带有缓冲区的字符流
package io.字符流;
import java.io.*;
public class 带有缓冲区的字符流 {
public static void main(String[] args) throws IOException {
bufferedWriter();
}
/**
* 带有缓冲区的字符输出流
*/
public static void bufferedWriter() throws IOException {
//创建带有缓冲区的字符输出流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("f:/abc.txt",true),"GBK"));
//输出一个字符串
bufferedWriter.write("带有缓冲区的字符输出流!");
//输出换行符
bufferedWriter.newLine();
bufferedWriter.write("字符流结束,能明白多少呢?");
bufferedWriter.close();
}
/**
* 带有缓冲区的输入流
*/
public static void bufferedReader() throws IOException {
//创建带有缓冲区的输入流对象
//BufferedReader bufferedReader = new BufferedReader(new FileReader("f:/abc.txt"));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("f:/mysql5.7解压缩安装.txt"),"GBK"));
//一次读取一行数据,返回字符串
/*String str = bufferedReader.readLine();
System.out.println(str);*/
//循环读取文件的内容
String str = null;
while((str = bufferedReader.readLine())!=null){
System.out.println(str);
}
bufferedReader.close();
}
}
3.字节到字符桥节流的使用
package io.字符流;
import java.io.*;
public class 字节到字符桥节流的使用 {
public static void main(String[] args) throws IOException {
inputStreamReaderDemo();
}
/**
* 字节到字符输入流
*/
public static void inputStreamReaderDemo() throws IOException {
InputStream inputStream = new FileInputStream("f:/abc.txt");
//在字节到字符转换流中可以设置转换的编码集,此时外部文件的内容会以此处设置的编码转换为Java的Unicode编码
InputStreamReader reader = new InputStreamReader(inputStream,"GBK");
//Java默认使用UTF-8编码将文件中的内容转换Java的Unicode编码
char[] cs = new char[1024];
int len = reader.read(cs);
String str = String.valueOf(cs,0,len);
System.out.println(str);
reader.close();
}
/**
* 字节到字符的输出流
*/
public static void outputStreamWriterDemo() throws IOException {
//创建字节输出流对象
OutputStream outputStream = new FileOutputStream("f:/abc.txt",true);
/**
* 使用字节输出流对象创建字节到字符的转换流对象
* 默认使用UTF-8编码向文件中写出内容
* 可以使用字节到字符的输出流设置向文件中写出内容时的编码集
*/
OutputStreamWriter writer = new OutputStreamWriter(outputStream,"GBK");
writer.write("你好,吃了吗?");
writer.close();
}
}
4.使用字节流读取文本文件
package io.字符流;
import java.io.*;
/**
* 字节输入流实例-将磁盘上文件中的数据读入到程序中
*/
public class 使用字节流读取文本文件 {
public static void main(String[] args) throws IOException {
/**
* 创建输入流对象,并指定要读取的文件
*/
InputStream inputStream = new FileInputStream("f:/mysql5.7解压缩安装.txt");
OutputStream outputStream = new FileOutputStream("f:/abc.txt",true);
//解码,将Java的Unicode编码转换外部文件的编码(GBK)
outputStream.write("你好".getBytes("GBK"));
outputStream.close();
//读取一个字节,该字节为一个整数
/*int num = inputStream.read();*/
//声明一个用于存储读取字节的缓冲区(字节数组)
// byte[] buf = new byte[1024];
/**
* 读取数据,读取缓冲区指定大小的数据
* 返回实际读取字节的数量(长度),如果未读取到数据则返回-1
*/
//int len = - 1;
//循环读取文件中的数据,当len的值为-1时表示读取结束
/*while((len=inputStream.read(buf,0,buf.length))!=-1){
*//**
* 将字节数组中的字节转换字符串
* 指定转换的起始下标,及转换长度
*
* 此处的意思是将GBK的文件转换Java的Unicode编码
*//*
String str = new String(buf,0,len,"GBK");
System.out.println(str);
}*/
inputStream.close();//关闭输入流
}
}