io
约 2755 字大约 9 分钟
io
- 1. IO概述
- 2. IO的继承体系
- 3. java.io.File:Java中把文件或者目录(文件夹)都封装成File对象
- 4. java.io.OutputStream: 抽象类,表示输出字节流的所有类的超类
- 5. java.io.FlieOutputStream
- 6. java.io.ObjectOutputStream操作对象的流
- 7. java.io.FilterOutputStream
- 8. java.io.PrintStream
- 9. java.io.BufferedOutputStream
- 10. java.io.InputStream
- 11. java.io.FileInputStream
- 12. java.io.ObjectInputStream 对象反序列化流,从流中读取对象的操作流
- 13. java.io.FilterInputStream
- 14. java.io.BufferedInputStream
- 15. java.io.Writer 写入字符流的抽象类
- 16. java.io.BufferedWriter 字符缓冲输出流,提高了IO读写速度
- 17. java.io.PrintWriter
- 18. java.io.OutputStreamWriter
- 19. java.io.FileWriter
- 20. java.io.Reader 读取字符流的抽象超类
- 21. java.io.BufferedReader 字符缓冲输入流,提高了IO读写速度
- 22. java.io.InputStreamReader 字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符
- 23. java.io.FileReader
- 24. flush()和close()的区别?
- 25. 文件复制
1. IO概述
- IO就是将内存中的数据持久化存储到持久化设备上,使用的时候从持久化设备上读入内存
- IO操作:当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
- 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
- IOExcption异常
2. IO的继承体系
![IO.jpg](https://290ff162.telegraph-image-eg9.pages.dev/file/3e02a33c786b280333be7.png)
3. java.io.File:Java中把文件或者目录(文件夹)都封装成File对象
- File("e:\a\hello.java");将给定路径名称字符串转换为抽象路径名创建File对象,(包括不存在文件或者文件夹)
- boolean createNewFile()创建不存在的文件并返回true,存在false
- boolean mkdir()创建不存在的单层文件夹并返回true,存在false
- boolean mkdirs()创建多层文件夹
- boolean delete()删除此抽象路径名表示的文件或空目录
- boolean isFile()判断此抽象路径名表示的文件是否为标准文件
- boolean isDirectory()判断此抽象路径名表示的文件是否是目录(文件夹)
- String getAbsolutePath()获取当前File对象的绝对路径名字符串
- String getPath()将此抽象路径名转换为一个路径名字符串
- String getName()获取当前File对象的文件或目录的名称
- long length()获取当前File对象的文件或文件夹的大小(字节)
- boolean exists() 判断File对象对应的文件或目录是否存在
- String[] list()获得抽象路径名目录的文件和目录的字符串数组,指定的目录必须是存在的目录。否则数组为null
- File[] listFiles()获取抽象路径名目录中的File对象数组,指定的目录必须是存在的目录。否则数组为null
- File[] listFiles(FilenameFilter filter)返回File的目录中满足过滤器的文件和目录抽象路径名数组
- File[] listFiles(FileFilter filter)返回File的目录中满足过滤器的文件和目录抽象路径名数组
- FilenameFilter接口:过滤文件名
- boolean accept(FIle dir,String name)测试指定路径名是否包含在某个路径列表中中
- FileFilter接口:过滤文件或者文件夹
- boolean accept(File pathname)测试指定抽象路径名是否应该包含在某个路径名列表中
4. java.io.OutputStream: 抽象类,表示输出字节流的所有类的超类
- void close()关闭输出流并释放与此流有关的所有系统资源
- void flush()刷新此输出流并强制写出所有输出字节
- void write(byte[] b)将b.length个字节从指定的byte数组写入此输出流
- void write(byte[] b,int off,int len)将制定byte数组从偏移量off开始的len个字节写入此输出流
5. java.io.FlieOutputStream
- FlieOutputStream(File file)创建Flie对象表示文件中写入数据的输出流(文件存在则覆盖)
- FlieOutputStream(String name)创建指向指定名称文件中写入数据的输出流(文件存在则覆盖)
- FileOutputStream(File file,boolean append)true在文件末尾继续添加,“\r\n”换行
- FlieOutputStream(String name,boolean append)true就表示可以在文件末尾继续添加
6. java.io.ObjectOutputStream操作对象的流
- ObjectOutputStream(OutputStream out)传入OutputStream的实现类如FileOutputStream即可
- void writeObject(Object obj)将指定对象写入ObjectOutputStream
- ①被序列化的对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常。
- ②反序列化对象时,如果对象所属的class文件在序列化之后被修改了,那么会发生异常InvalidClassException。
- Serializable标记接口,给需要序列化的类,提供了一个序列版本号serialVersionUID. private static final long serialVersionUID = 1L;该版本号的目的在于验证序列化的对象和对应类是否版本匹配
- ③transient修饰的属性不会琲序列化
- ④静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化
7. java.io.FilterOutputStream
- FilterOutputStream(OutputStream out)传入OutputStream的实现类如FileOutputStream即可
8. java.io.PrintStream
- PrintStream(OutputStream out, boolean autoFlush)开启文件自动刷新
- void print(String str)输出任意类型的数据
- void println(String str)输出任意类型的数据,自动写入换行操作
9. java.io.BufferedOutputStream
- BufferedOutputStream(OutputStream out)字节缓冲输出流提高了IO的读写速度
10. java.io.InputStream
- InputStream此抽象类,是表示字节输入流的所有类的超类。
- int read()读取一个字节并返回,没有字节返回-1.//速度慢
- int read(byte[] b)读取一定量的字节数,并存储到字节(推荐1024整数倍字节)数组中
11. java.io.FileInputStream
- FileInputStream(File file)通过File对象来创建一个FileInputStream
- FileInputStream(String name)通过文件系统中的路径名name来创建一个FileInputStream
12. java.io.ObjectInputStream 对象反序列化流,从流中读取对象的操作流
- ObjectInputStream(InputStream in)传入InputStream的实现类如FileInputStream即可
- Object readObject()从ObjectInputStream读取对象
- ①被序列化的对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常。
- ②反序列化对象时,如果对象所属的class文件在序列化之后被修改了,那么会发生异常InvalidClassException。
- Serializable标记接口给需要序列化的类提供了一个序列版本号serialVersionUID. private static final long serialVersionUID = 1L;该版本号的目的在于验证序列化的对象和对应类是否版本匹配
- ③transient修饰的属性不会琲序列化
- ④静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化
13. java.io.FilterInputStream
- FilterInputStream(OutputStream out)传入OutputStream的实现类如FileOutputStream即可
14. java.io.BufferedInputStream
- BufferedInputStream(InputStream in)字节缓冲输入流,提高了IO的读写速度
15. java.io.Writer 写入字符流的抽象类
- void write(String str)写入字符串
- void write(String str,int off,int len)写入字符串的某一部分
- void write(char[] cbuf)写入字符数组
- abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分
- void write(int c)写入单个字符字节流转成字符流,将字符串按照指定的编码表转成字节
16. java.io.BufferedWriter 字符缓冲输出流,提高了IO读写速度
- BufferedWriter(Writer out)使用默认大小输出缓冲区,传入Writer实现类如FileWriter
- void newLine()根据当前的系统,写入一个换行符
17. java.io.PrintWriter
- public PrintWriter(OutputStream out, boolean autoFlush)//开启文件自动刷新
- PrintWriter(Writer out, boolean autoFlush)//开启文件自动刷新
- void println(String str): 输出任意类型的数据,自动写入换行操作
- void print(String str)输出任意类型的数据
18. java.io.OutputStreamWriter
- OutputStreamWriter类字符流转成字节流,将字符串按照指定的编码表转成字节
- OutputStreamWriter(OutputStream out Charset cs)创建使用给定字符集的编码对象
19. java.io.FileWriter
- FileWriter假定默认字符编码GBK和默认字节缓冲区大小都是可接受的。
- FileWriter(File file)根据File对象构造一个FileWriter对象(覆盖)
- FileWriter(String FileName)根据文件名创建FileWriter对象
- FileWriter(File file,boolean append)File对象构造FileWriter对象(true继续写)
- FileWriter(String FileName,boolean append)文件名创建FileWriter对象(true继续写)
20. java.io.Reader 读取字符流的抽象超类
- int read()读取单个字符并返回,若没有则返回-1
- int read(char[] cbuf)将字符读入数组,并返回读取的个数
21. java.io.BufferedReader 字符缓冲输入流,提高了IO读写速度
- BufferedReader(Reader in)默认大小输入缓冲区
- String readLine()返回文本行内容字符串,不包含任何行终止符,到达流的末尾返回null
22. java.io.InputStreamReader 字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符
- InputStreamReader(InputStream in Charset cs)创建使用给定字符集的解码对象
23. java.io.FileReader
- 读取字符文件的便捷类,假定默认字符编码GBK和默认字节缓冲区大小都是适当的
- FileReader(File file)从file对象创建一个新的FileReader
- FileReader(String fileName)从读取数据的文件名创建一个新的FileReader
24. flush()和close()的区别?
- flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。
- close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,
最后一次可以不刷新,由close完成刷新并关闭
25. 文件复制
采用高效的流,一个多个字节的方式赋值
BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
byte[] buffer = new byte[1024];
int len = -1;
while ( (len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
in.close();
out.close();
采用高效的流,一次一个字节的方式复制
BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
int ch = -1;
while ((ch=in.read()) != -1) {
out.write(ch);
}
in.close();
out.close();
采用高效的流文件复制
BufferedReader in = new BufferedReader(new FileReader("file.txt"));
BufferedWriter out = new BufferedWriter(new FileWriter("copyFile.txt"));
String line = null;
while ( (line = in.readLine()) != null ) {
out.write(line);
out.newLine();
}
out.close();
in.close();