IO流相关(包括异常)

异常

异常的分类(Throwable):

  1. 异常(Exception):可预料的。应用程序可能需要捕获的异常:NullPointerException
  2. 错误(Error):不可预料的。合理的应用程序不应该试图捕获的问题:StackOverFlowError

异常的处理方式:

  1. JVM默认的异常处理方式:控制台打一个错误信息。
  2. 开发中异常的处理方式
    try...catch(finally):捕获,自己处理
    throws:抛出,交给调用者处理
  3. try...catch(finally):
    try {
      // 尝试执行的代码
    }catch (Exception e){
      // 出现可能的异常之后的处理代码
    }finally {
      //  一定会执行的代码,如关闭资源
    }

IO流概述

IO流指的是数据像连绵的流体一样进行传输。能够在本地磁盘和网络上传输。
        BufferedReader:高校的字符输入流(字符缓冲输入流)。

IO流分类:

数据流向分:输出流 (读数据),输入流(写数据)。

操作方式:
字节流:以字节为单位操作数据。
InputStream:字节输入流的顶层抽象类。
        FileInputStream:普通的字节输入流。
        BufferedInputStream:高校的字节输入流(字节缓冲输入流)。
OutputStream:字节输出流的顶层抽象类。
        FileOutputStream:普通的字节输出流。
        BufferedIOutputStream:高校的字节输出流(字节缓冲输出流)。

字符流:以字符为单位操作数据
Reader:字符输入流的顶层抽象类。
        FileReader:普通的字符输入流。

Writer:字符输出流的顶层抽象类。
        FileWriter:普通的字符输出流。
        BufferedWriter:高校的字符输出流(字符缓冲输出流)。

File类 

File基本如下:

public static void main(String[] args) throws IOException {
        // 创建File对象的构造方法:
        File file = new File("D:/1.txt");
        File file1 = new File("D:/","1.txt");

        File file2 = new File("D:/");
        File file3 = new File(file2 , "1.txt");

        System.out.println(file);
        System.out.println(file1);
        System.out.println(file3);
        file.exists();
        file.createNewFile();
        file.isDirectory();
        file.isFile();

    }

 File成员的获取方法:

  1. 获取绝对路径:getAbsolutePath(),以盘符开头:D:/1.txt
  2. 获取相对路径:getPath(),相对于当前项目路径来说。
  3. getName():获取文件名。
  4. list():返回指定目录下所有文件(夹)名称数组:String[ ]
  5. listFiles():返回指定目录下所有文件(夹)File数组: File[ ]

字符流读写文件

Reader:一旦实例化对象之后进行read()方法之后,会记录上次的调用。

  1. 按单个字符读取
        public static void main(String[] args) throws IOException {
            File file = new File("lib/1.txt");
            Reader reader = new FileReader(file);
            int ch;
            // 错误的写法
    //        while(reader.read() != -1){ // 此时判断时 会直接读取
    //            ch = reader.read();  // 再次读取时 跳到下一个字符
    //            System.out.println(ch);
    //        }
            while ((ch = reader.read()) != -1){
                System.out.println(ch);
            }
            reader.close();
        }
  2. 按字符数组进行读取
        public static void main(String[] args) throws IOException {
            File file = new File("lib/2.txt");
            Reader reader  = new FileReader(file);
            // 定义字符数组 存储每次读取的字符
            char[] chs = new char[3];
            // 记录reader读取的数组中的字符的个数
            int len ;
            while ((len = reader.read(chs)) != -1){
                String string = new String(chs , 0 , len);
                /*
                    chs : 表示要操作的数组
                    0 : 表示起始的索引
                    len: 表示要操作的字符的个数
                 */
                System.out.println(string);
            }
            reader.close();
            /*输出:
            abc
            def
            g
             */
        }

  3. 字符流写文件-按单个字符
    public static void main(String[] args) throws IOException {
            Writer writer = new FileWriter("lib/1.txt");
            //第一种
    //        writer.write("你");
            // 第二种
    //        char[] chs = {'你','好','啊'};
    //        writer.write(chs);
    //        writer.write(chs,1,1);
    //        第三种
            writer.write("好好学习,天天向上");
            // 释放资源
            writer.close();
        }
  4. 文件拷贝
    单个字符:
        public static void main(String[] args) throws IOException {
            Reader file = new FileReader("lib/1.txt");
    //        FileReader file = new FileReader("lib/1.txt");
            Writer writer = new FileWriter("lib/3.txt");
            int len;
            while ((len = file.read()) != -1){
                System.out.println(len);
                writer.write(len);
            }
            // 关闭资源
            file.close();
            writer.close();
        }
    字符数组:
     
        public static void main(String[] args) throws IOException {
            FileReader fileReader = new FileReader("lib/1.txt");
            FileWriter fileWriter = new FileWriter("lib/4.txt");
    
            char[] chs = new char[1024];
            int len;
            while((len = fileReader.read(chs)) != -1){
                fileWriter.write(chs , 0 ,len);
            }
    
            fileReader.close();
            fileWriter.close();
        }

字节流读写文件(拷贝除纯文本文件,如:图片、音频、视频等)

public static void main(String[] args) throws IOException {
        SingleBy();
//        ArrayBy();
//        BufferCopy();
    }

    // 单个字节进行拷贝
    public static  void SingleBy() throws  IOException{
        FileInputStream fileInputStream = new FileInputStream("lib/1.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("lib/2.txt");

        int len;
        while((len = fileInputStream.read()) != -1){
            fileOutputStream.write(len);
        }

        fileInputStream.close();
        fileOutputStream.close();
    }

    // 按数组进行拷贝
    public  static  void ArrayBy() throws IOException{
        FileInputStream fileInputStream = new FileInputStream("lib/3.png");
        FileOutputStream fileOutputStream = new FileOutputStream("lib/4.png");

        byte[] b = new byte[2048];
        int len;
        while ((len = fileInputStream.read(b)) != -1){
            fileOutputStream.write(b , 0 ,len);
        }

        fileInputStream.close();
        fileOutputStream.close();
    }

    // 字节缓冲流进行文件拷贝
    public  static void BufferCopy() throws  IOException{
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("lib/1234.zip"));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("lib/2345.zip"));

        byte[] b =new byte[2048];
        int len;
        while((len = bufferedInputStream.read(b)) != -1){
            bufferedOutputStream.write(b , 0 ,len);
        }

        bufferedInputStream.close();
        bufferedOutputStream.close();
    }

模拟上传图片(手动输入文件路径)

public static void main(String[] args) throws IOException{
//        1. 获取文件路径
        File file = getPath();
//        2.判断在目的地文件夹中是否存在对应的文件
        System.out.println(isExists(file));
        if (isExists(file)){
            System.out.println("图像已经存在!");
        }else {
            uploadFile(file);
            System.out.println("头像传输成功!");
        }
}
    public static File getPath(){
//        1. 提示用户输入对应的文件路径
        Scanner sc = new Scanner(System.in);
        while(true){
            System.out.println("请输入文件的路径:");
            String path = sc.nextLine();

//        如果不是.jpg 、.png 、 .bmp文件结尾的时候
            if(!path.endsWith(",jpg") && !path.endsWith(".png") && !path.endsWith(".bmp")){
                System.out.println("你输入的文件不是图片文件!请重新输入:");
                continue;
            }
//        判断文件是否存在
            // 将path封装成File类型 isFile() and exists()
            File file = new File(path);
            if (!file.exists() && !file.isFile()){
                System.out.println("存在否:"+file.exists());
                System.out.println("文件输入有误,请重新输入:");
            }else {
                return file;
            }

        }
    }

    public  static  boolean isExists(File file){
//        遍历目的地文件夹下的所有图片文件,查看是否相同
        File file1 = new File("picture/");
        String[] fileName = file1.list();
        for (String name:fileName) {
            System.out.println(name);
            if(name.equals(file.getName())){
                return true;
            }
        }
        return  false;
    }

    public static void uploadFile(File file) throws IOException {
        // 图片信息用字节流进行传输
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("picture/"+file.getName()));

        byte[] bytes = new byte[2048];
        int len;
        while((len = bis.read(bytes)) != -1){
            bos.write(bytes , 0 , len);
        }

        bis.close();
        bos.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值