JAVA中的IO系统

本文主要介绍了JAVA中的IO系统,包括File类的使用以及IO流的四种抽象基类、缓冲流、转换流、打印流和重定向等核心概念,通过示例代码详细阐述了每个部分的操作方法。
摘要由CSDN通过智能技术生成

目录

文章目录

前言

一、File类

二、IO流相关

1.IO流的四种抽象基类

2.缓冲流

3.转换流

4.打印流

5.重定向

总结


前言

总结了自己学习过程中的笔记

一、File类

file类是java.io包下的类、代表与平台无关的问价和目录
    * 1、file能创建、删除、重命名文件和目录,也能检测、访问文件和目录本身
    * 2、File不能访问文件中的内容,如果要访问内容、则需要使用输入、输出流
        File file = null;
        //创建文件
        file = new File("E:/filetest/1.txt");//在fileTest下面创建一个1.txt文件
        file.createNewFile();//创建出一个文件

        /**
        * //删除文件
        * file.delete();
        */
        //修改文件名

        file.renameTo(new File("E:/filetest/2.txt"));//将1改成2.txt

        //判断文件
        System.out.println("是否存在:" + file.exists());
        System.out.println("是否文件:" + file.isFile());
        System.out.println("是否可读:" + file.canRead());
        System.out.println("是否可写:" + file.canWrite());
        System.out.println("是否绝对路径:" + file.isAbsolute());

        //访问
        System.out.println("文件名:" + file.getName());
        System.out.println("文件路径:" + file.getPath());
        System.out.println("文件绝对路径:" + file.getAbsolutePath());
        System.out.println("文件上级目录:" + file.getParent());
        System.out.println("修改时间:" + file.lastModified());

        //目录操作
        file = new File("E:/filetest/on");
        file.mkdir();

        //删除、改名、判断、访问对目录也适用


        //相对路径
        file = new File("3.txt");//相对于项目根目录的位置创建
        file.createNewFile();

        System.out.println("文件绝对路径:" + file.getAbsolutePath());
        System.out.println("文件上级目录:" + file.getParent());
        System.out.println("修改时间:" + file.lastModified());
过滤文件:
    * File类的ListFiles()方法可以接受一个参数,用于列举文件时候对其过滤
    * File类会一次将文件传给过滤器,当个过滤器返回True时,File类才会列举该文件
 //文价过滤
        File dir = new File("E:/filetest");
        File[] files2 = dir.listFiles();//无参

        files2 = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                System.out.println(pathname);
                if (pathname.getName().endsWith(".txt")){
                    return true;
                }
                return false;
            }
        });
        System.out.println(Arrays.toString(files2));

二、IO流相关

1.IO流的四种抽象基类

1、字节输入流:InputStream
    * int read() 读取下一个字节
    * int read(byte[] b) 读取下一批字节。将其存入数组,放回读取的字节数
    * int read(byte[] b, int off, int len) 从off开始最多读取len个字节,将其存入数组,返回读  取的字节数

2、字节输出流:OutputStream
            * void write(int b) 输出指定的字节
            * void write(byte[] b) 输出指定的字节数组
            * void write(byte[] b, int off, int len) 输出指定的字节数组,从off开始最多输出len个字节

3、字符输入流:Reader
    * int read() 读取下一个字符
    * int read(char[] b) 读取下一批字节。将其存入数组,放回读取的字符数
    * int read(char[] b, int off, int len) 从off开始最多读取len个字符,将其存入数组,返回读取的字符数

4、字符输出流:Writer
    * void write(int b) 输出指定的字符
    * void write(char[] b) 输出指定的字符数组
    * void write(char[] b, int off, int len) 输出指定的字符数组,从off开始最多输出len个字符
    * void write(String str) 输出指定的字符串
    * void write(String str, int off, int len) 输出指定的字符串,从off开始最多输出len个字符
* 注意:
     * 上述四类都是抽象类,不能实例化
     * 上述死个类都定义了colse()方法,在使用流之后调用此方法关闭
     * 无论是否发生异常、使用流之后都要尝试关闭它,通常在finally中关闭
     * 上述四个类都实现了Closeable接口,因此可以在try()中创建流,以便自动关闭

代码如下(示例):

 public static void main(String[] args){
        //测试字节流拷贝
        copyByteFile("E:/filetest/on/1.png","E:/filetest/on/1-copy.png");
        copyTextFile("E:/filetest/on/1.txt","E:/filetest/on/1-copy.txt");

    }
    /**
     * 实现文件拷贝方法,本次采用字节流
     */
    public static void copyByteFile(String srcFilePath,String destFilePath){//传入来源和目的路径
        try(FileInputStream fis = new FileInputStream(srcFilePath);//输入读取
            FileOutputStream fos = new FileOutputStream(destFilePath); ){//输出
            byte[] bytes = new byte[128];
            int len = 0;//实际读取的字节数
            //采用循环读取文件
            while ((len = fis.read(bytes,0,128)) > 0){//调用输入流的read方法
                //读取之后写入目标文件
                fos.write(bytes,0,len);
            }
        } catch (FileNotFoundException e) {
            throw new IllegalArgumentException("文件路径不存在");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void copyTextFile(String srcFilePath,String destFilePath){//传入来源和目的路径
        try(FileReader fis = new FileReader(srcFilePath);//输入读取
            FileWriter fos = new FileWriter(destFilePath); ){//输出
            char[] chars = new char[128];
            int len = 0;//实际读取的字节数
            //采用循环读取文件
            while ((len = fis.read(chars,0,128)) > 0){//调用输入流的read方法
                //读取之后写入目标文件
                fos.write(chars,0,len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 

2.缓冲流

缓冲流:BufferedInputStream、 BufferedOutputStream、 BufferedReader、 BufferedWriter
1、这四个类都是处理流、需要关联对应的节点流,即实例化时需要传入节点流的实例
2、缓冲流内部维护了一个缓冲区、通过与缓冲区的交互、减少与设备的交互次数
3、使用缓冲流输入流时,他每次会读取到一批数据将缓冲区填满,每次调用读取的方法并不直接从设备中读取,而是从缓冲区取值,当缓冲区为null时候,他将会再一次读取数据,将缓冲区填满
4、使用缓冲输出流时,每次调用写入方法并不是直接写入到设备,而是写入缓冲区,当缓冲区填满时候他会自动刷入设备,也可以调用flush()方法触发刷新(关闭流的时候自动调用它)

代码如下(示例):

    public static void main(String[] args){
        copyByteFile("E:/filetest/on/1.png","E:/filetest/on/1-copy2.png");
    }
    public static void copyByteFile(String srcFilePath,String destFilePath){//传入来源和目的路径
        try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath));//从节点流重读数据
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
            ) {
            byte[] bytes = new byte[128];
            int len = 0;
            while ((len = bis.read(bytes,0,128)) > 0){//调用输入流的read方法
                //读取之后写入目标文件
                bos.write(bytes,0,len);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.转换流

转换流:InputStreamReader 、 OutputStreamWriter
    * 这两个类都是处理流、需要关联相应的节点流、即实例化时候需要传入节点流实例
    * Scanner所提供的的输入方法,底层采用的是InputStreamReader实现
    * PrintStream所提供的的输出方法,其底层采用的是OutputStreamWriter实现

代码如下(示例):

    public static void main(String[] args) {
        try(
                InputStreamReader reader = new InputStreamReader(System.in);
                BufferedReader br = new BufferedReader(reader);//提高效率包装为缓冲流
                ){
            String line = null;
            while ((line = br.readLine())!= null){//读取一行
                if(line.equalsIgnoreCase("exit")){//当键盘输入exit字符之后强制退出
                    break;
                }
                System.out.println(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

4.打印流

打印流:PrintStream 、 PrintWriter
    * 这两个类都是处理流,要关联对应的节点流,即实例化时需要传入节点流实例
    * System.out是PrintStream类型
    * PrintStream 、 PrintWriter的功能和方法基本相同,后者的设计更合理

代码如下(示例):

    public static void main(String[] args) {
        printStreamDemo();
        printWriterDemo();
    }
    public static void printStreamDemo(){
        try(
                FileOutputStream fos = new FileOutputStream("E:/filetest/on/1.txt");//获取节点流
                PrintStream ps = new PrintStream(fos);//包装打印流
                ){
            //利用PringStream打印、
            ps.println("一直迷路的猿");//将在E:/filetest/on/1.txt文件中输出打印内容

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void printWriterDemo(){
        try(
                FileWriter fw = new FileWriter("E:/filetest/on/1-copy.txt");
                PrintWriter pw = new PrintWriter(fw);
        ){
            pw.println("一直迷路的猿");//将在E:/filetest/on/1-copy.txt文件中输出打印内容

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

5.重定向

重定向:
    * System提供三个重定向的方法
        * 1、public static void setIn(InputStream in)
        * 1、public static void setOutIn(InputStream out)
        * 1、public static void setErr(InputStream err)
* 这些重定向方法用于修改标准输入、标准输出、错误输出的目标设备

代码如下(示例):

    public static void main(String[] args) {
        rediectOutputDemo();//执行重定向输入时候时将重定向输出注释掉
        rediectInputDemo();
    }
    //重定向输出流到文件
    public static void rediectOutputDemo(){
        try(
                PrintStream ps = new PrintStream(new FileOutputStream("E:/filetest/out.txt"));
                ){
            //改变标准输出流
            System.setOut(ps);
            System.out.println("一直迷路的猿");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    //重定向输入流,输入源是文件
    public static void rediectInputDemo(){
        try(
                FileInputStream fis = new FileInputStream("E:/filetest/out.txt");
                ){
            System.setIn(fis);
            Scanner scanner = new Scanner(System.in);
            while (scanner.hasNext()){//如果有进一步输入
                System.out.println(scanner.next());
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

总结

提示自己IO流使用的相关方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值