二、缓冲流
自带缓冲区的流
缓冲流会将字节(字符)先写到一个缓冲区中,然后通过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() 特有方法 这个方法如果读取完了,会返回null
String 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);