文件概述
回顾数据存储方案
计算机内存中: 临时性的数据存储方案
-
变量:单一数据存储方式
-
数组:一组相同数据类型的数据
-
数据类型:相同
-
长度一经定义不可改变
-
-
对象:存储一组具有关联性的数据
-
集合:可变数组、键值对存储,满足了我们各种各样的数据存储要求
计算机硬盘中: “持久性” 的数据存储方案
-
文件 :是存储在某种长期储存设备上的一段数据流。
-
所谓 “长期储存设备” 一般指:磁盘、光盘、磁带等。
-
文件存储的特点:所存信息可以长期、多次使用,不会因为断电而消失。
File类
java.io.File:是 Java 给我们提供的,用于操作文件/文件夹(目录)的 API。
构造方法:
-
File(String path) 通过文件/文件夹的路径来构建一个 File 对象
注意:路径分隔符,在使用
\
时,小心被 Java 识别为转义字符File file1 = new File("d:\\a.txt"); File file2 = new File("d:/Develop");
-
File(String parent, String child) 通过文件/文件夹的父路径 + 子路径来构建一个 File 对象
-
File(File parent, String child) 通过文件/文件夹的父 File 对象 + 子路径来构建一个 File 对象
常用方法:
-
exists() : boolean 判断文件/文件夹是否存在
-
isFile() : boolean 判断是否是文件
-
isDirectory() : boolean 判断是否是文件夹
-
getName() : String 获取文件/文件夹的名字
-
length() : long 获取文件的大小(单位:字节)
-
createNewFile() : boolean 创建文件
-
delete() : boolean 删除文件/文件夹(只能删除空文件夹,且不进入回收站)
-
list() : String[] 获取指定文件夹下的所有内容列表(文件/文件夹)
-
listFiles() : File[] 获取指定文件夹下的所有内容的 File 对象列表(文件/文件夹)
-
listFiles(FileFilter fileFilter) : File[] 根据文件过滤器来获取指定文件夹下的所有内容的 File 对象列表
文件过滤器,可以定义一个匿名内部类,或是创建一个实现类,重写 accept 方法。
返回值,true:保留 false:舍弃
IO流概述
流: 水流(可以流动的水)、电流(可以流动的电)、车流(可以流动的车) ...
I:Input,输入
O:Output,输出
数据流: 可以流动的数据。
-
根据流动的方向进行分类(流动的方向是根据程序来决定的)
-
输入流:从数据源流动到程序(读取)
-
输出流:从程序流动到目的地(写入)
-
-
根据处理的单位进行分类
-
字节流:处理单位是字节,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 盘。
-
在 e 盘创建1个 a.txt 文件(输出流会自动创建文件)
-
将 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(); }