Java IO流 、序列化与反序列化

这篇博客详细介绍了Java中的File类,包括其功能、路径分隔符、构造方法和常用方法。然后深入探讨了IO流的分类,包括字节流、字符流及其子类,如FileInputStream、FileOutputStream、FileReader和FileWriter。此外,讲解了如何使用缓冲流提高读写效率,以及转换流的作用。最后,讨论了对象流的序列化和反序列化过程,强调了对象必须实现Serializable接口的重要性。
摘要由CSDN通过智能技术生成

File

位于Java.io包,表示文件或文件夹

Java是跨平台的,不同的操作系统路径的分隔符不一样 window:\ linux,max:/

Java中写路径时使用 / Linux和max都能识别,\在Java中表示转义

File类是“文件和目录路径名的抽象表示”。而不是指文件的内容。

File的功能

对文件或者文件夹进行 创建, 删除,查看等操作, 但是不能读取文件的内容

(只能对文件本身进行操作,不能对文件内容操作)
区分不同的操作系统

使用File的静态常量 public static final String separator

path分隔符

Linux操作系统 : window ;

public static final char pathSeparatorChar

File构造方法

在这里插入图片描述

//完整路径
File file = new File("D:/test.txt");

//上级目录
File file1 = new File("D:/图片","1.jpg");
//也可以这样
File parent = new File("D:/图片");
File file2 = new File(parent, "1.jpg");

//文件夹
File file3 = new File("D:\\nginx-1.18.0\\conf");
常见方法

判断文件或者文件夹是否存在 public boolean exists()

在这里插入图片描述


 //判断文件/文件夹是否存在
 System.out.println(file.exists());//boolean
 System.out.println("是否是文件:"+file.isFile()); //boolean
 System.out.println("是否是目录:"+file3.isDirectory());//boolean

创建文件: 如果是空文件,不能给文件添加内容. 如果上级目录不存在, 抛异常:IOException

在这里插入图片描述

创建文件夹: 推荐使用 mkdirs()

在这里插入图片描述

mkdir() 只创建本级文件夹, 如果上级目录不存在, 创建失败, 如果上级目录存在, 创建本级目录

mkdirs() 如果上级目录不存在,创建所有的上级目录, 再创建本级目录, 如果上级目录存在与mkdir() 一样 推荐

删除文件/文件夹: 如果该目录是一个空目录: 可以删除 如果目录是非空的, 删除失败

在这里插入图片描述

遍历子文件或者是子文件夹

在这里插入图片描述

String[] subFileStrs = file.list();
for (String subFileStr : subFileStrs) {
   
    System.out.println(subFileStr);
}
//使用FilenameFilter过滤  获取某个文件夹下的特定文件
String[] subFileStrs = file.list(new FilenameFilter() {
   
      //把目录下每一个子文件或者子目录, 调用一次accept()
      //根据accept()方法返回值,判断是否添加到subFileStrs数组
      // 如果返回值true,添加, false: 不添加
      //dir: 上级目录  name: 子文件/子文件夹的名字
      @Override
      public boolean accept(File dir, String name) {
   
          //false: 过滤掉
          //getPath() 获取路径
          //得到 子文件/子文件夹File对象
          File subFile = new File(dir,name);
          return subFile.isFile() && name.endsWith(".txt");//不要文件夹,不是txt结尾的也不要
      }
   });

for (String subFileStr : subFileStrs) {
   
    System.out.println(subFileStr);
}


//上面返回的是String数组list()  这个返回的是File数组 listFiles()
//返回File数组
File[] subFiles = file.listFiles(new FilenameFilter() {
   
    @Override
    public boolean accept(File dir, String name) {
   
        File subFile = new File(dir,name);
        return subFile.isFile() && name.endsWith(".txt") ;
    }
});
for (File subFile : subFiles) {
   
    // getParent() 获取上级目录路径
    //getParentFile() 获取上级目录File对象
    System.out.println(subFile.getPath());
}

//使用FileFilter过滤
File[] subFiles = file.listFiles(new FileFilter() {
   
    @Override
    public boolean accept(File pathname) {
   
        //System.out.println(pathname.getPath());
        return pathname.isFile();
    }
});

方法递归

在方法内部调用本方法,实现重复的操作(循环)

使用场景:循环的条件不确定时

递归要求:

1:参数要发生改变

2:要有结束递归的终点,否则就会进入死循环

递归缺点:

1:如果递归的层次很深 :执行效率低,内存消耗大

能用循环就不用递归
例子:斐波那契数列

1,1,2,3,5,8,13,21,34,55…

f(10) = f(9)+f(8)

f(9) = f(8)+f(7)

f(8) = f(7) + f(6)

f(6)=…

f(5) = f(4)+f(3)=3+2=5

f(4)=f(3)+f(2)=2+1=3

f(3) = f(2)+f(1); = 1+1=2

f(2) = 1; 终点

f(1) = 1;

使用递归的到所有的子文件
public static void iterSubFile(File file){
   
    File[] subFiles = file.listFiles();
    for (File subFile : subFiles) {
   
        //getName() 文件名/文件夹名
        //System.out.println(subFile.getName());
        //递归
        if(subFile.isDirectory()){
   //文件夹
            iterSubFile(subFile);
        }else{
    //文件
            subFile.delete();
        }
        }
    //删除空目录
    file.delete();

    }

IO流

I input ; O output 统称为数据流(IO Stream)

IO分类

按流向分:

◦ 输入流:程序可以从中读取数据的流(读操作)

◦ 输出流:程序能向其中写入数据的流(写操作)

按数据传输单位分:

◦ 字节流:以字节(8位)为单位传输数据的流

◦ 字符流:以字符(16位)为单位传输数据的流 读写文本文件

按功能分:

◦ 节点流:用于直接操作目标设备的流

◦ 处理流:是对一个已存在的流的连接和封装,通过对数据的处理为程序提供更强大、灵活的读写功能。

IO流的4个抽象父类

字节输入流: InputStream

字节输出流: OutputStream

字符输入流: Reader

字符输出流: Writer

InputStream字节输入流
常用方法

read(): 从输入流中读取数据的下一个字节, 返回读到的字节值(int型).若读到末尾,返回-1 (一次读取一个字节)

read(byte[] b):从输入流中读取 b.length 个字节的数据并存储到缓冲区数组b中.返回的是实际读到的字节总数(一次最多可以读取b.length 个字节的数据)

read(byte[] b, int off, int len):读取 len 个字节的数据,并从数组b的off位置开始存入到这个数组中

close():关闭此输入流并释放与此流关联的所有系统资源

OutputStream字节输出流

继承自OutputStream的流是程序用于向外输出数据的,且数据的单位为字节(8位)

常用方法

write(int b):将指定的字节写入此输出流

write(byte[] b) :将 b.length 个字节从指定的 byte 数组写入此输出流

flush():刷新此输出流并强制写出所有缓冲的输出字节

close():关闭此输出流并释放与此流有关的所有系统资源

Writer字符输出流

继承Writer的流都是向程序中输出数据,且数据的单位为字符(16 bit)

常用方法

write(int c):写入单个字符

write(char[] cbuf) :写入字符数组

write(char[] cbuf, int off, int len):写入字符数组的某一部分

write(String str):写入字符串

write(String str,int off, int len):写字符串的某一部分

close() :关闭此流,但要先刷新它

flush() :刷新该流的缓冲,将缓冲的数据全写到目的地

Reader字符输入流

继承自Reader的流都是用于向程序中输入数据的,且数据的单位为字符(16位),

read():读取单个字符,返回作为整数读取的字符,如果已到结尾返回-1

read(char[] cbuf):将字符读入数组,返回读取的字符数

int read(char[] cbuf,int off, int len):读取 len 个字符的数据,并从数组cbuf的off位置开始存入到这个数组中

close():关闭该流并释放与之关联的所有资源

编写步骤:
  1. 创建IO流对象
  2. 读/写操作
  3. 关闭资源

节点流

节点流可以从一个特定的数据源(节点)读写数据(如:文件,内存),直接对文件进行读写,而不需要借助于其他的IO流

※节点流只能是文件或内存
字节节点流
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值