<13>IO流(上)

1.1 IO流概述

1.1.1 流的分类

  • 1.按操作数据单位:字节流、字符流
  • 2.按数据的流向:输入流、输出流
  • 3.按流的角色:节点流、处理流

1.1.2 流的体系结构

一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图:
在这里插入图片描述

1.2 输入、输出的标准化过程

1.2.1 输入过程

① 创建File类的对象,指明读取的数据的来源。(要求此文件一定要存在)
② 创建相应的输入流,将File类的对象作为参数,传入流的构造器中
③ 具体的读入过程:
创建相应的byte[] 或 char[]。
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理。

1.2.2 输出过程

① 创建File类的对象,指明写出的数据的位置。(不要求此文件一定要存在)
② 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
③ 具体的写出过程:
write(char[]/byte[] buffer,0,len)
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理。

1.3 File类

1.3.1 File类理解

  • File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
  • File类声明在java.io包下
  • File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法, 并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
  • 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".

1.3.2 File的实例化

常用构造器

  • File(String filePath)
  • File(String parentPath,String childPath)
  • File(File parentFile,String childPath)

路径的分类

  • 相对路径:相较于某个路径下,指明的路径。
  • 绝对路径:包含盘符在内的文件或文件目录的路径。

说明
IDEA中:
如果大家开发使用JUnit中的单元测试方法测试,相对路径即为当前Module下
如果大家使用main()测试相对路径即为当前的Project下
Eclipse中:
不管使用单元测试方法还是使用main()测试,相对路径都是当前的Project下

1.4 FileReader/FileWriter的使用

1.4.1 FileReader的使用

首先介紹两种流操作:

  • public void close() throws IOException{}
    关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
  • public int read(byte[] r) throws IOException{}
    这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。
    在这里插入图片描述
    例1:将review01下的hello.txt文件内容读入程序中,并输出到控制台
  @Test
 public void test002() {
        FileReader fr = null;
        try {
        	//1.File类的实例化
            File file = new File("E:\\Review\\src\\review01\\hello.txt");
            //2.FileReader流的实例化
            fr = new FileReader(file);

			//3.读入的操作
            char[] cbuf = new char[5];
            int len = 0;
            //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
            while((len = fr.read(cbuf)) != -1){
                String str = new String(cbuf, 0, len);
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.资源的关闭
            if (fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 注:public String(byte[] bytes,int offset,int length)这个方法表示 将字符数组bytes从第offset个字符开始,长度为length的所有字符构建成一个字符串。

1.4.2 FileWriter的使用

涉及到的流操作:

  • public void write(byte[] w)
    把指定数组中w.length长度的字节写到OutputStream中。

说明:

  • 输出操作,对应的File可以不存在的。并不会报异常
  • File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
    File对应的硬盘中的文件如果存在:
    如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原文件的覆盖
    如果流使用的构造器是:FileWriter(file,true):不会对原文件覆盖,而是在原文件基础上追加内容

例:从内存中写出数据到硬盘的文件里。

    @Test
    public void writeTest(){

        FileWriter fw = null;
        try {
        	//1.提供File类的对象,指明写出到的文件
            File file = new File("hello1.txt");
			//2.提供FileWriter的对象,用于数据的写出
            fw = new FileWriter(file, false);
			//3.写出的操作
            fw.write("abcd\n");
            fw.write("efg");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.流资源的关闭
            if (fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

1.4.3 文本文件的复制

例:将Project下的hello1.txt复制为hello2.txt

 @Test
    public void test03(){

        FileReader fr = null;
        FileWriter fw = null;
        try {
            //1.创建File类的对象,指明读入和写出的文件
            File file = new File("hello1.txt");//读入的文件
            File destFile = new File("hello2.txt");//写出的文件

			//2.创建输入流和输出流的对象
            fr = new FileReader(file);
            fw = new FileWriter(destFile);//3.数据的读入和写出操作
            char[] c = new char[5];
            int len;
            while ((len = fr.read(c)) != -1){
                fw.write(c,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.关闭流资源
            if (fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

1.5 FileInputStream / FileOutputStream的使用

  • 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
  • .对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理

例:实现对图片的复制操作

 @Test
    public void test1(){

        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
        	//1.创建File类的对象,指明读入和写出的文件
            File file = new File("xx.jpg");
            File descFile = new File("yy.jpg");
			//2.创建输入流和输出流的对象
            fis = new FileInputStream(file);
            fos = new FileOutputStream(descFile);
			//3.数据的读入和写出操作
            byte[] bytes = new byte[5];
            int len;
            while ((len = fis.read(bytes)) != -1){
                fos.write(bytes,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.资源关闭
            if (fis !=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

文章参考:
b站尚硅谷宋红康老师Java教学视频;
菜鸟教程:https://www.runoob.com/java/java-files-io.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值