IO流
1.File类
java.io.File 类是⽂件和⽬录路径名的抽象表示,主要⽤于⽂件和⽬录的创建、查找和删除等 操作。
1.1构造方法
- public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新 的 File 实例。
- public File(String parent, String child) :从⽗路径名字符串和⼦路径名字符串创建 新的 File 实例。
- public File(File parent, String child) :从⽗抽象路径名和⼦路径名字符串创建新的 File 实例
注:
- File类创建的对象代表硬盘中实际存在的一个文件或者目录 ,但这个文件或者目录的是否真的存在不影响对象的创建。
// ⽂件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname);
// ⽂件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2);
// 通过⽗路径和⼦路径字符串
String parent = "d:\\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);
// 通过⽗级File对象和⼦路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);
2.2 获取路径的方法
- public String getAbsolutePath() :返回此File的绝对路径名字符串。
- public String getPath() :将此File转换为路径名字符串。
- public String getName() :返回由此File表示的⽂件或⽬录的名称。
- public long length() :返回由此File表示的⽂件的⻓度。
- public boolean exists() :此File表示的⽂件或⽬录是否实际存在。
- public boolean isDirectory() :此File表示的是否为⽬录。
- public boolean isFile() :此File表示的是否为⽂件。
public class FileGet {
public static void main(String[] args) {
File f = new File("d:/aaa/bbb.java");
System.out.println("⽂件绝对路径:" + f.getAbsolutePath());
System.out.println("⽂件构造路径:" + f.getPath());
System.out.println("⽂件名称:" + f.getName());
System.out.println("⽂件⻓度:" + f.length() + "字节");
File f2 = new File("d:/aaa");
System.out.println("⽬录绝对路径:" + f2.getAbsolutePath());
System.out.println("⽬录构造路径:" + f2.getPath());
System.out.println("⽬录名称:" + f2.getName());
System.out.println("⽬录⻓度:" + f2.length());
}
}
输出结果:
⽂件绝对路径:d:\aaa\bbb.java
⽂件构造路径:d:\aaa\bbb.java
⽂件名称:bbb.java
⽂件⻓度:636字节
⽬录绝对路径:d:\aaa
⽬录构造路径:d:\aaa
⽬录名称:aaa
⽬录⻓度:4096
2.3 创建删除查询方法
- public boolean createNewFile() :当且仅当具有该名称的⽂件尚不存在时,创建⼀个新 的空⽂件。
- public boolean delete() :删除由此File表示的⽂件或⽬录。
- public boolean mkdir() :创建由此File表示的⽬录。
- public boolean mkdirs() :创建由此File表示的⽬录,包括任何必需但不存在的⽗⽬录。
// ⽂件的创建
File f = new File("aaa.txt");
System.out.println("是否存在:" + f.exists()); // false
System.out.println("是否创建:" + f.createNewFile()); // true
System.out.println("是否存在:" + f.exists()); // true
- public String[] list() :返回⼀个String数组,表示该File⽬录中的所有⼦⽂件或⽬录。
- public File[] listFiles() :返回⼀个File数组,表示该File⽬录中的所有的⼦⽂件或⽬录。
File dir = new File("d:\\java_code");
// 获取当前⽬录下的⽂件以及⽂件夹的名称。
String[] names = dir.list();
for (String name : names) {
System.out.println(name);
}
// 获取当前⽬录下的⽂件以及⽂件夹对象,只要拿到了⽂件对象,那么就可以获取更多
信息
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file);
}
IO流的概念及分类
根据数据的流向分为:输⼊流和输出流。
- 输⼊流 :把数据从 其他设备 上读取到 内存 中的流。
- 输出流 :把数据从 内存 中写出到 其他设备 上的流。
格局数据的类型分为:字节流和字符流。
- 字节流 :以字节为单位,读写数据的流。
- 字符流 :以字符为单位,读写数据的流。
IO流的选择
- 要不要读内容 - 要(看得懂) - 缓冲字符流
- 要不要读内容 - 不要(不需要看得懂) - 字节流
2. 字节流
作用:主要用于文件的复制;当控制台中输出的文件内容不需要看得懂,则采用字节流
2.1 字节输入流 FileInputStream
FileInputStream是抽象类InputStream的一个实现类
最底层的单位,有很多的子类,最简单的是FileInputStream,
FileInputStream 类是⽂件输⼊流,从⽂件中读取字节。
构造方法:
- FileInputStream(File file) :通过打开与实际⽂件的连接来创建⼀个 FileInputStream ,该⽂件由⽂件系统中的 File对象 file命名。
- FileInputStream(String name) :通过打开与实际⽂件的连接来创建⼀个 FileInputStream ,该⽂件由⽂件系统中的路径名 name命名。
当你创建⼀个流对象时,必须传⼊⼀个⽂件路径。该路径下,如果没有该⽂件,会抛出 FileNotFoundException 。
⼩贴⼠:
使⽤数组读取,每次读取多个字节,减少了系统间的IO操作次数,从⽽提⾼了读写的效 率,建议开发中使⽤。
// 使⽤File对象创建流对象
File file = new File("a.txt");
FileInputStream fos = new FileInputStream(file);
// 使⽤⽂件名称创建流对象
FileInputStream fos = new FileInputStream("b.txt");
}
常用方法:
- int read( ):每次可以读取⼀个字节的数据,提升为int类型,读取到⽂件末尾, 返回 -1
- int red(byte[] b):read ⽅法,每次可以读取⼀个字节的数据,提升为int类型,读取到⽂件末尾, 返回 -1
- public void close() :关闭此输⼊流并释放与此流相关联的任何系统资源。
⼩贴⼠:
1. 虽然读取了⼀个字节,但是会⾃动提升为int类型。
2. 流操作完毕后,必须释放系统资源,调⽤close⽅法,千万记得。
2.2 字节输出流 FileOutputStream
抽象类OutputStream 有很多⼦类,我们从最简单的⼀个⼦类开始。 java.io.FileOutputStream 类是⽂件输出流,⽤于将数据写出到⽂件。
构造方法:
- FileOutputStream(File file,,boolean) :创建⽂件输出流以写⼊由指定的 File对象表示的 ⽂件。
- FileOutputStream(String name,,boolean) :创建⽂件输出流以指定的名称写⼊⽂件。
当你创建⼀个流对象时,必须传⼊⼀个⽂件路径。该路径下,如果没有这个⽂件,会创建该⽂ 件。如果有这个⽂件,会清空这个⽂件的数据。
常用的方法:
- write(int b) ⽅法,每次可以写出⼀个字节数据
- write(byte[] b) ,每次可以写出数组中的数据
- write(byte[] b, int off, int len) ,每次写出从off索引开 始,len个字节
2.2 缓冲字节输入流 BufferedInputSream
以字节输出流为基础
作用:缓冲字节流提升效率
构造方法:
- BufferedInputStream(InputStream str ):创建一个缓冲字符流对象
new BufferedInputStream(new FileInputStream(filename/file))
方法:跟字节输入流一样
2.4 缓冲字节输出流 BufferedOutputStream
以字节输出流为基础
作用:缓冲字节流提升效率
构造方法:
- BufferedOutputStream(InputStream s):创建缓冲字节输出流
new BufferedInputStream(new FileInputStream(filename/file,boolean))
这两个构造⽅法,参数中都需要传⼊⼀个boolean类型的值, true 表示追加数据, false 表示 清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了。
3.字符流
作用:以字符为 单位读写数据,专⻔⽤于处理⽂本⽂件
3.1 字符输入流 InputStreamReder
字符流: 以字节流为基础的, 作用就是为了创建缓冲字符流
构造方法:
- new InputStreamReader(inputStream, charset) : 参数为一个字节流,并且可以设置字符集
方法:
- public void close() :关闭此流并释放与此流相关联的任何系统资源。
- public int read() :从输⼊流读取⼀个字符。返回-1,文件结束
- public int read(char[] cbuf) :从输⼊流中读取⼀些字符,并将它们存储到字符数组 cbuf 中 。
返回-1
new InputStreamReader(new FileInputStream(file/filename),charset)
注:在后面添加charset可以转化成自己需要的字符集,来改变字符集
3.2字符输出流 OutputStreamReade
构造方法:
- new OutputStreamReader(outputStream, charset) :
方法:
- write(int b) :每次可以写出⼀个字符数据
- write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次 可以写出字符数组中的数据,⽤法类似FileOutputStream
- write(String str) 和 write(String str, int off, int len) ,每次可以 写出字符串中的数据
4. 缓冲字符流
以字符流为基础,先把数据存到缓冲区再处理,但除了自动刷新的方法以外,其他的必须要刷新
否则出现读不出来或者写不出来的情况
4.1 缓冲字符输入流 BufferedReader
字符输入流为基础
构造方法:
- BufferedReader(reader):上传一个字符输入流对象
方法:
- String readLine(): 通常读完一行, 都是要解析的/处理的,读到文件末尾时,返回null值
new BufferedReader(new InputStreamReader(new FileInputStream(file/filename)))
4.2 缓冲字符输出流 PrintWriter
以字符输出流为基础
构造方法:
- PrintWriter(writer, boolean autoFlush) :上传一个字符输出流对象,true,false来决定是否自动刷新
构造方法:
- print(): 需要手动刷新
- println(): 会自动刷新
- void flush() :刷新该流的缓冲。
- void close() :关闭此流,但要先刷新它。
new PrintWriter(new OutputStreamReader(new FileOutputStream(file/filename)),boolean autoFlush)
注:
- autoFlush只对println()有效,print()仍需要手动刷新flush(),否则输出的文件中将没有任何内容
- IO流需要注意关闭输出流,关闭资源
1. 虽然参数为int类型四个字节,但是只会保留⼀个字符的信息写出。
2. 未调⽤close⽅法,数据只是保存到了缓冲区,并未写出到⽂件中。
字节 -> 字符: 解码
字符 -> 字节: 编码
4. 对象流
作用:把一个对象以具有对象特征的形式存储到文件中 或者文件中读取对象继续使用
前提:必须可序列化 ,要固定类的版本号
- ObjectInputStream():
Object readObject() ,一个对象一个对象的读 - ObjectOutputStream():
writeObject() 一个对象一个对象的写
4.1 序列化: Serializable
作用:可序列化的类对象才能转换成字节,从而实现读写
Serializable接口,是可序列化接口,只要实现Serializable的类才能序列化
对象 -> 字节: 序列化 -> 文件: 持久化
字节 -> 对象: 反序列化
transient: 修饰的属性值不会被序列化
serialVersionUID: 固定类的版本号
如果不固定, 会自动生成, 会随着类的内容改变, 而改变
public static final long serialVersionUID = xxxL;
5.JavaBean规范:
- 无参构造器
- 属性, 提供get/set
- 实现序列化接口
- 基本数据类型使用包装类
- 不能用final修饰