二、缓冲流
自带缓冲区的流
缓冲流会将字节(字符)先写到一个缓冲区中,然后通过flush()或者关闭这个缓冲流来实现将缓冲流中的数据回显。
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
四种缓冲流使用方法差不多
缓冲流可以用方法直接读取,不用建立字节(字符)数组,底层效率不高,但代码编写效率高。
1、java.io.BufferedReader
转换流 可以将字节流转换成字符流或者反之 InputStreamReader / OutputStreamWriter
package com.jy.io2;import java.io.*;/*** 缓冲流 自带缓冲区,可以一次性读取多个字节**包装流和节点流 new 流1(new 流2(new 流3()))外面的是包装流,里面的是节点流,流2相对流3是包装流,相对流1是节点流,* 流1相对流2是包装流** 在关闭流对象时,只需要关闭最外层的包装流即可*/public class IOTest03 {public static void main(String[] args) throws IOException {BufferedReader bufferedReader =null;FileInputStream fileInputStream = null;InputStreamReader inputStreamReader = null;//创建文件输入流try {//FileReader fileReader = new FileReader("E:\\Temp\\io05.java");fileInputStream = new FileInputStream("E:\\Temp\\io04.java");//通过转换流将字节流转换成字符流,本身就是字符流就不用转换inputStreamReader = new InputStreamReader(fileInputStream);//BufferedReader 包装流//fileReader 属于节点流bufferedReader = new BufferedReader(inputStreamReader);// new BufferedReader(new InputStreamReader(new FileInputStream("E:\\Temp\\io04.java")))//read()方法是都有的,这里介绍特有的方法//读取一行readLine() 特有方法 这个方法如果读取完了,会返回nullString s1 = null;while((s1 = bufferedReader.readLine()) != null){System.out.println(s1);}} catch (Exception e) {e.printStackTrace();}finally {bufferedReader.close();}}}
2、java.io.BufferedWriter
public class IOTest04 {public static void main(String[] args) throws IOException {//创建缓冲流对象BufferedWriter bufferedWriter =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io01.txt")));//完成数据的写入bufferedWriter.write("你好,柿子");//关闭流bufferedWriter.close();}}
三、数据流
在写文件时(DataOutputStream),是以加密的形式写入,普通记事本打不开,写入文件时,会连同数据的数据类型一起写入。
在读文件时,只能采用DataInputStream去读取
java.io.DataInputStream
java.io.DataOutputStream
1、java.io.DataInputStream
public class IOTest05 {public static void main(String[] args) throws IOException {//创建数据流对象,DataOutputStream参数为字节流输出对象,即包装流与节点流DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("io02.txt"));//写入数据时一定要连同数据的数据类型一起写入int i = 10;char c = 'h';boolean flag = true;dataOutputStream.writeInt(i);dataOutputStream.writeChar(c);dataOutputStream.writeBoolean(flag);dataOutputStream.flush();dataOutputStream.close();}}
2、java.io.DataOutputStream
读取的顺序要和写入的顺序一样
public class IOTest06 {public static void main(String[] args) throws Exception {DataInputStream dataInputStream = new DataInputStream(new FileInputStream("io02.txt"));int i = dataInputStream.readInt();char c = dataInputStream.readChar();boolean b = dataInputStream.readBoolean();System.out.println(i);System.out.println(c);System.out.println(b);dataInputStream.close();}}
四、标准输出流
PrintWriter
PrintStream
字节流和字符流对应的标准输出流使用方法相同。
作用:控制台打印、日志记录
控制台打印实际上采用的就是标准输出流
System.out.println("你好,柿子");PrintStream out = System.out;out.println("你好,柿子");
采用标准输出流完成日志记录的话,第一步,改变标准输出流的输出方向,标准输出流会默认打印在控制台上,默认输出路径是控制台。
PrintStream
public class IOTest07 {public static void main(String[] args) throws Exception {PrintStream printStream = new PrintStream(new FileOutputStream("io03.txt"));//更改输出方向 更改为硬盘上的文件System.setOut(printStream);//此时再打印就被保存在io03.txt文件里,而不是控制台输出System.out.println("你好,柿子");}}
创建日志工具类
/*** 根据标准输出流创建日志工具类*/public class LoggerUtil {//私有化构造方法private LoggerUtil(){}//记录日志的方法public static void Logger(String message){//创建标注输出流对象try {//创建标注输出流对象PrintStream printStream = new PrintStream(new FileOutputStream("logger",true));//设置输出方向System.setOut(printStream);Date date = new Date();//日期格式化SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//将日期转换为字符串String dateTime = simpleDateFormat.format(date);System.out.println(dateTime+" "+message);} catch (FileNotFoundException e) {e.printStackTrace();}}}
日期常用类
//获取当前时间Date date = new Date();//日期格式化SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//将日期转换为字符串String dateTime = simpleDateFormat.format(date);System.out.println(dateTime);
