流的分类
按方向:
- 输入流,存储设备------到内存
- 输出流,内存------存储设备
按单位: - 字节流:以字节为单位,可以读取所有数据
- 字符流:以字符为单位,只能读写文本数据
按功能: - 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础之上增强功能
字节流
字节流的父类(抽象类):
- InputStream:字节输入流
- read()
- read(byte[] )
- read(byte[] int ,int ) - OutputStream:字节输出流
- write(int )
- write(byte[] )
- write(byte[], int,int)
字节节点流
- FileOutputStream:
write(byte[]) - FileInputStream:
read(byte[]) 读完返回-1
案例:复制文件
/**
* 使用文件字节流实现文件的复制
*/
public class Demo3 {
public static void main(String[] args) throws Exception{
//1创建流
//1.1文件字节输入流
FileInputStream fis=new FileInputStream("d:\\001.jpg");
//1.2文件字节输出流
FileOutputStream fos=new FileOutputStream("d:\\002.jpg");
//2一边读,一边写
byte[] buf=new byte[1024];
int count=0;
while((count=fis.read(buf))!=-1) {
fos.write(buf,0,count);
}
//3关闭
fis.close();
fos.close();
System.out.println("复制完毕");
}
}
字节过滤流
- 建立在字节节点流之后:
FileInputStream fis=new FileInputStream("d:\\aaa.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
- 缓冲流:
BufferedOutputStream
BufferedInputStream - write()写到缓冲区,在从缓冲区flush()到目标文件或close()
- 对象流:使用流传输对象的过程叫序列化、反序列化
ObjectOutputStream
ObjectInputStream
readObject()
writeObject(Object )
案例:
/**
* 使用ObjectOutputStream实现对象的序列化
* 注意事项:
* (1)序列化类必须要实现Serializable接口
* (2)序列化类中对象属性要求实现Serializable接口
* (3)序列化版本号ID serialVersionUID,保证序列化的类和反序列化的类是同一个类
* (4)使用transient(瞬间的)修饰属性,这个属性不能序列化
* (5)静态属性不能被序列化
* (6)序列化多个对象,可以借助集合实现
*/
public class Demo6 {
public static void main(String[] args) throws Exception{
//1创建对象流
FileOutputStream fos=new FileOutputStream("d:\\stu.bin");
ObjectOutputStream oos=new ObjectOutputStream(fos);
//2序列化(写入操作)
Student zhangsan=new Student("张三", 20);
Student lisi=new Student("李四", 22);
ArrayList<Student> list=new ArrayList<>();
list.add(zhangsan);
list.add(lisi);
oos.writeObject(list);
//3关闭
oos.close();
System.out.println("序列化完毕");
}
}
----------------------------------------------------
**
* 使用ObjectInputStream实现反序列化(读取重构成对象)
*/
public class Demo7 {
public static void main(String[] args) throws Exception {
//1创建对象流
FileInputStream fis=new FileInputStream("d:\\stu.bin");
ObjectInputStream ois=new ObjectInputStream(fis);
//2读取文件(反序列化)
// Student s=(Student)ois.readObject();
// Student s2=(Student)ois.readObject();
ArrayList<Student> list=(ArrayList<Student>)ois.readObject();
//3关闭
ois.close();
System.out.println("执行完毕");
// System.out.println(s.toString());
// System.out.println(s2.toString());
System.out.println(list.toString());
}
}
对象序列化
- 对象序列化细节
- 必须实现Serializable接口
- 必须保证其所有属性均可序列化
- transient修饰为临时属性,不参与序列化。
- 读取到文件尾部标志:java.io.EOFException
字符流
- Reader:字符输入流
- read();
- read(char[] )
- read(char[] ,int,int)
- Writer:字符输出流
- write(int )
- write(String )
- write(char[] )
字符节点流
- FileWriter :
- write(String ) - FileReader:
- read(char[] )
案例:
/**
* 使用FileReader和FileWriter复制文本文件,不能复制图片或二进制文件
* 使用字节流复制任意文件。
*/
public class Demo4 {
public static void main(String[] args) throws Exception{
//1创建FIleReader FileWriter
FileReader fr=new FileReader("d:\\001.jpg");
FileWriter fw=new FileWriter("d:\\003.jpg");
//2读写
int data=0;
while((data=fr.read())!=-1) {
fw.write(data);
fw.flush();
}
//3关闭
fr.close();
fw.close();
System.out.println("复制完毕");
}
}
字符过滤流
- 缓冲流:
- BufferedWriter
- BufferedReader
支持输入换行符,可一次写一行,读一行
FileReader fr=new FileReader("d:\\write.txt"); BufferedReader br=new BufferedReader(fr);
- PrintWriter:
封装了print()/println()方法
字符节点流
- 桥转换流:
- InputStreamReader
FileInputStream fis=new FileInputStream("d:\\write.txt"); InputStreamReader isr=new InputStreamReader(fis, "gbk");
- OutputStreamWriter
- 可将字节流转为字符流
- 可设置字符的编码方式
使用步骤
- 创建节点流
- 创建过滤流,设置字符编码集
- 封装过滤流
- 读写数据
- 关闭流
File类
代表物理盘符中的一个文件或文件夹
- 方法:
- createNewFile()创建文件夹
- mkdir()创建新目录
- Delete()删除文件或空目录
- exists()判断File对象所代表的对象是否存在
- getAbsolutePath()获取文件的绝对路径
- getName()获取名字
- getParent()获取文件/目录所在目录
- isDirectory()是否是目录
- isFile()是否是文件
- length()文件长度
- listFiles()目录中的所有内容
- renameTo()修改文件名为
案例:
/**
* 案例1:递归遍历文件夹
* 案例2:递归删除文件夹
*/
public class ListDemo {
public static void main(String[] args) {
listDir(new File("d:\\myfiles"));
deleteDir(new File("d:\\myfiles"));
}
//案例1:递归遍历文件夹
public static void listDir(File dir) {
File[] files=dir.listFiles();
System.out.println(dir.getAbsolutePath());
if(files!=null && files.length>0) {
for (File file : files) {
if(file.isDirectory()) {
listDir(file);//递归
}else {
System.out.println(file.getAbsolutePath());
}
}
}
}
//案例2:递归删除文件夹
public static void deleteDir(File dir) {
File[] files=dir.listFiles();
if(files!=null&&files.length>0) {
for (File file : files) {
if(file.isDirectory()) {
deleteDir(file);//递归
}else {
//删除文件
System.out.println(file.getAbsolutePath()+"删除:"+file.delete());
}
}
}
System.out.println(dir.getAbsolutePath()+"删除:"+dir.delete());
}
}
FileFilter接口
- boolean accept(File )
- 调用listFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤。
Properties:属性集合
- 存储属性名和属性值
- 属性名和属性值都是字符串类型
- 没有泛型
- 和流有关。
案例:
/**
* 演示Properties集合的使用
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
//1创建集合
Properties properties=new Properties();
//2添加数据
properties.setProperty("username", "zhangsan");
properties.setProperty("age", "20");
System.out.println(properties.toString());
//3遍历
//3.1-----keySet----
//3.2-----entrySet----
//3.3-----stringPropertyNames()---
Set<String> pronames=properties.stringPropertyNames();
for (String pro : pronames) {
System.out.println(pro+"====="+properties.getProperty(pro));
}
//4和流有关的方法
//----------list方法---------
// PrintWriter pw=new PrintWriter("d:\\print.txt");
// properties.list(pw);
// pw.close();
//----------2store方法 保存-----------
FileOutputStream fos=new FileOutputStream("d:\\store.properties");
properties.store(fos, "注释");
fos.close();
//----------3load方法 加载-------------
Properties properties2=new Properties();
FileInputStream fis=new FileInputStream("d:\\store.properties");
properties2.load(fis);
System.out.println(properties2.toString());
fis.close();
}
}