一(转换流)
在JDK中,提供了2个类用于字节流和字符流的转换:InputStreamReader和OutputStreamWriter,InputStreamReader:将InputStream转为Reader,实现将字节输入流转换为字符输入流。OutputStreamWriter:将Writer转为OutputStream,实现将字符输出流转换为字节输出流。同时,转换流也属于高级流。通过转换流进行数据读写的过程如下图所示:
注意:在使用转换流时,只能针对操作文本文件的字节流进行转换,如果字节流操作的是字节码内容的文件(如图片、视频等),此时转换为字符流就会造成数据丢失
案例: 将D盘下编码为utf-8的aaa.txt文件数据复制到编码为gbk的bbb.txt文件中
package IO流;
import java.io.*;
public class Demo11 {
public static void main(String[] args) throws IOException {
//1.创建流
InputStreamReader isr=new InputStreamReader((new FileInputStream("D:\\aaa.txt")),"utf-8");
OutputStreamWriter osr=new OutputStreamWriter(new FileOutputStream("D:\\bbb.txt"),"gbk");
//2.读写数据
char[] chs=new char[10];
int len;
while((len=isr.read(chs))!=-1){
osr.write(chs,0,len);
}
//3.关流
isr.close();
osr.close();
}
}
二(打印流)
PrintWriter:具有自动行刷新的缓冲字符输出流,也是一个高级流。
特点1.可以按行写出字符串。2.可以自动行刷新。
实际上包含字节流 字符流 字符缓冲流
字符缓冲输出流BufferedWriter-----负责提供高效率
转换流OutputStreamWriter -----负责操作字符
字节输出流FileOutputStream----负责操作字节
案例:
package IO流;
import javafx.scene.transform.Scale;
import java.io.*;
import java.util.Scanner;
public class PWdemo {
public static void main(String[] args)throws IOException {
//1.创建流
PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src\\pd.txt"))));
//2.读写数据
String str=null;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要写入的数据");
while(true){
str=scanner.nextLine();
//输入exit则退出循环
if(str.equals("exit")){
break;
}
pw.println(str);
}
//3.关流
pw.close();
}
}
三(数据流)
为了方便地操作java语言的基本数据类型和String类型的数据,JDK提供了2种流:DataInputStream和DataOutputStream。
案例:往data.txt文件写入数据再读取
package IO流;
import java.io.*;
public class DataDemo {
public static void main(String[] args)throws IOException {
//1.创建DataOutputStream
DataOutputStream dos=new DataOutputStream(new FileOutputStream("src\\data.txt"));
//2.写入数据
dos.writeBoolean(true);
dos.writeDouble(6.6);
dos.writeUTF("哈哈哈哈哈");//writeUTF是写字符串的方法
//5.关流
dos.close();
//3.创建DataInputStream
DataInputStream dis=new DataInputStream(new FileInputStream("src\\data.txt"));
//4.读取数据
boolean b=dis.readBoolean();
System.out.println(b);
double d=dis.readDouble();
System.out.println(d);
String s=dis.readUTF();//readUTF是读字符串的方法
System.out.println(s);
//5.关流
dis.close();
}
}