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
- 字符流是基于文本文档等需要进行内容操作的处理(凡是用于记事本直接打开还能看的)
- 字节流:处理单位是字节,byte
- 结合两种分类
- 字节输入流
- 字节输出流
- 字符输入流
- 字符输出流
字节流
字节输入流
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();
}
图片的复制
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();
}
}
}