【IO流】

1.File类

File 类 就是当前系统中 文件或者文件夹的抽象表示
    
通俗的讲  就是 使用File对象 才操作我们电脑系统中的文件或者文件夹

学习File类 其实就是学习 如果通过file对象 对系统中的文件/文件夹进行增删改查

1.1File对象的创建

 (1)在电脑的非系统盘 创建一个 AAA文件夹 今天所有的操作都在这个文件夹中

 (2)public static void main(String[] args) {
        //创建一个File对象 并指定文件得路径 
        File file01 = new File("D:/AAA/aaa.txt");
           //目录层级  在window系统下层级分割符为\  但是在linux和mac系统上分割符为 /
           我们得java代码是一种跨平台得语言。 我们得开发在window  但是我们项目得部署在linux.
           我们使我们得代码能在任意系统下来用。 我们有两种解决办法
           第一种 因为window 兼容 / 和 \
        File file02 = new File("D:/AAA/bbb.txt");
        // 第二种 File.separator根据当前代码所在得系统自动获取相应得分割符

        System.out.println(File.separator); //  \因为我们当前在window下
        File file03 = new File("D:"+File.separator+"AAA"+File.separator+"ccc.txt");
    }

1.2增

 public static void main(String[] args) throws IOException {
        File file  =new File("D:/AAA/aaa");
        //创建一个单级目录
        file.mkdir();
        File file1 = new File("D:/AAA/bbb/b1");
        //创建一个多级目录
        file1.mkdirs();
        File file2 = new File("D:/AAA/a1");
        //创建一个文件
        file2.createNewFile();

 1.3删

//当程序退出后删除
        File file5 = new File("D:/AAA/aaa");
        file5.deleteOnExit();
        //删除空目录
        //File file3 = new File("D:/AAA/aaa");
        //file3.delete();
        //删除文件
        //File file4 = new File("D:/AAA/a1");
       // file4.delete();

 1.4改

 //修改
        File file3 = new File("D:/AAA/a1");
        //设置该文件不能写
        file3.setWritable(false);
        //设置只能读
        file3.setReadOnly();
        //重命名
        File file4 = new File("D:/AAA/a1");
        file4.renameTo(new File("D:/AAA/a2"));

1.5查询

 public static void main(String[] args) {
        File file = new File("D:/AAA/bbb/b1");
        //获取文件名称
        String s = file.getName();
        System.out.println(s);
        //获取父级文件名称
        String s1 = file.getParent();
        System.out.println(s1);
        //获取完整路径
        String s2 = file.getPath();
        System.out.println(s2);
        //判断是否为文件类型
        boolean b = file.isFile();
        System.out.println(b);
        //判断是否为目录类型
        boolean b1 = file.isDirectory();
        System.out.println(b1);
        //列出AAA下的所有文件目录
        File f = new File("D:/AAA");
       String[] list= f.list();
        System.out.println(Arrays.toString(list));
        //列出AAA下的所有文件目录对象
        File[] fl= f.listFiles();
        for (File file1:fl){
            System.out.println(file1.toString());
        }

 经典题目: 显示指定目录下的所有文件。D:/AAA下所有的文件,用的方法的递归调用。

public class Test5 {
    public static void main(String[] args) {
        showAllFiles("D:/AAA");
    }
    public static void showAllFiles(String s){
        File file = new File(s);
        //判断文件是否存在 或者文件是否为目录.
        if (!file.exists()||!file.isDirectory()){
            return;
        }
        //列出所有文件对象
        File[] files= file.listFiles();
        for (File file1:files){
            if (file1.isDirectory()){
                System.out.println(file1.getPath()+"目录");
                showAllFiles(file1.getPath());//继续调用本方法
            }else {
                System.out.println(file1.getPath());
            }
        }
    }
}

2.IO流

1. IO 表示有两个单词的缩写。
  I: Input 输入   O: Output 输出

2. IO的作用:就是对文件中的内容进行操作。
  输入: 读操作(读取文件的内容)   输出: 写操作(往文件中写内容)
 
3. IO流的分类:

 (1)根据流的方向:
    ---输入流: 程序可以从中读取数据的流。
    ---输出流: 程序能向其中写入数据的流。
    
 (2)根据流的单位:
    ---字节流: 以字节为单位传输数据的流
    ---字符流: 以字符为单位传输数据的流
 
 (3)根据功能
    ---节点流: 直接和文件进行交互
    ---处理流: 不是直接作用在文件上。
    
四个基本的流: 其他的流都是在这四个流的基础上进行扩展的
        字节输入流
        字节输出流
        字符输入流
        字符输出流

2.1字符输出流Writer

public static void main(String[] args) throws Exception {
        //writer字符输出流
        //true 表示可以追加内容
        Writer writer = new FileWriter("D:/AAA/c1.txt",true);
        String s = "不可以偷懒";
        writer.write(s);
        //刷新流
        writer.flush();
        //关闭流资源
        writer.close();
    }

 2.2字符输入流Reader

public static void main(String[] args) throws Exception {
        //字符输入流
        Reader reader =new FileReader("D:/AAA/c1.txt");
        //表示读取字符的个数
        int count=0;
        //创建一个char数组,每次读取到元素存入该数组中
        char[] chars = new char[2];
        while((count=reader.read(chars))!=-1){
            String s = new String(chars,0,count);
            System.out.println(s);
        }
    }

2.3字节输出流OutputStream

 以字节为单位。 它是所有字节输出流的父类,子类有FileOutputStream

 @Test
    public void TestOutPutStream() throws Exception {
        //字节输出流
        OutputStream o = new FileOutputStream("D:/AAA/c3.txt");
        String s = "abcdefg";
        //把字符串转换为字节数组.
        byte[] bytes =s.getBytes();
        o.write(bytes);
        o.flush();
        o.close();
    }

 2.4字节输入流InputStream

以字节为单位。 它是所有字节输入流的父类,子类有FileInputStream

@Test
    public void TestInPutStream() throws Exception {
        //字节输入流
        InputStream is = new FileInputStream("D:/AAA/c3.txt");
        int count=0;
        byte[] bytes = new byte[2];
        while ((count=is.read(bytes))!=-1){
            String s = new String(bytes,0,count);
            System.out.println(s);
        }
        is.close();

 2.5用字节流和字符流分别完成文件复制

字符流只能复制文本文件。

字节流可以完成文本文件,也可以完成任意类型的文件复制。

 @Test//用字符实现文件内容的复制
    public void Test1() throws Exception {
        //创建一个字符输入流
        FileReader f = new FileReader("D:/AAA/c1.txt");
        //创建一个字符输出流
        FileWriter w = new FileWriter("C:/AAA/c11.txt");
        int count=0;
        char[] chars = new char[3];
        while ((count=f.read(chars))!=-1){
            w.write(chars,0,count);
            w.flush();
        }
        f.close();
        w.close();
    }
    @Test//用字节实现文件内容的复制
    public  void Test2() throws Exception {
        //创建一个字节输入流
        InputStream is = new FileInputStream("D:/AAA/aaa/1.webp");
        //创建一个字节输出流
        OutputStream os = new FileOutputStream("C:/AAA/2.webp");
        int count=0;
        byte[] bytes =new byte[2];
        while ((count=is.read(bytes))!=-1){
            os.write(bytes,0,count);
            os.flush();
        }
        is.close();
        os.close();
    }

 2.6缓存流

 缓存流是在基础流[InputStream(字节输入流), OutputStream(字节输出流), Reader(字符输入流) Writer(字符输出流)]之上 添加了一个缓存池功能.
BufferInutStream  BufferOutputStream BufferReader  BufferWriter 提高IO的效率,降低IO的次数。

@Test//缓存流
    public  void TestBuffer() throws Exception {
        OutputStream os = new FileOutputStream("D:/AAA/c3.txt");
        BufferedOutputStream bf = new BufferedOutputStream(os);
        String s = "你好,我要回家了";
        byte [] bytes =s.getBytes();
        // 暂时放入缓存池中,没有直接放入文件中,所以文件中没有你的内容。
        bf.write(bytes);
        //bf.flush();//刷新缓存池   把池子中的内容输入到文件上
        bf.close();//关闭流资源   先刷新缓冲池 再关闭流资源
    }

 2.7对象流

 序列化: 把内存中的java对象存储到磁盘[网盘]的过程。
 反序列化: 把磁盘中的内容读取到java对象内存中的过程。 

java对象所属的类必须实现序列化接口.implements Serializable

@Test
    public void TestObjectOutputStream()throws Exception{
        //序列化
        //对象数输出流
        OutputStream os = new FileOutputStream("D:/AAA/c3.txt");
        ObjectOutputStream os2 = new ObjectOutputStream(os);
        //使用对象输出流调用输出方法 输出的类对象 该类必须实现Serializable 序列化接口
        Student s = new Student("小明",20,"男");
        os2.writeObject(s);
        os2.close();
    }
    @Test
    public void TestObjectInputStream() throws Exception {
        //反序列化
        //对象输入流
        InputStream is = new FileInputStream("D:/AAA/c3.txt");
        ObjectInputStream oi = new ObjectInputStream(is);
        Object o=oi.readObject();
        System.out.println(o);
        oi.close();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值