目录
一、转换流OutputStreamWriter
java.io.OutputStreamwriter类,继承Writer类,他是字符输出流,只能操作文本文件,不能操作其他类型文件。OutputStreamwriter是字符流通向字节流的桥梁(字符流转成字节流),使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
- OutputStreamWriter构造方法
- OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流
- OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");
- 写出数据方法
- void write(int c)写出单个字符
- void write(char[] ch)写出字符数组
- void write(char[] ch,int off,int len)写出字符数组一部分,开始索引和写出的个数
- void write(String s)写入字符串
- void flush()`刷新该流的缓冲,字符流写数据会先写在内存中,刷新后才会到达目的文件
/**
* 字符输出流 java.io.OutputStreamWriter 继承Writer类
* Writer类: 具备写入数据的方法 write
* write(int c)写入单个字符
* write(char[] c)写入字符数组
* write(char[] c,int off,int len)写入字节数组一部分,开始索引,写入的个数
* write(String str) 写入字符串
* OutputStreamWriter类称为转换流: 字符流通向字节流的桥梁,字符转成字节
*转换: 字符,查询编码表,得到字节,交给字节流处理
* 注意: 字符流写入数据: 数据写入到内存中,而不是目的文件
* 字符输出流父类 Writer,提供方法 flush()刷新,数据从内存中刷新到目的文件
*/
public class Demo {
public static void main(String[] args) throws IOException {
//writeUTF();
writeGBK();
}
/*
使用转换流OutputStreamWriter,将汉字写入文本文件
采用编码表是UTF-8
构造方法:OutputStreamWriter(OutputStream out) 传递字节输出流 new FileOutputStream
*/
public static void writeUTF()throws IOException {
//创建字节输出流
FileOutputStream fos=new FileOutputStream("d:\\sp\\utf.txt");
//创建转换流对象,构造方法中,传递字节输出流
OutputStreamWriter osw=new OutputStreamWriter(fos);
//转换流方法write写入数据
osw.write("你好");
//osw.flush();
osw.close();//关闭流,刷新
}
/*
使用转换流OutputStreamWriter,将汉字写入文本文件
采用编码表是GBK
构造方法:
OutputStreamWriter(OutputStream out,String 编码表名字) 传递字节输出流 new FileOutputStream
*/
public static void writeGBK()throws IOException{
//创建字节输出流
FileOutputStream fos=new FileOutputStream("d:\\sp\\gbk.txt");
//创建转换流对象,构造方法传递字节输出流,传递字符串编码表
OutputStreamWriter osw=new OutputStreamWriter(fos,"GBK");
osw.write("你好");
osw.close();
}
}
二.转换流InputStreamReader
java.io.InputStreamReader类,继承Reader类,他是字符输入流,只能操作文本文件,不能操作其他类型文件。InputStreamReader是字节流通向字符流的桥梁(字节流转成字符流),使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
- InputStreamReader构造方法
- InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流
- InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流
InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
- InputStreamReader读取数据方法
- int read()读取单个字符,读取到文件末尾时返回-1
- int read(char[] ch)读取字符存储到数组中个,返回读取到的字符个数,读取到文件末尾时返回-1
/**
* @create 2022-02-19 14:57
* java.io.InputStreamReader 继承Reader 字符输入流
* InputStreamReader字符输入流,父类Reader定义好的读取的方法
* int read()读取单个字符
* int read(char[] c)读取字符,存储在数组中
* InputStreamReader是转换流, 字节流通向字符流的桥梁,字节转成字符
*/
public class Demo {
public static void main(String[] args) throws IOException {
//readUTF();
writeGBK();
}
/*
InputStreamReader转换流,读取文本文件
使用编码表UTF-8
构造方法:InputStreamReader(InputStream in) 传递字节输入流,new FileInputStream
*/
public static void readUTF()throws IOException {
//创建字节输入流
FileInputStream fis=new FileInputStream("d:\\sp\\utf.txt");
//创建转换流对象
InputStreamReader isr=new InputStreamReader(fis);
char[] ch=new char[1024];
int len=0;
while((len=isr.read(ch))!=-1){
//数组转成字符串打印
System.out.println(new String(ch,0,len));
}
isr.close();
}
/**
InputStreamReader转换流,读取文本文件
使用编码表GBK
构造方法:InputStreamReader(InputStream in,String 编码表名) 传递字节输入流new FileInputStream
*/
public static void writeGBK()throws IOException{
//创建字节输入流对象
FileInputStream fis=new FileInputStream("d:\\sp\\gbk.txt");
//创建转换流对象,构造方法传递字节输入流,指定使用编码表
InputStreamReader isr=new InputStreamReader(fis,"gbk");
char[] ch=new char[1024];
int len=0;
while( (len = isr.read(ch)) !=-1){
//数组转成字符串打印
System.out.println(new String(ch,0,len));
}
}
}
三.字符流便捷类
使用转换流进行文本文件的读写可以进行编码表的设置,但是我们经常使用的是平台默认的编码表进行文本文件操作的,因此可以选择字符流的便捷类来使用。
FileWriter继承OutputStreamWriter,使用平台默认编码表写出数据。
FileReader继承InputStreamReader,使用平台默认编码表读取数据。
- FileWriter类构造方法
- FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象
- FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称
/**
* 字符输出流使用的便捷类
* java.io.FileWriter 写入文本文件 继承Writer
* FileWriter继承转换流OutputStreamWriter
* OutputStreamWriter父类,可以指定编码表
* FileWriter子类,只能使用默认的编码表
* write写入数据的方法:
* 写入单个字符,字符数组,字符串
* 构造方法,传递字符串的文件名
*/
public class Demo {
public static void main(String[] args) throws IOException {
//创建字符输出流的便捷流
FileWriter fw=new FileWriter("d:\\sp\\123.txt");
//写入数据
fw.write(97);//单个字符
char[] ch="helloWorld".toCharArray();
fw.write(ch);
fw.write("呵呵哈哈");
fw.close();
}
}
/**
* 字节流写入数据: 追加和换行
* 流对象构造方法,第二个参数true
* 换行问题:
* Windows: \r\n
* Linux: \n
* Mac: \r
*/
public class FileWriterDemo02 {
public static void main(String[] args) throws IOException{
//追加写入
FileWriter fw = new FileWriter("e:/456.txt",true);
fw.write("第一行\r\n");
fw.write("第二行");
fw.close();
}
}
- FileReader类的构造方法
- FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
- FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。
/**
* java.io.FileReader 读取字符文件的便捷类
* 继承 InputStreamReader ,继承Reader
* FileReader读取文本文件,不能改变编码表的,使用默认的UTT-8
* 构造方法:FileReader(String 文件名)
*/
public class Demo {
public static void main(String[] args) throws IOException {
//创建字符输入流的便捷流类对象
FileReader fr=new FileReader("d:\\sp\\utf.txt");
char[] ch=new char[1024];
int len=0;
while((len=fr.read(ch)) !=-1){
System.out.println(new String(ch,0,len));
}
fr.close();
}
}