跳至主要內容

io

HeChuangJun约 2755 字大约 9 分钟

io

1. IO概述

  • IO就是将内存中的数据持久化存储到持久化设备上,使用的时候从持久化设备上读入内存
  • IO操作:当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
    • 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
  • IOExcption异常

2. IO的继承体系

IO.jpg
IO.jpg

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();