1、转换流: InputStreamReader , OutputStreamWriter
【1】转换流:作用:将字节流和字符流进行转换。
【2】转换流 属于 字节流还是字符流? 属于字符流
InputStreamReader :字节输入流 —> 字符的输入流
OutputStreamWriter : 字符输出流 —> 字节的输出流
【3】图解:
输入输出——是相对于程序来说的。
理解:
InputStreamReader —— 把输入方向的字节流转换成输入方向的字符流;
OutputStreamWriter —— 把输出方向的字符流转换成输出方向的字节流。
【4】将输入的字节流转换为输入的字符流,然后完成文件到程序(的查看):
代码示例:以下代码实现了上图左侧的转换
package test5_;import java.io.*;/*** @Auther: zhoulz* @Description: test5_* @version: 1.0*/
public class Test1 {public static void main(String[] args) throws IOException {//文件---》程序://1.有一个源文件File f = new File("d:\\Test.txt");//2、需要一个输入的字节流接触文件:FileInputStream fis = new FileInputStream(f);//3、加入一个转换流,将字节流转换为字符流:(转换流属于一个处理流)//将字节转换为字符的时候,需要指定一个编码,这个编码跟文件本身的编码格式统一//如果编码格式不统一的话,那么在控制台上展示的效果就会出现乱码//InputStreamReader isr = new InputStreamReader(fis,"utf-8");//换成gbk格式就会出错//如果不指定编码的话,则会(自动)获取程序本身的编码:utf-8,因为提供了这样的一个构造器InputStreamReader isr = new InputStreamReader(fis);//4、开始动作,将文件中内容显示在控制台char[] ch = new char[20];int len = isr.read(ch);while (len != -1){//System.out.println(ch);//System.out.println(len);//将缓冲数组转为字符串在控制台上打印出来System.out.print(new String(ch,0,len)); //注意,不用换行len = isr.read(ch);}//5、关闭流isr.close();}
}
2、转换流:InputStreamReader,OutputStreamWriter
—— 实现文本文件的复制
代码示例:
package test5_;import java.io.*;/*** @Auther: zhoulz* @Description: test5_* @version: 1.0*/
public class Test2 {public static void main(String[] args) throws IOException {//1、有一个源文件File f1 = new File("d:\\Test.txt");//2、有一个目标文件File f2 = new File("d:\\Demo.txt");//3、输入方向FileInputStream fis = new FileInputStream(f1);InputStreamReader isr = new InputStreamReader(fis,"utf-8");//4、输出方向FileOutputStream fos = new FileOutputStream(f2);OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");//5、开始动作:char[] ch = new char[20];int len = isr.read(ch);while (len != -1){osw.write(ch,0,len);len = isr.read(ch);}//6、关闭流osw.close();isr.close();}
}
3、System类对IO流的支持
【1】System的属性:
System.in : “标准”输入流。---》默认情况下 从键盘输入
System.out :“标准”输出流。 ---》默认情况下,输出到控制台。
【2】System.in :“标准”输入流。---> 默认情况下 从键盘输入
代码示例:
package test5_;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;/*** @Auther: zhoulz* @Description: test5_* @version: 1.0*/
public class Test3_System_in {public static void main(String[] args) throws IOException {//得到的是标准的输入流 —> 从键盘输入/*InputStream in = System.in;//调用方法:int n = in.read();//read方法等待键盘的录入,所以这个方法是一个阻塞方法。System.out.println(n);*///以前案例:从键盘录入一个int类型的数据://从上面的代码证明,键盘录入实际上是:System.in//形象的理解:System.in是一根管,这个管怼到键盘上去了,所以你从键盘录入的话,就从这个管到程序中了//Scanner的作用:扫描器:起扫描作用的,扫键盘录入的从这根管出来的数据/*Scanner sc = new Scanner(System.in);int i = sc.nextInt();System.out.println(i);*///既然Scanner是扫描的作用,那就不一定非得扫System.in进来的东西,//还可以扫描其他管的内容,如:Scanner sc = new Scanner(new FileInputStream((new File("d:\\Test.txt"))));//只要下面有东西,就进行输出while (sc.hasNext()){ //用if的话会只读一部分System.out.println(sc.next());}}
}
【3】System.out :返回的输出流 、 打印流(PrintStream)
代码示例:
package test5_;import java.io.PrintStream;/*** @Auther: zhoulz* @Description: test5_* @version: 1.0*/
public class Test4_System_out {public static void main(String[] args) {//写到控制台PrintStream out = System.out;//调用方法out.print("你好1");//直接在控制台写出,但是不换行out.print("你好2");out.print("你好3");out.print("你好4");out.println("中国人1");//直接在控制台写出,并且换行操作out.println("中国人2");out.println("中国人3");out.println("中国人4");System.out.println("你好");System.out.println("中国人");}
}
4、练习:键盘录入内容输出到文件中
【1】解决思路:
【2】代码:
package test5_;import java.io.*;/*** @Auther: zhoulz* @Description: test5_* @version: 1.0*/
public class Test5_a_case {public static void main(String[] args) throws IOException {//1、先准备输入方向//键盘录入:InputStream in = System.in; //System.in属于字节流!!!//字节流 ——> 字符流:InputStreamReader isr = new InputStreamReader(in);//在isr外面再套一个缓冲流:BufferedReader br = new BufferedReader(isr);//2、再准备输出方向//准备目标文件File f = new File("d:\\Demo.txt");FileWriter fw = new FileWriter(f);BufferedWriter bw = new BufferedWriter(fw);//3、开始动作String s = br.readLine();while (!s.equals("exit")){//条件是:s != null的话,则会一直录入bw.write(s);bw.newLine();//文件中换行s = br.readLine();}//4、关闭流bw.close();br.close();}
}