17_输入和输出处理1

17_输入和输出处理-1

文件概述

以往数据存储方案

计算机内存中: 临时性的数据存储方案

  • 变量:单一数据存储方式
  • 数组:一组相同数据类型的数据
    • 数据类型:相同
    • 长度一经定义不可改变
  • 对象:存储一组具有关联性的数据
  • 集合:可变数组、键值对存储,满足了我们各种各样的数据存储要求

计算机硬盘中: “持久性” 的数据存储方案

  • 文件 :是存储在某种长期储存设备上的一段数据流。
    • 所谓 “长期储存设备” 一般指:磁盘、光盘、磁带等。
    • 文件存储的特点:所存信息可以长期、多次使用,不会因为断电而消失。

File

构造方法:

  • File(String path)通过文件/文件夹的路径来构建一个File对象 **注意:**路径分隔符,在使用\时,小心被Java识别为转义字符

    File File1 = new File("d:\\a.txt");
    File File2 = new File("d:/a.txt");
    
  • File(String parent,String child)通过文件/文件夹的父路径 + 子路径来构建一个File对象

  • File(File parent,String child)通过文件/文件夹的父File对象 + 子路径来构建一个File对象

常用方法:

  • ecists():boolean 判断文件/文件夹是否存在
  • isFile():boolean 判断是否是文件
  • isDriectory():boolean 判断是否是文件夹
  • getName():String 获取文件/文件夹的名字
  • length():long 获取文件夹的大小
  • createNewFile():boolean 创建文件
  • delete():boolean 删除文件/文件夹(只能删除空文件夹,且不进入回收站)
  • list():String[] 获取指定文件夹下所有内容列表(文件/文件夹)
  • listFile():File[] 获取指定文件夹下所有的内容的File对象列表(文件/文件夹)
  • listFile(FileFiler fileFiler):File[] 根据过滤器来获取指定文件夹下的所有内容的File对象列表

文件过滤器,可以定义一个匿名内部类,或是创建一个实现类,重写accept方法

返回值,true:保留 false :舍弃

IO流概述

**数据流:**可以流动的数据

  • 根据流动的方向进行分类(流动的方向是根据程序来决定的)
    • 输入流:从数据源流动到程序(读取)
    • 输出流:从程序流动到目的地(写入)
  • 根据处理的单位进行分类
    • 字节流:处理单位是字节,byte
      • 字节流是最基础的一种处理单位
      • 通常用于一些文件复制、图片等处理(凡是用记事本直接打开的后不能看的)
    • 字符流:处理单位是字符,char
      • 字符流是基于文本文档等需要进行内容操作的处理(凡是用于记事本直接打开还能看的)
  • 结合两种分类
    • 字节输入流
    • 字节输出流
    • 字符输入流
    • 字符输出流

字节流

字节输入流

java.io.InputStream

  • FileInputStream

构造方法:

  • FileInputStream(String name) 底层就是用第二种构造
  • FileInputStream(File file)

常用方法:

  • read() : int 读取一个字节的内容(读完了,返回 -1)

    int b = 0;
    while ((b = fis.read()) != -1) {
        System.out.print((char) b);
    }
    
  • read(byte[] buffer) : int 读取一个字节数组的内容,返回的不是读取到的内容,而是读取了多少个字节到字节数组中,返回 -1 表示读取完了。

  • close() : void 关流/释放资源(开启流之后,一定要关流!)

关流

在使用流相关的 API 时,使用完一定记得关流!为了保证流资源能够正确关闭,将关闭流的方法调用放在 finally 中。

FileInputStream fis = null;
try {
    // 指定数据源
    fis = new FileInputStream("d:/a.txt");

    // 读取数据
    byte[] buffer = new byte[6];
    fis.read(buffer);
    for (byte b : buffer) {
        System.out.print((char) b);
    }
} finally {
    // 关流
    if (fis != null) {
        fis.close();
    }
}

Java 7:try-with-resources。

try (FileInputStream fis = new FileInputStream("d:/a.txt")) {
    // 读取数据
    byte[] buffer = new byte[6];
    fis.read(buffer);
    for (byte b : buffer) {
        System.out.print((char) b);
    }
} catch (Exception e) {
    e.printStackTrace();
}

字节输出流

java.io.OutputStream

  • FileOutputStream

构造方法: 如果目的地文件不存在,它会自动创建

  • FileOutputStream(String name) 根据目的地路径,来构建一个输出流
  • FileOutputStream(String name, boolean append) 根据目的地路径,来构建一个输出流,append 代表是否是追加数据
    • append:false,代表不追加数据,而是覆盖
    • append:true,代表追加数据
  • FileOutputStream(File file)
  • FileOutputStream(File file, boolean append)

常用方法:

  • write(int b) : void 写入一个字节数据
  • write(byte[] b) : void 写入一个字节数组的数据
  • write(byte[] b, int off, int len) : void 写入一个字节数组指定范围的数据
    • off:起始索引
    • len:长度
  • close() : void 关流

文件的复制

需求:将 d 盘的 a.txt 复制到 e 盘。

  1. 在 e 盘创建1个 a.txt 文件(输出流会自动创建文件)
  2. 将 d 盘的 a.txt 文件的内容写入到 e 盘的 a.txt 中(输入流读取,输出流写入)
// 指定数据源和输出目的地(创建输入流和输出流)
try (FileInputStream fis = new FileInputStream("d:/a.txt");
     FileOutputStream fos = new FileOutputStream("e:/a.txt")) {

    // 边读边写
    // 读取d盘a.txt内容
    byte[] buffer = new byte[1024];
    int len = 0;
    while ((len = fis.read(buffer)) != -1) {
        // 将读取到的内容写入e盘a.txt
        fos.write(buffer, 0, len);
    }

    System.out.println("复制成功!");
} catch (Exception e) {
    e.printStackTrace();
}

图片的复制

public static void main(String[] args) {
    File file1 = new File("E:/copy/pic");
    copy(file1);
}

/**
	 * 复制照片
	 * @param file1 文件夹地址
	 */
public static void copy(File file1) {
    File[] listFiles = file1.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isFile() && (pathname.getName().endsWith(".jpg") || 
                                         pathname.getName().endsWith(".png") || pathname.getName().endsWith(".gif"));
        }
    });
    for (File file2 : listFiles) {
        try (FileInputStream fis = new FileInputStream(file2);
             FileOutputStream fos = new FileOutputStream("E:/copy/pict/" + file2.getName())) {
            byte[] b = new byte[1024];
            int len = 0;
            while ((len = fis.read(b)) != -1) {
                fos.write(b, 0, len);
            }
            System.out.println("复制完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值