今日学习目标
- File类
- IO流的介绍
- IO流的分类
- 字节输出流
- 字节出入流
- 字节缓冲流
- Properties集合
-
1 File类
File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作
1.2 构造方法
| 方法 | 作用 | | —- | —- | | File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 | | File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例 | | File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例 |
1.3 File类的创建功能
| 方法 | 作用 |
|---|---|
| public boolean createNewFile() | 创建一个新的空的文件 |
| public boolean mkdir() | 创建一个单级文件夹 |
| public boolean mkdirs() | 创建一个多级文件夹 |
1.4 File类的删除功能
| 方法 | 作用 |
|---|---|
| public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
- 注意事项:
- delete方法直接删除不走回收站.无法恢复
- 如果删除的是一个文件,直接删除
- 如果删除的是一个文件夹,需要先删除文件夹中的内容,最后才能删除文件夹
1.5 File类的判断和获取功能
| 方法 | 作用 | | —- | —- | | boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 | | boolean isFile() | 测试此抽象路径名表示的File是否为文件 | | boolean exists() | 测试此抽象路径名表示的File是否存在 | | String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 | | String getPath() | 将此抽象路径名转换为路径名字符串 | | String getName() | 返回由此抽象路径名表示的文件或目录的名称 | | int length | 返回此文件的文件大小 |
1.6 File类的高级获取功能
| 方法 | 作用 |
|---|---|
| public File [ ] listFiles( ) | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 |
listFiles方法注意事项:
通过变量,数组,或者集合存储数据
- 都是不能永久化存储 , 因为数据都是存储在内存中
- 只要代码运行结束,所有数据都会丢失
使用IO流
按照流向区分
- 输入流是用来读数据的
- 输出流是用来写数据的
- 按类型区分
- 字符流(明天讲)
- 字节流
注意 :
FileOutputStream类:是文件输出流,用于将数据写出到文件
构造方法: | 方法 | 作用 | | —- | —- | | public FileOutputStream(File file) | 创建文件输出流以写入指定的File对象表示的文件 | | public FileOutputStream(String name) | 创建文件输出流以指定的名字写入文件 |
字节输出流写数据
字节流写数据的方法 | 方法 | 作用 | | —- | —- | | void write(int b) | 一次写一个字节数据 | | void write(byte[] b) | 一次写一个字节数组数据 | | void write(byte[] b, int off, int len) | 一次写一个字节数组的部分数据 |
2.2写数据的换行和追加写入
换行符
windows : \r\n
linux : \n<br /> mac : \r
public FileOutputStream(String name,boolean append)
InputStream类 : 字节输入流最顶层的类 , 抽象类 | 方法 | 作用 | | —- | —- | | public FileInputStream(File file) | 从file类型的路径中读取数据 | | public FileInputStream(String name) | 从字符串路径中读取数据 |
字节输入流步骤:
- 创建输入流对象
- 读数据
- 释放资源
public int read(byte[] b) :从输入流读取最多b.length个字节的数据,返回的是真实读到的数据个数
3.2图片的拷贝
public class FileInputStreamDemo2 {public static void main(String[] args) throws IOException {// 创建字节输入流对象FileInputStream fis = new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg");// 创建字节输出流FileOutputStream fos = new FileOutputStream("day11_demo\\copy.jpg");// 一次读写一个字节int by;while ((by = fis.read()) != -1) {fos.write(by);}// 释放资源fis.close();fos.close();}}
3.3 异常的捕获处理
JDK7版本优化处理方式 : 自动释放资源
- 可以使用 try-with-resource 语句,该语句确保了每个资源在语句结束时自动关闭。
格式 :
字节缓冲流仅仅提供缓冲区,不具备读写功能 , 而真正的读写数据还得依靠基本的字节流对象进行操作
4.1四种方式复制视频文件
```java import java.awt.image.DataBufferDouble; import java.io.*;
/* 需求:把“xxx.avi”复制到模块目录下的“copy.avi” , 使用四种复制文件的方式 , 打印所花费的时间
四种方式:1 基本的字节流一次读写一个字节 : 花费的时间为:196662毫秒2 基本的字节流一次读写一个字节数组 : 花费的时间为:383毫秒3 缓冲流一次读写一个字节 : 花费的时间为:365毫秒4 缓冲流一次读写一个字节数组 : 花费的时间为:108毫秒分析 :数据源 : "D:\a.wmv"目的地 : "day11_demo\copy.wmv"
*/ public class BufferedStreamDemo2 { public static void main(String[] args) throws IOException { long startTime = System.currentTimeMillis();
// method1();// method2();// method3();method4();long endTime = System.currentTimeMillis();System.out.println("花费的时间为:" + (endTime - startTime) + "毫秒");}// 4 缓冲流一次读写一个字节数组private static void method4() throws IOException {// 创建高效的字节输入流BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.wmv"));// 创建高效的字节输出流BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day11_demo\\copy.wmv"));// 一次读写一个字节数组byte[] bys = new byte[1024];int len;// 每次真实读到数据的个数while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);}// 释放资源bis.close();bos.close();}// 3 缓冲流一次读写一个字节private static void method3() throws IOException {// 创建高效的字节输入流BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.wmv"));// 创建高效的字节输出流BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day11_demo\\copy.wmv"));// 一次读写一个字节int by;while ((by = bis.read()) != -1) {bos.write(by);}// 释放资源bis.close();bos.close();}// 2 基本的字节流一次读写一个字节数组private static void method2() throws IOException {// 创建基本的字节输入流对象FileInputStream fis = new FileInputStream("D:\\a.wmv");// 创建基本的字节输出流对象FileOutputStream fos = new FileOutputStream("day11_demo\\copy.wmv");// 一次读写一个字节数组byte[] bys = new byte[1024];int len;// 每次真实读到数据的个数while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}// 释放资源fis.close();fos.close();}// 1 基本的字节流一次读写一个字节private static void method1() throws IOException {// 创建基本的字节输入流对象FileInputStream fis = new FileInputStream("D:\\a.wmv");// 创建基本的字节输出流对象FileOutputStream fos = new FileOutputStream("day11_demo\\copy.wmv");// 一次读写一个字节int by;while ((by = fis.read()) != -1) {fos.write(by);}// 释放资源fis.close();fos.close();}
}
<a name="EG0KT"></a># 5 Properties集合- properties是一个Map体系的集合类:- Properties中有跟IO相关的方法- 不需要加泛型,只用存字符串<a name="FBGm7"></a>#### 5.1 Properties作为集合的特有方法| 方法 | 作用 || --- | --- || Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,相当于put方法 || String getProperty(String key) | 使用此属性列表中指定的键搜索属性 , 相当于get方法 || Set<String> stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 , 相当于keySet方法 |<a name="nGZih"></a>#### 5.2 properties中和IO相关的方法| 方法 | 作用 || --- | --- || void load(InputStream inStream) | 以字节流形式 , 把文件中的键值对, 读取到集合中 || void load(Reader reader) | 以字符流形式 , 把文件中的键值对, 读取到集合中 || void store(OutputStream out, String comments) | 把集合中的键值对,以字节流形式写入文件中 , 参数二为注释 || void store(Writer writer, String comments) | 把集合中的键值对,以字符流形式写入文件中 , 参数二为注释 |<a name="KoszZ"></a>## 6 ResourceBundle加载属性文件```javaimport java.util.ResourceBundle;/*1 java.util.ResourceBundle : 它是一个抽象类我们可以使用它的子类PropertyResourceBundle来读取以.properties结尾的配置文件2 static ResourceBundle getBundle(String baseName) 可以根据名字直接获取默认语言环境下的属性资源。参数注意: baseName1.属性集名称不含扩展名。2.属性集文件是在src目录中的比如:src中存在一个文件 user.propertiesResourceBundle bundle = ResourceBundle.getBundle("user");3 ResourceBundle中常用方法:String getString(String key) : 通过键,获取对应的值优点 : 快速读取属性文件的值需求 :通过ResourceBundle工具类将一个属性文件 放到src目录中,使用ResourceBundle去获取键值对数据*/public class ResourceBundleDemo {public static void main(String[] args) {// public static final ResourceBundle getBundle(String baseName)// baseName : properties文件的名字 , 注意 : 扩展名不需要加上 , properties必须在src的根目录下ResourceBundle resourceBundle = ResourceBundle.getBundle("user");// String getString(String key) : 通过键,获取对应的值String value1 = resourceBundle.getString("username");String value2 = resourceBundle.getString("password");System.out.println(value1);System.out.println(value2);}}
- 使用ResourceBundle获取属性值:
- 获取ResourceBundle对象
- 通过ResourceBundle类中的getString(key) : 根据键找值
- 使用ResourceBundle加载属性文件,属性文件需要放置在src的根目录
