Java——常用工具_IO流

异常处理

  1. 异常的分类(Trowable):
    异常(Exception):合理的应用程序可能需要捕获的问题
    错误(Error):合理的应用程序不应该试图捕获的问题

在这里插入图片描述

  1. 异常处理方式
    try…catch(finally):捕获,字节处理
    throws:抛出,交给调用者处理
    在这里插入图片描述

try_catch

格式:
try {
//尝试执行的代码(有可能出现问题的代码)
} catch(Exception e) {
//出现问题后的解决方案
} finally{
//写在这里的代码一定会执行,一般是用来释放资源的
}

package com.io;

public class test01 {
    public static void main(String[] args) {
        //用try catch finally 来处理异常
        try { //快捷键command+option+t
            int a = 10/0;
            System.out.println("a:" + a);
            return;  //finally一定会执行
            //如果没有错误,不会执行catch,直接finally
            //有错误,执行catch,而后finall
        } catch (Exception e) {
            System.out.println("除数不能为0");
            return;  //就算执行到了return,最终的finally语句也会执行
        } finally {
            System.out.println("执行了吗?");
        }
    }
}

执行流程:
先执行try{}中的内容,看是否有问题(异常)
没有:直接执行finally语句中的内容
有:跳转到catch(){}语句中开始执行

throws

throws是使用在方法里。

package com.io;

public class test02 {
    public static void main(String[] args) throws Exception {
        //因为调用的show()方法意见抛出了一个异常,作为调用者(main)函数必须处理这个异常
        //所以方案一是在main函数中继续抛出异常,会返回个JVM的
        //show();
        //方案二:采用try catch处理
        try {
            show();
        } catch (Exception e) {
            System.out.println("有异常抛出");
        }
    }
    public static void show() throws Exception{
        int a = 10/0;
        System.out.println("a:" + a);
    }
}

IO流概述

IO流的分类:
按数据流向分:输入流、输出流
按操作方式分:
字节流:InputStream\OutputStream
字符流:Reader\Writer
IO流体系:
字符流:按字符读写数据的IO流
在这里插入图片描述

字节流:按字节读写数据的IO流
在这里插入图片描述

在这里插入图片描述

File类

  1. 简介
    文件,文件夹,一个File对象代表磁盘上的某个文件或文件夹
  2. 构造方法
    File(String pathname)
    File(String parent, String child)
    File(File parent, String child)
  3. 成员方法
    (1)createNewFile():创建文件
    (2)mkdir()和mkdirs():创建目录
    (3)isDirectory():判断File对象是否为目录
    (4)isFile():判断File对象是否为文件
    (5)exists():判断File对象是否存在
package com.io;

import java.io.File;
import java.io.IOException;

public class test03 {
    public static void main(String[] args) throws IOException {
        //将lib.1.txt封装成File对象
        //方式一:根据字符串形式的路径获取File对象
        //File file1 = new File("lib\\1.txt");
        File file1 = new File("lib/1.txt");
        System.out.println("file1:" + file1);
        //方式二:根据字符串形式的父目录以及子目录创建File对象
        File file2 = new File("lib", "1.txt");
        System.out.println("file2:" + file2);
        //方式三:根据父母路对象,以及字符串形式的子目录来获取File对象
        File file3 = new File("lib");
        File file4 = new File(file3, "1.txt");
        System.out.println("file4:" + file4);

        //在目录下创建2.txt文件
        File file5 = new File("/Users/yu/Downloads/java/2.txt");
        boolean flag1 = file5.createNewFile();
        System.out.println("flag1:" + flag1);  //flag1:true  第二遍再执行就是false了
        //在目录下创建文件夹a
        File file6 = new File("/Users/yu/Downloads/java/a");
        boolean flag2 = file6.mkdir();
        System.out.println("flag2:" + flag2);  //flag2:true
        //在目录下创建a/b/c文件夹
        File file7 = new File("/Users/yu/Downloads/java/a/b/c");
        boolean flag3 = file7.mkdirs();
        System.out.println("flag3:" + flag3);

        //测试判断功能
        File file8 = new File("/Users/yu/Downloads/java/a/b");
        System.out.println("测试file8是否是文件夹:" + file8.isDirectory()); //测试file8是否是文件夹:true
        System.out.println("测试file8是否是文件:" + file8.isFile()); //测试file8是否是文件:false
        System.out.println("测试file8是否存在:" + file8.exists());  //测试file8是否存在:true
    }
} 

(6)getAbsolutePath():获取绝对路径
(7)getPath():获取文件的相对路径
(8)getName():获取文件名
(9)list():获取指定目录下所有文件(夹)名称数组
(10)listFiles():获取指定目录下所有文件(夹)File数组

package com.io;

import java.io.File;

public class test04 {
    public static void main(String[] args) {
        File file1 = new File("lib/1.txt");
        //获取file1的绝对路径
        String path1 = file1.getAbsolutePath();
        System.out.println("绝对路径:" + path1);
        //获取file1的相对路径
        String path2 = file1.getPath();
        System.out.println("相对路径:" + path2);
        //获取文件名
        String fileName = file1.getName();
        System.out.println("文件名:" + fileName);
        //获取lib文件夹下所有的文件(夹)的名称数组String[]
        File file2 = new File("/Users/yu/Downloads/java");
        String[] names = file2.list();
        for (String name : names) {
            System.out.println(name);
        }
        //获取lib文件夹下所有的文件(夹)的File对象数组 File[]
        File[] files = file2.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }
}

字符流读写文件

字符流读数据

  1. 按单个字符读取
    (1)创建字符流读文件对象:Reader reader = new FileReader(“1.txt”);
    (2)调用方法读取数据:
    int data = reader.read(); 读取一个字符,返回该字符代表的整数,若大道流的末尾,返回-1。
    (3)异常处理:throws IOException
    (4)关闭资源:reader.close();
package com.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class test05 {
    public static void main(String[] args) throws IOException {
        //通过字符流读取数据 FileReader()
        //1.创建字符输入流对象
        FileReader reader = new FileReader("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.txt");
        //2.读取数据
//        int ch1 = reader.read();
//        System.out.println(ch1); //97
//        int ch2 = reader.read();
//        System.out.println(ch2); //98
//        int ch3 = reader.read();
//        System.out.println(ch3); //99
//        int ch4 = reader.read();
//        System.out.println(ch4); //-1
        //使用while循环读取
        //定义变量,用来接收读到的字符
        int ch;
        //读取,赋值,判断是否打印
        while ((ch = reader.read()) != -1) {
            System.out.println(ch);
        }
        reader.close
    }
}
  1. 按字符数组读取
    (1)创建字符流读文件对象
    (2)调用方法读取数据
    int read(char[] chs) :一次读一个字符数组,将读到的内容存入到数组中,并返回读取到的有效字符数,读不到返回-1
    (3)异常处理
    (4)关闭资源
package com.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class test06 {
    public static void main(String[] args) throws IOException {
        //通过字符流读取数据,一次读取一个字符数组  1.txt: abcdefg
        //1.创建字符输入流对象
        FileReader reader = new FileReader("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.txt");
        //2.读取数据
        //int read(char[] chs) 一次读一个字符数组,将读到的内容存入到数组中,并返回读取到的有效字符数,读不到返回-1
//        char[] chs = new char[3];
//        int len1 = reader.read(chs);
//        System.out.println(chs);    //abc
//        System.out.println(len1);   //3
//
//        int len2 = reader.read(chs);
//        System.out.println(chs);   //def
//        System.out.println(len2);  //3
//
//        int len3 = reader.read(chs);
//        System.out.println(chs);   //gef  因为之前容器里是def,最后只剩下一个f,覆盖了g,所以说gef
//        System.out.println(len3);  //1
        //使用while循环
        //定义字符数组
        char[] chs = new char[3];
        int len; //定义读取到的有效字符数
        while ((len = reader.read(chs)) != -1) {
            String s = new String(chs, 0, len);
            System.out.println(s);
        }
//        abc 
//        def
//        g
        //3.释放资源
        reader.close();
    }
}

字符流写数据

  1. 按字符数组写入
    (1)创建字符流写文件对象
    (2)调用方法写入数据:写入一个字符. void write(int ch)
    (3)异常处理
    (4)关闭资源
  2. 按字符数组写入
    (1)创建字符流写文件对象
    (2)调用方法写入数据:写一个字符数组. void write(char[] chi, int index, int len)
    (3)异常处理
    (4)关闭资源
  3. 按字符串写入
    (1)创建字符流写文件对象
    (2)调用方法写入数据:写一个字符串. void write(String str)
    (3)异常处理
    (4)关闭资源
package com.io;

import java.io.FileWriter;
import java.io.IOException;

public class test07 {
    public static void main(String[] args) throws IOException {
        //通过字符流,写数据
        //1.创建字符输出流对象
        FileWriter writer = new FileWriter("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/2.txt");
        //2.写数据
        //一次写一个字符
        writer.write("好");

        //一次写一个指定的字符数组
        char[] chs = {'好', '天', '气'};
        writer.write(chs, 0, 2); //从索引0开始,读取两个

        //一次写一个字符串
        writer.write("好好学习");
        //3.释放资源
        writer.close();
    }
}

字符流拷贝文件

  1. 按单个字符读写
    (1)创建字符流读文件对象
    (2)创建字符流写文件对象
    (3)调用方法读取数据:int data = reader.read()
    (4)调用方法写入数据
    (5)异常处理
    (6)关闭资源
package com.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class test08 {
    public static void main(String[] args) throws IOException {
        //通过字符流拷贝文件,一次读写一个字符
        //将1.txt文件中的内容复制到2.txt
        /* control+shift+/
        IO流拷贝文件核心六步:
                1.创建字符输入流对象,关联数据源文件
                2.创建字符输出流对象,关联目的地文件
                3.定义变量,记录读取到的内容
                4.循环读取,只要条件满足就一直读,并将读取到的内容赋值给遍历
                5.将读取到的数据写入到目的地文件
                6.释放资源
        */
        FileReader fr = new FileReader("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.txt");
        FileWriter fw = new FileWriter("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/3.txt");
        int len;
        while ((len = fr.read()) != -1) {
            fw.write(len);
        }
        fr.close();
        fw.close();
    }
}
  1. 按字符数组读写
    (1)创建字符流读文件对象
    (2)创建字符流写文件对象
    (3)调用方法读取数据:
    char[] chs = new char[2048];
    int len = reader.read(chs);
    (4)调用方法写入数据:writer.write(chs, 0, len)
    (5)异常处理
    (6)关闭资源
package com.io;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class test09 {
    public static void main(String[] args) throws IOException {
        //通过字符流拷贝文件,一次读写一个字符数组
        FileReader fr = new FileReader("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.txt");
        FileWriter fw = new FileWriter("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/3.txt");
        char[] chs = new char[1024];
        int len;
        while ((len = fr.read()) != -1) {
            fw.write(chs, 0, len);
        }
    }
}

缓冲流普通用法

用法和前面类似,只是创建的对象不同。

  1. 字符缓冲流普通用法
package com.io;

import java.io.*;

public class test10 {
    public static void main(String[] args) throws IOException {
        //通过字符缓冲流,将1.txt文件中的内容拷贝到2.txt中
        //1.创建字符缓冲流对象,关联数据源文件
        //1.1 普通的字符输入流对象
        FileReader fr = new FileReader("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.txt");
        //1.2 字符缓冲输入流对象
        BufferedReader br = new BufferedReader(fr);
        //简单写法
        //BufferedReader br = new BufferedReader(new FileReader("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.txt"));

        //2. 创建字符缓冲输出流对象,关联目的地文件
        //2.1 创建普通的字符输出流对象
        FileWriter fw = new FileWriter("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/2.txt");
        //2.2 创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(fw);

        //3. 定义变量,记录读取到的数据
        int len;
        //4. 循环读取,赋值写入
        while ((len = br.read()) != -1) {
            bw.write(len);
        }
        //6. 释放资源
        br.close();
        bw.close();
    }
}

字符缓冲流自带有缓冲区,大小为8192个字符,也就是16KB。
2. 字符缓冲流之一次读写一行

package com.io;

import java.io.*;

public class test11 {
    public static void main(String[] args) throws IOException {
        //通过字符缓冲流"一次读写一行"的方式,将1.txt文件中的内容拷贝到2.txt文件中
        //1. 创建字符缓冲输入流对象,关联数据源文件
        BufferedReader br = new BufferedReader(new FileReader("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.txt"));
        //2. 创建字符缓冲输出流对象,关联目的地文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/2.txt"));
        //3. 定义变量,记录读取到的内容
        String str;
        //4. 循环读取
        while ((str = br.readLine()) != null) {
            //5. 写入数据
            bw.write(str);
            //记得换行
            bw.newLine();
        }
        //6. 释放资源
        br.close();
        bw.close();
    }
}

字节流读写文件

在这里插入图片描述

字节流拷贝文件

  1. 按单个字节读写
    (1)创建字节流读文件对象
    (2)创建字节流写文件对象
    (3)异常处理
    (4)使用while循环读写数据:write(int len)一次写入一个字节
    (5)关闭资源
package com.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class test12 {
    public static void main(String[] args) throws IOException {
        //通过普通的字节流,一次读写一个字节的方式,将a.jpg复制到b.jpg
        FileInputStream fis = new FileInputStream("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.jpg");
        FileOutputStream fos = new FileOutputStream("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/2.jpg");
        int len;
        while ((len = fis.read()) != -1) {
            fos.write(len);
        }
        fis.close();
        fos.close();
    }
}
  1. 按字节数组读写
    (1)创建字节流读文件对象
    (2)创建字节流写文件对象
    (3)异常处理
    (4)定义字节数组,每次读写1024、2048个字节 byte[] b = new byte[2048];
    (5)使用while循环读写数据 :write(byte[] bye, int index, int len) 一次写入一个指定的字节数组
    (6)关闭资源
package com.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class test13 {
    public static void main(String[] args) throws IOException {
        //通过字节流一次写一个字节数组的方式,将1.jpg复制到3.jpg
        FileInputStream fis = new FileInputStream("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.jpg");
        FileOutputStream fos = new FileOutputStream("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/3.jpg");
        byte[] bys = new byte[2048];
        int len;
        while ((len = fis.read(bys)) != -1) {
            fos.write(bys, 0, len);
        }
        fis.close();
        fos.close();
    }
}

字节缓冲流拷贝文件

字节缓冲流有自己的缓冲区,大小为8192个字节,也就是8KB。

package com.io;

import java.awt.image.BufferedImage;
import java.io.*;

public class test14 {
    public static void main(String[] args) throws IOException {
        //通过字节缓冲流,复制字节文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/1.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/Users/yu/IdeaProjects/JavaSE/基础语法/lib/4.jpg"));
        int len;
        while ((len = bis.read()) != -1) {
            bos.write(len);
        }
        bis.close();
        bos.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值