IO流一

File和IO流简介

  • File

    • File是java.io.包下的类, File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。

    • 注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。(获取文件属性、创建、删除文件)

  • IO流

    • 用于读写数据的。(可以读写文件,或网络中的数据……)

File

创建对象

创建对象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//创建一个File对象,指代某个具体的文件。
//路径分隔符的三种写法
File f1 = new File("F:/ProgramData/resource/test.txt");
File f2 = new File("F:\\ProgramData\\resource\\test.txt");
File f3 = new File("F:" + File.separator + "ProgramData" + File.separator + "resource" + File.separator + "test.txt");
System.out.println(f1.length()); //66(字节)

//File可以指代一个不存在的文件
File f0 = new File("F:/none.txt");
System.out.println(f1.exists()); //false
System.out.println(f1.length()); //0


//实际应用中 文件在本工程下 使用相对路径更有利于代码的可迁移性
//相对路径(重点):不带盘符,默认从工程文件架开始找(直接从Project之后的目录开始写即可)
File f1 = new File("src\\test.txt");
System.out.println(f1.exists());
System.out.println(f1.length());
  • 绝对路径、相对路径

    • 绝对路径:从盘符开始

    • 相对路径:不带盘符,默认直接到当前工程下的目录寻找文件

常用方法1:判断文件类型、获取文件信息

  • File提供的判断文件类型、获取文件信息功能

常见方法2:创建文件、删除文件

  • File创建文件功能

  • File删除文件功能

  • 注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站。
  • 括号里填写要(创建/删除)的(文件/文件夹)的(相对路径/绝对路径)。

常见方法3:遍历文件夹

  • File类提供的遍历文件夹功能

  • 使用listFiles方法时的注意事项:
    • 只能遍历该文件夹下的所有一级文件
    • 当主调是文件,或者路径不存在时,返回null
    • 当主调是空文件夹时,返回一个长度为0的数组
    • 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
    • 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
    • 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null

前置知识:方法递归

  • 递归三要素
    • 递归的公式
    • 递归的终结点
    • 递归的方向必须走向终结点
  • 应用:文件搜素
    • 需求:从D:盘中,搜索“.exe”这个文件,找到后直接输出其位置。
    • 分析:
      1. 先找出D:盘下的所有一级文件对象。
      2. 遍历全部一级文件对象,判断是否是文件如果是文件,判断是否是自己想要的。
      3. 如果是文件夹,需要继续进入到该文件夹,重复上述过程。

前置知识:字符集

常见字符集介绍

  • 标准ASCII字符集

    • ASCIl(American Standard Code for Information Interchange):美国信息交换标准代码,包括了英文、符号等。
    • 标准ASCII使用1个字节存储一个字符,首位是0,总共可表示128个字符,对美国佬来说完全够用。
  • GBK(汉字内码扩展规范,国标)

    • 汉字编码字符集,包含了2万多个汉字等字符,GBK中一个中文字符编码成两个字节(16bit)的形式存储。
    • 注意:GBK兼容了ASCII字符集(8bit)。
    • GBK规定:汉字的第一个字节的第一位必须是1。)为了区分汉字和ASCII码。
  • Unicode字符集(统一码,也叫万国码)

    • Unicode是国际组织制定的,可以容纳世界上所有文字、符号的字符集。

    • UTF-32,4个字节表示一个字符。(浪费资源)

    • UTF-8

      • 是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节

      • 英文字符、数字等只占1个字节(兼容标准ASCII编码),汉字字符占用3个字节。

      • 注意:技术人员在开发时都应该使用UTF-8编码!

小结

字符集的编码、解码操作

  • Java代码字符编码

  • Java代码字符解码

  • 注意:
    • 默认使用平台字符集进行编码/解码
    • 若要指定字符集 需要抛出异常
    • 常用字符集:”ASCII”、”GBK”、”UTF-8”

IO流

IO流概述

  • IO流分类

    IO流分类

  • 流的四大类:

    • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流。
    • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流。
    • 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流。
    • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流。

IO流体系

IO流体系结构

IO流-字节流

文件字节输入流:每次读取一个字节、每次读取多个字节

  • FileInputStream(文件字节输入流)

    • 作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。

    • 使用FilelnputStream每次读取一个字节,读取性能较差,并且读取汉字输出会乱码。

    • 使用Filelnputstream每次读取多个字节,读取性能得到了提升,但读取汉字输出还是会乱码。

文件字节输入流:每次读取完全部字节

  • 方式一:自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。

  • 方式二:Java官方为InputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。

  • 小结

    • 直接把文件数据全部读取到一个字节数组可以避免乱码。
    • 但是如果文件过大,创建的字节数组也会过大,可能引起内存溢出。
    • 因此读写文本更适合用:字符流。
    • 字节流适合做数据的转移,如:文件复制等。

文件字节输出流:写字节出去

  • FileOutputStream(文件字节输出流)

    • 作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。

案例:文件复制

  • 字节流非常适合做一切文件的复制操作
  • 任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字节,只要复制后的文件格式一致就没问题!

IO流-资源释放的方式

  • .close()的资源释放方式 一旦代码出现异常 会占用系统资源不释放

try-catch-finally

  • finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。
  • 注意:千万不要在finally里return,会导致固定返回该内容。(程序return前会先执行finally)
  • 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)

try-with-resource

  • 该资源使用完毕后,会自动调用其close()方法,完成对资源的释放!
  • ()中只能放置资源,否则会报错。
  • 资源一般指的是最终实现了AutoCloseable接口。