1、File 类 (文件类)
是Java中的 文件/文件夹的 抽象表示形式 .
一个File类的对象, 在JAVA中, 就表示一个文件或文件夹 .
1.1、File类常用的构造方法
注意: 我们使用File类 描述文件时 ,这个File对象描述的文件 可以是不存在的 !
1. File(String pathName) ****
参数1: 文件的路径, 例如: c://x.txt
2. File(String parentName,String fileName) *
参数1: 文件夹的路径
参数2: 文件的名称
例如: 描述c盘中a文件夹中的x.txt
new File("c://a","x.txt");
3. File(File parent,String fileName) *
参数1: 父文件夹的 File对象
参数2: 文件的名称
例如: 描述c盘中a文件夹中的x.txt
new File(new File("c://a"),"x.txt");
1.2、File类常用的方法
- boolean createNewFile(); *
当此File对象表示的文件不存在时 , 此方法用于创建文件 , 创建成功返回true
当此File对象表示的文件已存在时, 此方法不执行任何的操作, 直接返回false
注意: 此方法不能用于创建文件夹
- boolean mkdir()
当此File对象表示的文件夹不存在时, 用于创建文件夹, 创建成功返回true
注意: 此方法只能用于创建一层目录, 也就是此File对象表示的父文件夹必须存在.
例如: File a = new File("c://a/b/c");
当我们操作a.mkdir();
//只有b文件夹已经存在时, 才会创建成功.
- boolean mkdirs() ***
当此File对象表示的文件夹不存在时, 用于创建文件夹, 创建成功返回true
注意: 此方法可用于创建多层目录
例如: File a = new File("c://a/b/c");
当我们操作a.mkdirs();
会在C盘创建a文件夹, 在a文件夹中创建b文件夹,在b文件夹中创建c文件夹
- boolean exists() *
判断此File对象所表示的文件 或 文件夹是否存在.
存在则返回true, 不存在则返回false;
- boolean delete(); *
删除此File对象 所表示的文件/文件夹 , 删除成功返回true
注意: 当用于删除文件夹时, 文件夹中的内容必须是空的.
- boolean deleteOnExit() 熟悉
当JVM退出时 , 删除此文件.
- boolean renameTo(File newFile);
更改文件的名称, 并将文件剪切到 参数位置
1.3、File类获取文件信息的方法
- String getAbsolutePath(); *
获取文件的绝对路径, 例如: c://x.txt
- String getName(); *
获取文件的名称 , 名称带有后缀名
- String getPath();
获取文件的路径
- long length(); *
返回文件的字节数
- long lastModified()
获取文件最后一次修改的时间
- boolean isFile() *
获取file对象 是否为文件, 文件则返回true , 文件夹则返回false
- boolean isDirctory()
获取file对象 是否为文件夹, 文件夹则返回true , 文件则返回false
- boolean isHidden()
获取此文件是否为隐藏文件 . 隐藏文件返回true
- String getParent();
通过一个file对象 获取其父文件夹的路径.
- File getParentFile() *
通过一个File对象, 获取其父文件夹的file对象
- String[] list() *
只有file对象为文件夹时 才可用, 用于获取子文件 /子文件夹的 路径数组
- File[] listFiles() ***
只有file对象为文件夹时 才可用, 用于获取子文件 /子文件夹的 文件数组 , 如果不存在子文件 则返回null
1.4、电脑中相对路径与绝对路径
绝对路径: c://a/b/c.txt
相对路径: 在c://a/b文件夹中的a.Java文件中 描述 heihei.txt
这个heihei.txt 就是相对路径, 相对于c://a/b存在的路径。
它的绝对路径解析为:c://a/b/heihei.txt
2、IO流
2.1、IO流的概念
1. input 输入
2. output 输出
输入与输出:
在我们程序中是一种相对的概念 .
例如:
我们的程序, 从硬盘中读取一个文件 !
这种操作 相对于我们的程序而言, 是在进行输入操作 .
这种操作 相对于我们的硬盘而言, 是在进行输出操作 .
例如:
我们的程序, 在硬盘中创建一个文件 !
这种操作 相对于我们的程序而言, 是在进行输出操作 .
这种操作 相对与我们的硬盘而言, 是在进行输入操作 .
2.2 Java中流的分类
从操作上来说, 分为两种流:
1. 输入流
2. 输出流
但是通常情况, 我们指的流的分类是:
1. 字节byte流
- 输出流顶级父 : OutputStream
- 输入流顶级父 : InputStream
2. 字符char流
- 输出流顶级父 : Writer
- 输入流顶级父 : Reader
整个Java的io体系, 使用了大量的装饰者设计模式.
字符的组成,依赖编码表:UTF-8,GBK
2.3 字节输出流 OutputStream
常用方法:
- void write(int b);
向输出流指向的位置 , 输出一个字节.
- void write(byte[] bytes);
向输出流指向的位置 , 输出一个字节数组 .
- void write(byte[] bytes,int offset,int len);
向输出流指向的位置 , 输出一个字节数组的一部分 (从offset开始, 输出len个字节)
- void close()
关闭流, 释放占用的硬件资源.
2.3.1 FileOutputStream 文件字节输出流
FileOutputStream 是 OuputStream 的实现类 , 是用于将字节 输出到文件中的 类.
文件输出流 输出时, 指向的文件可以不存在, 会创建文件并输出 .
构造方法:
- FileOutputStream(String filePath); ***
通过文件的绝对路径 , 创建一个指向文件的输出流.
- FileOutputStream(String filePath,boolean append); ***
参数1. filePath: 创建的流 , 指向的文件路径
参数2. append : 设置流是否为追加模式 .
(当值为false时, 会将之前的数据清空)
(当值为true时, 会接着之前的文件 继续存储)
- FileOutputStream(File file); ***
通过文件的file对象 , 创建一个指向文件的输出流.
- FileOutputStream(File file,boolean append); ***
参数1. file : 创建的流 , 指向的文件
参数2. append : 设置流是否为追加模式 .
(当值为false时, 会将之前的数据清空)
(当值为true时, 会接着之前的文件 继续存储)
2.4 InputStream 输入流
常用方法:
- int read()
一次读取一个字节,(这个字节 使用0-255的int值来表示) 并返回 , 如果读取到流的尾部则返回-1
- int read(byte[] bytes); ***
一次读取一个字节数组 , 并将读取的内容存储到bytes中 , 返回的是读取的字节个数 , 当读取到流尾部时返回-1
- int read(byte[] bytes,int offIndex,int length)
bytes: 读取的字节数组, 存储的位置
offIndex: 读取的一组字节, 存储在bytes中的起始位置
length: 读取的一组字节的长度
这个方法读取完毕后, 新的数据存储在 bytes数组的 offIndex下标 到 offIndex+length下标
- void close();
关闭流, 释放资源.
2.4.1 FileInputStream 文件输入流
构造方法:
- FileInputStream(String filePath);
根据一个文件的路径, 创建一个指向此文件的输入流
- FileInputStream(File file);
根据一个file对象, 创建一个指向file表示文件的输入流.
2.6 字符流
2.6.1 字符输出流 Writer ***
字符流进行输出操作时, 都是在操作缓冲管道. 当管道缓冲满时, 才会一次性 写出到文件中.
常用方法:
- void write(int ch);
一次写出一个字符
- void write(char[] chars);
一次写出一个字符数组
- void write(char[] chars,int start,int end);
一次写出一个字符数组的一部分. 从start开始 到end结束, 含start 不含end
- void write(String text); ****
一次写出一个字符串 到流指向的位置
- void flush() ***
刷新缓冲管道 : 强制将管道中的缓存数据 输出到流指向的位置, 并清空管道 !
- void close(); ***
释放资源, 字符输出流在关闭时 , 会自动执行flush操作.
2.6.2 FileWriter 文件字符输出流
构造方法:
- FileWriter(String filePath); ***
通过文件的绝对路径 , 创建一个指向文件的输出流.
- FileWriter(String filePath,boolean append); ***
参数1. filePath: 创建的流 , 指向的文件路径
参数2. append : 设置流是否为追加模式 .
(当值为false时, 会将之前的数据清空)
(当值为true时, 会接着之前的文件 继续存储)
- FileWriter(File file); ***
通过文件的file对象 , 创建一个指向文件的输出流.
- FileWriter(File file,boolean append); ***
参数1. file : 创建的流 , 指向的文件
参数2. append : 设置流是否为追加模式 .
(当值为false时, 会将之前的数据清空)
(当值为true时, 会接着之前的文件 继续存储)
字符输入流 Reader ***
常用方法:
int read();
一次读取一个字符, 并按照int的方式返回! 当读取到流尾部时 返回-1
int read(char[] chars);
一次读取一个字符数组, 并将读取到的数据存储到chars中, 返回读取的字符个数, 当读取到流的尾部时返回-1;
int read(char[] chars,int offset ,int length);
一次读取一个字符数组的一部分 , 读取的数据存储在chars中的 offset到length下标中 .
返回读取的字符个数, 当读取到流的尾部时返回-1
void close();
关闭流 ,释放资源
2.6.3FileReader 文件字符输入流
构造方法:
- FileReader(String filePath);
根据一个文件的路径, 创建一个指向此文件的输入流
- FileReader(File file);
根据一个file对象, 创建一个指向file表示文件的输入流.
2.6.4 BufferedReader 逐行读取字符流 *****
这个类是用于逐行读取字符的 .
这个类 比较特殊, 它的构造方法不是传入文件地址, 而是传入其他的字符输入流!
构造方法:
BufferedReader(Reader r);
常用方法:
String readLine();
读取一行数据, 返回读取到的内容, 如果读取到流的尾部返回null;
案例:
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("d://heihei.txt");
BufferedReader br = new BufferedReader(fr);
StringBuffer sb = new StringBuffer();
String text = null;
while((text = br.readLine())!=null) {
sb.append(text+"\r\n");
}
System.out.println(sb.toString());
br.close();
fr.close();
}
2.7 打印流 (PrintStream | PrintWriter) *****
构造方法:
1. PrintStream(OutputStream os) | PrintWriter(Writer w);
根据一个流, 创建一个打印流.
2. PrintStream(String filePath) | PrintWriter(String filePath); ***
根据一个文件的绝对路径, 创建一个打印流
3. PrintStream(File file) | PrintWriter(File file); ***
根据一个文件的file对象, 创建一个打印流
4. PrintStream(File file,String charsetName); | PrintWriter(File file,String charsetName);
根据一个文件的file对象 和 字符编码名称 创建一个打印流
常用方法:
参考System.out.printXXX....
2.8 转换流
用于将字节流 转换为 字符流 .
转换后得到的字符流, 操作的方式与 文件字符流一致 ;
2.8.1 OutputStreamWriter 字节转字符 输出流
通过构造方法, 进行转换:
- OutputStreamWriter(OutputStream os);
参数1. 根据一个字节流, 创建一个字符流
- OutputStreamWriter(OutputStream os,Sting charsetName);
参数1. 根据一个字节流, 创建一个字符流
参数2. 字节流转换为字符流时, 使用的字符编码集的名称;
案例:
public static void main(String[] args) throws Exception {
// 创建文件字节输出流
FileOutputStream fos = new FileOutputStream("c://x.txt");
// 准备输出的文字
String text = "从前有座山, 山里有座老和尚";
// 创建转换流, 将字节fos转换为字符流, 然后通过字符流 ,输出文字
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.write(text);
osw.close();
System.out.println("输出完毕");
}
2.8.2 InputStreamReader 字节转字符 输入流
通过构造方法, 进行转换:
- InputStreamReader(InputStream is);
参数1. 根据一个字节流, 创建一个字符流
- InputStreamReader(InputStream is,Sting charsetName);
参数1. 根据一个字节流, 创建一个字符流
参数2. 字节流转换为字符流时, 使用的字符编码集的名称;
案例:
public static void main(String[] args) throws Exception {
// 创建一个字节输入流
FileInputStream fis = new FileInputStream("c://x.txt");
// 将字节输入流, 转换为字符输入流
InputStreamReader isr = new InputStreamReader(fis);
// 再将一个字符流, 转换为逐行读取的流
BufferedReader br = new BufferedReader(isr);
String text = br.readLine();
System.out.println(text);
br.close();
isr.close();
fis.close();
}
2.9 对象序列化
对象序列化流
指的是: 将Java中的对象,存储到本地文件中的过程.
构造方法:
ObjectOutputStream(OutputStream os)
常用方法:
writeObject(Object o);
对象反序列化流
指的是: 将本地文件中存储的Java对象, 读取到内存中的过程.
构造方法:
ObjectInputStream(InputStream is);
常用方法:
Object o = 对象.readObject();
2.9.1 序列化接口 Serializable
Java中我们编写的类的对象, 默认情况下是不能参与序列化.
需要实现一个标记接口: Serializable , 才可以被序列化
标记接口:
接口中不包含任何的抽象, 实现后对于实现类来说, 类的接口没有发生改变, 仅仅是多了一个父接口.
注意: 对象在序列化时, 会依次序列化它的属性值.
属性值的类型, 也必须实现序列化接口
2.9.2 在对象序列化时, 有两种特殊修饰的属性, 不会被序列化
1. 被static 修饰的属性不会被序列化. 因为静态的属性不依赖于对象, 我们的对象序列化操作, 就不会操作这些静态的属性;
2. 被transient修饰的属性 ,序列化时会被忽略 , 反序列化时是默认的值;
3、try - with - resources
所有实现了Closeable或AutoCloseable接口的类,都可以通过此方式关闭资源。
格式一 (JDK1.7) :
try(Closeable c = new Closeable()){
}catch(){
}
//c就会在finally中自动释放
格式二(JDK1.9) :
Java
try(Closeable对象1;Closeable对象2...){
}catch(){
}
//通过分号隔开的closeable对象都会在finally中自动释放