1、流的概念:内存与存储设备之间传输数据的通道
2、流的分类:
(1)方向(重点):
输入流:将存储设备中的内容读入到内存中。
输出流:将内存中的内容读入到存储设备中。
(2)单位:
字节流:以字节为单位,可以读写所有数据。
字符流:以字符为单位,只能读写文本数据。
(3)功能:
节点流:具有实际传输数据的读写功能。
过滤流:在节点流的基础上增强功能。
3、字节流:
字节流的父类
(1)InputStream(抽象类)
(2)OutputStream(抽象类)
字节节点流
(1)FileInputStream
(2)FileOutputStream
package com.t1.bytes;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileOutputStream {
public static void main(String[] args) throws IOException {
//1.输出字节流 OutputStream
//2.输出字节节点流 具有实际传输数据的功能 (文件路径,boolean append) true代表追加,不覆盖
//路径正确,但是文件不存在,则会自动创建一个文件
//绝对路径:"D:\\work\\target.txt" 必须存在!
//相对路径:"Files\\target.txt" 与上一种形式 等价。。 相对于当前项目的路径下,寻找该路径和文件
FileOutputStream fos = new FileOutputStream("Files\\target.txt");
// String s = "你";
//
// byte[] bs = s.getBytes();
// System.out.println(bs[0]+"\t"+bs[1]);
//
// fos.write(bs);
// fos.write(65); 输出单个字节
//
// fos.write(66);
//
// fos.write(67);
//
// fos.write('D');
// byte[] bytes = new byte[] {65,66,67,68,69,70,'G'};
// fos.write(bytes);//一次输出一组字节!
//字节数组 起始下标 长度
// fos.write(bytes, 1, 3);
}
}
字节过滤流
(1)BufferedOutputStream
(2)BufferedInputStream
(3)提供了IO效率,减少访问磁盘的次数。数据存放在缓冲区中。flush刷新缓冲区,提交数据
package com.qf.day31.t2.buff;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class TestBufferedOutput {
public static void main(String[] args)throws IOException {
//有参构造需要一个字节输出节点流
//先创建字节输出节点流
FileOutputStream fos = new FileOutputStream("Files\\buff.txt");
//增强节点流
BufferedOutputStream bos = new BufferedOutputStream(fos);
//过滤流的write方法,是先写入到缓冲区数组里!
bos.write('A');
bos.write('B');
bos.flush();//刷新缓冲区(将缓冲区的数据,一次性写入到文件中,并清空当前缓冲区)
bos.write('E');
bos.write('F');
// bos.flush();
bos.close();//级联的执行了flush(); 释放资源的同时,将缓冲器的数据一次性写入到文件里
//---------------------------------------------------------
FileInputStream fis = new FileInputStream("Files\\buff.txt");
// BufferedInputStream bis = new BufferedInputStream(fis);
byte[] bytes = new byte[100];
fis.read(bytes);
for (int i = 0; i < bytes.length; i++) {
System.out.println((char)bytes[i]);
}
}
}
4、字符编码
GBK 简体中文、扩展
UTF-8 针对Unicode的可变长度字符编码
GB2312 简体中文
当编码和解码方式不一致时,会出现乱码
5、字符流
字符流的父类
(1)Reader
(2)Writer
字符节点流
(1)FileWriter
(2)FileReader
字符过滤流
(1)BufferedWriter/PrintWriter
(2)BufferedReader
(3)支持写一行、读一行
6、字符节点流
桥转换流
(1)InputStreamReader
(2)OutputStreamWriter
(3)可将字节流转换为字符流,可设置编码方式(编码与解码要一致)
使用步骤
(1)创建节点流
(2)[创建过滤流,设置字符编码集]
(3)封装过滤流
(4)读写数据
(5)关闭流
package com.t2.chars;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class TestConvertStream {
public static void main(String[] args) throws Exception{
//1.字节输出流
OutputStream os = new FileOutputStream("Files\\convert.txt");//字节输出流
//编码 2.转换为字符输出流
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");//指定输出的数据 编码格式
//3.包装字符过滤流
PrintWriter pw = new PrintWriter(osw);
pw.println("你好世界");
pw.println("你好Java");
pw.println("你好Web");
pw.flush();
pw.close();
//--------------------------------
//1.字节输入流
InputStream is = new FileInputStream("Files\\convert.txt");
//解码 2.转换为字符输入流
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
//3.包装字符过滤流
BufferedReader br = new BufferedReader(isr);
while(true) {
String s = br.readLine();
if(s == null) {
break;
}
System.out.println(s);
}
br.close();
}
}
7、File
FileFilter接口
package com.t3.files;
import java.io.File;
import java.io.FileFilter;
public class TestListFiles {
public static void main(String[] args) {
File file = new File("D:\\BaiduNetdiskDownload");
// String[] fileNames = file.list();//获取文件夹中的所有文件(包含文件夹)的名字 String类型
//
// for(String fname:fileNames) {
// System.out.println(fname);
// }
File[] files = file.listFiles(new MyFilter());//获取文件夹中的所有文件(包含文件夹)的对象 File类型
System.out.println(files.length);
for(File f : files) {
System.out.println(f.getName());
}
}
}
class MyFilter implements FileFilter{
@Override
public boolean accept(File pathname) {//true就保存,false就过滤
if(pathname.isFile()) {
if(pathname.getName().endsWith(".doc")) {
return true;//保存
}
}
return false;//过滤
}
}