目录
注意
字符流复制文件时不能MP3,MP4,压缩包等文件, 必须用字节流复制
因为字符流会重新组合压缩包以压缩好的内容,形成新的内容,打开后文件会损坏
1.概述
-
简单来说 就是设备之间的数据传递称为流
-
流的本质
就是数据的传输,根据不同的数据传输特性,抽象出各种类,方便我们直接操作数据 -
InputStream
*
OutputStream
2.文件流
-
1 FileInputStream 字节输入
-
2 FileOutputStream 字节输出
-
3 FileReader 字符输入
-
4 FileWriter 字符输出
3.输入流
特别注意:
// 将输入流提出原因:内部作用域够不到finally的作用域.
// 赋值为null的原因:try中的代码可能不被执行,若不执行,则f为空指针,close调用时则出现空指针异常
// 需要被try围起来的原因是,路径可能会找不到
以下代码为输入流(字节)和文件输入流(字符)
// 将输入流提出原因:内部作用域够不到finally的作用域.
// 赋值为null的原因:try中的代码可能不被执行,若不执行,则f为空指针,close调用时则出现空指针异常
// 需要被try围起来的原因是,路径可能会找不到
FileInputStream f = null;
FileReader fr = null;
//写进try里可以自动关闭
try(FileInputStream f1 =new FileInputStream("src/day_19.rar");) {
// 标准输入流
f = new FileInputStream("src/day_19.rar");
// 文件输入流
fr = new FileReader("src/test");
// 读取一个字节,返回下一个字节的值
int i = 0;
// 字节输入流(read()只能传字节数组/单个字节)
byte[] b = new byte[1];
while ((i = f.read(b)) != -1) {
System.out.print(new String(b, 0, i));
}
// 文件输入流(read()只能传字符/单个字符)
char[] c = new char[1000];
if (fr.read(c) != -1) {
System.out.print(new String(c, 0, i));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
f.close();
fr.close();
}
4.输出流
以下代码为输出流(字节)和文件输出流(字符)
使用文件输出时记得用flush()清除缓存
try {
FileOutputStream fo = new FileOutputStream("src/test",true);
FileWriter fw = new FileWriter("src/test",true);
//写整型转为文件内显示char
// fo.write(1);
String str ="123";
//将字符串转换为字节流
byte [] b =str.getBytes();
//用字节流存入,字符输出
fo.write(b);
//文件流输出字符串
// fw.write(str);
//文件流输出必须加缓存输出
fw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
5.缓冲区
以下是输入缓冲区代码
public static void main(String[] args) {
try (FileReader fw = new FileReader("src/test");
//将输出对象传入缓冲区
BufferedReader fb = new BufferedReader(fw);) {
String str = null;
//新方法::调用缓冲区的按行输入方法
while ((str = fb.readLine()) != null) {
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
以下是输出缓冲区代码
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("src/test");
BufferedWriter bw = new BufferedWriter(fw);) {
String str = "123";
//新加方法可以输出一个换行
bw.newLine();
bw.write(str);
} catch (IOException e) {
e.printStackTrace();
}
}
6.转换流
将字节流转换为字符流
也就是把FileInputStream转换为FileReader
// 创建一个字节输入流对象
FileInputStream fis = new FileInputStream("src/test");
// 创建转换流对象 并把字节输入流传入,转换为字符流
InputStreamReader isr = new InputStreamReader(fis);
// 创建字符输入缓冲流,把转换流传入
BufferedReader br = new BufferedReader(isr);
){
String tmp = br.readLine();
System.out.println(tmp);
7.打印流
可以将标准输出更改输出地址
FileOutputStream fos = new FileOutputStream("D:/log.txt");
// 创建打印流,并传入输出流
PrintStream ps = new PrintStream(fos);
// 调用打印方法,打印到指定文件,输入打印内容
ps.println("日志系统");
// 可以设置System中的out(将打印的东西打印到哪里去)
System.setOut(ps);
// 设置到system中后,再使用打印语句 会打印到指定地方
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
System.out.println(sdf.format(new Date()));