File, IO字节流和字符流

本文详细介绍了Java中的File类,包括其构造方法和常用方法,如创建、删除、判断文件属性等。此外,还探讨了IO流的概念和分类,包括字节流和字符流的输入输出,以及文件拷贝的实现。通过实例展示了如何进行数据的读写操作。
摘要由CSDN通过智能技术生成

File, IO字节流和字符流

一,File

1.File 文件或者目录的抽象表现形式

public class Class001_File {
    public static void main(String[] args) {
        //File(String pathname)
        File file = new File("D://");
        File file2 = new File("D:/AAA/BBB");
        File file3 = new File("D:\\install_package\\ZoomIt");
        File file4 = new File("D:\\test.txt");
        //File(String parent, String child)
        File file5 = new File("D:\\","test.txt");
        //File(File parent, String child)
        File file6 = new File(file,"test.txt");
        System.out.println(file);
        System.out.println(file2);
        System.out.println(file3);
        System.out.println(file4);
        System.out.println(file6);
    }
}

2.File常用方法

public class Class002_FileMthod {
    public static void main(String[] args) throws IOException {
        File file  = new File("D://test.txt");
        File file2  = new File("D://AAA/BBB/test.txt");
        File file3  = new File("D://test.txt");
        //boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便仅允许读取操作。
        //System.out.println(file.setReadOnly());
        //boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。
        //System.out.println(file.canWrite());

        //boolean createNewFile() 当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。  注意: 不能创建文件夹,只能创建文件
        System.out.println(file.createNewFile());  //true

        //boolean delete() 删除此抽象路径名表示的文件或目录。
        System.out.println(file.delete());

        //boolean equals(Object obj) 测试此抽象路径名与给定对象的相等性。
        System.out.println(file==file3);
        System.out.println(file.equals(file3));

        //boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
        if(!file.exists()){
            System.out.println("文件不存在,创建"+ file.createNewFile());
        }

        //File getAbsoluteFile() 返回此抽象路径名的绝对形式。
        //String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
        File file4 = new File("gaga/haha.txt");  //相对路径  : 默认相对于项目

        System.out.println(file4.getAbsolutePath());
        System.out.println(file4.getAbsoluteFile());

        //long getFreeSpace() 通过此抽象路径名返回分区 named中未分配的字节数。
        File file5 = new File("D://");
        System.out.println(file5.getFreeSpace());

        //long getTotalSpace() 通过此抽象路径名返回分区 named的大小。
        System.out.println(file5.getTotalSpace());

        //String getName() 返回此抽象路径名表示的文件或目录的名称。
        System.out.println(file.getName());

        //String getParent() 返回此抽象路径名父项的路径名字符串,如果此路径名未指定父目录,则返回 null 。
        //File getParentFile() 返回此抽象路径名父项的抽象路径名,如果此路径名未指定父目录,则返回 null 。
        System.out.println(file.getParent());
        System.out.println(file.getParentFile());

        //boolean isAbsolute() 测试此抽象路径名是否为绝对路径。
        //boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。
        //boolean isFile() 测试此抽象路径名表示的文件是否为普通文件。
        //boolean isHidden() 测试此抽象路径名指定的文件是否为隐藏文件。
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());

        //long lastModified() 返回上次修改此抽象路径名表示的文件的时间。
        System.out.println(new SimpleDateFormat().format(new Date(new File("D://vvv.txt").lastModified())));

        //long length() 返回此抽象路径名表示的文件的长度。
        File file7 = new File("D://vvv.txt");
        System.out.println(file7.length());

        File file8 = new File("D:\\DDD\\AAA");
        //File[] listFiles() 返回一个抽象路径名数组,表示此抽象路径名表示的目录中的文件。
        System.out.println(Arrays.toString(file8.listFiles()));

        //String[] list() 返回一个字符串数组,用于命名此抽象路径名表示的目录中的文件和目录。
        System.out.println(Arrays.toString(file8.list()));

        File file9 = new File("D:\\AAA\\BBB");
        //boolean mkdir() 创建此抽象路径名指定的目录。
        //System.out.println(file9.mkdir());
        //boolean mkdirs() 创建此抽象路径名指定的目录,包括任何必需但不存在的父目录。
        System.out.println(file9.mkdirs());

        //boolean renameTo(File dest) 重命名此抽象路径名表示的文件。
        //下课测试: renameTo能否实现跨盘符重命名
        System.out.println(file7.renameTo(new File("D://haha.txt")));

    }
}

二,IO流

File 类 只能操作文件外部的内容,无法操作文件内部内容的读写

流:
数据以先入先出的顺序进行传输,流就是管道,就是用来 传输数据的

IO 流
java提供了一个io包,提供了很多类,提供了很多功能能够实现数据的读写

数据源 : 数据从数据源写出
目的地 : 从目的地中把数据读如来
数据源 --> 数据 --> 目的地

流的分类:
流向分: 以大脑为中心 | 以程序为中心
输入流
输出流
操作单元分:
字节流 : 万能流-> 管道中的数据以字节为单位 ****
字符流 : 以字符为单位
功能分:
节点流 : 能够实现读写能力的
功能流 : 增强节点功能与性能的流

​ 站在不同的层面进行以上的分类,但是都是相辅相成的

节点流 字节流
字节输入流 InputStream -> 输入字节流的父类->抽象类->不能实例化
文件字节输入流 FileInputStream -> 具体的类 ->可以实例化
数组流

public class Class001_IODemo {
    public static void main(String[] args) throws Exception {
        //1.创建输入流
        //FileInputStream(String name)  参数: name 数据源文件的路径
        //FileInputStream(File file) 参数: file 数据源文件的路径的file对象
        InputStream src = new FileInputStream("D://test.txt");

        //2.读入数据
        //int read() 从此输入流中读取一个字节的数据。  已经到达文件末尾没有读到数据 返回-1
        /*int num = src.read();
        System.out.println((char)num);
        System.out.println((char)(src.read()));
        System.out.println((char)(src.read()));
        System.out.println(src.read());*/

        //优化 : 重复读入--> 循环读取
        int result = -1;  //存储每次读入的数据
        while((result = src.read())!=-1){
            System.out.println((char)result);
        }

        //3.关闭
        src.close();
    }
}

1.字节输入流

每次读入一个字节的数据,循环读入

优化:每次读取一车数据(字节数组),重复读入int read(byte[] b)

package com.xx.io;

import java.io.*;

public class Class_InputStream02 {
    public static void main(String[] args) throws IOException {
      File file=new File("D://AAA/test.txt");
      InputStream is=new FileInputStream(file);//输入流
       byte[] a=new byte[1024];
       int len=0;
     while ((len=is.read(a))!=-1){
         System.out.println(new String(a,0,len));
     }

    }
}

2.字节输出流

字节流 节点流 输出流

字节输出流 OutputStream 抽象父类 不能实例

文件字节输出流FileOutputStream 具体子类 实例

注意;

​ 写出内容默认覆盖源文件内容

​ 目标文件不存在会在系统默认构建

​ 目标文件所在的路径不存在,系统不会构建

public class Class001_OutputStream {
    public static void main(String[] args) throws IOException {

        //1.构建输出流
        //FileOutputStream  (String name) 参数name为目的地路径字符串
        //FileOutputStream (File file)  参数file为目的地路径file对象
        //FileOutputStream (File file, boolean append)  参数append是否追加数据,默认不追加覆盖,true->追加
        //FileOutputStream(String name, boolean append)
        OutputStream os = new FileOutputStream("D://test.txt",true);
        //2.写出数据
        //void write(int b) 将指定的字节写入此文件输出流。
        os.write(98);
        os.write(99);

        //3.刷出
        os.flush();
        //4.关闭
        os.close();
    }

        1.一车字节数据写出 (byte[]2.异常捕获

 */
package com.xx.io;

import java.io.*;

public class Class_OutputStream02 {
    public static void main(String[] args) {
        //创建输出流
        OutputStream os=null;
        try {
            os=new FileOutputStream("D://AAA/tst.txt");
            //准备数据
            String str="安慰的淘汰";
            byte[] a=str.getBytes();
            os.write(a);//写出
            os.flush();//刷出
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}

3.字节文件拷贝

​ 源文件
​ 字节输入流
​ 程序(中转站)
​ 字节输出流
​ 目的地新文件

package com.xx.io;

import java.io.*;

public class Copyfile01 {
    public static void main(String[] args) {
       //创建输入,输出流
        InputStream is=null;
        OutputStream os=null;
        try {
            is=new FileInputStream("D://AAA/tst.txt");
            os=new FileOutputStream("D://AAA/haha.txt");
            //数组车
            byte[] a=new byte[1024];
            int len=0;
            while ((len=is.read(a))!=-1){
                os.write(a,0,len);
                os.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

4,字符输入输出流

字符流 节点流
字符输入流 Reader
文件字符输入流 FileReader
字符输出流 Writer
文件字符输出流 FileWriter

注意:
子类无新增方法需要使用,可以多态指向

public class Class001_IO {
    public static void main(String[] args) throws IOException {
        //1.构建流
        Reader rd = new FileReader("D://haha.txt");
        //2.读入
        //System.out.println((char)(rd.read()));  每次读入一个字符数据
        //字符数组
        char[] car = new char[1024];
        int len = -1;
        //int read(char[] cbuf) 将字符读入数组。
        while((len = rd.read(car))!=-1){
            System.out.println(new String(car,0,len));
        }

        //3.关闭
        rd.close();
    }
}

字符输出流 Writer
文件字符输出流 FileWriter

public class Class002_IO {
    public static void main(String[] args) throws IOException {
        //1.构建流
        Writer wt = new FileWriter("D://xixi.txt",true);
        //2.准备数据
        String msg = "喜洋洋与灰太羊";
        //3.写出
        wt.write(msg);
        //4.刷出
        wt.flush();
        //5.关闭
        wt.close();

    }
}

5.字符流文件拷贝

package com.xx.io;

import java.io.*;

public class Class_chario03 {
    public static void main(String[] args) {
        Reader rd = null;
        Writer wt = null;
        try {
            rd = new FileReader("D://AAA/tst.txt");
            wt = new FileWriter("D://AAA/haha.txt");
            char[] a = new char[1024];
            int len = 0;
            while ((len = rd.read(a)) != -1) {
                wt.write(a, 0, len);
                wt.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (wt!=null){
                try {
                    wt.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(rd!=null){
                try {
                    rd.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值