IO框架

本文详细讲解了Java中字节流(如InputStream和OutputStream)与字符流(如Reader和Writer)的分类、节点流与过滤流的区别,以及File类和FileFilter接口的应用实例。涵盖了文件复制、对象序列化与反序列化、字符流处理和递归文件操作等内容。
摘要由CSDN通过智能技术生成

流的分类

按方向:

  • 输入流,存储设备------到内存
  • 输出流,内存------存储设备
    按单位:
  • 字节流:以字节为单位,可以读取所有数据
  • 字符流:以字符为单位,只能读写文本数据
    按功能:
  • 节点流:具有实际传输数据的读写功能
  • 过滤流:在节点流的基础之上增强功能

字节流

字节流的父类(抽象类):

  • 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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值