IO流(输入流和输出流)的一些相关总结

1. 输入输出流(IO)运行结构

 



2.File类

  • 创建文件对象

    • File file = new File(String pathname);

      • String pathname:创建文件对象(物理文件或目录) 格式:“c:\\test.txt"或者"c:/test.txt"

  • 通过文件对象的方法:操作文件或目录的属性(路径、权限、日期和时间等)

  • File类的常用方法

    • boolean exists();

      • 判断文件或目录是否存在

    • boolean isFile();

      • 判断是否是文件

    • boolean isDirectory();

      • 判断是否是目录

    • String getPath();

      • 返回此对象表示的文件的相对路径名

    • String getAbsolutePath();

      • 返回此对象表示的文件的绝对路径名

    • String getName();

      • 返回此对象表示的文件或目录的名称

    • boolean delete();

      • 删除此对象指定的文件或目录

    • boolean createNewFile();

      • 创建名称的空文件,不创建文件夹

    • long length();

      • 返回文件的长度,单位为字节,如果文件不存在,则返回OL

    • boolean mkdir();

      • 创建此抽象路径名指定的目录(文件夹)    注意:如果父路径不存在,则不会创建文件夹

    • boolean mkdirs() ;

      • 如果父路径不存在,会自动先创建路径所需的文件夹,即会先创建父路径内容再创建文件夹

    • File.separator // 通用路径分隔符


     

3. IO流关键字

  • 位于java.io包中:

    • FileInputStream //文件字节输入流

    • FileOutputStream//文件字节输出流

    • FileReader

    • FileWriter

    •  

    • BufferedReader

    • BufferedWriter

    • BufferedInputStream

    • BufferedOutputStream

    •  

    • DataInputStream

    • DataOutputStream

    •  

    • ObjectInputStream

    • ObjectOutputStream

    • 转换流(字节流转换成字符流)

    • InputStreamReader

    • OutputStreamWriter

    •  

    • Printwriter

    • PrintStream //标准的输出流(默认输出到控制台)


4.java语言中的流分为:四大家族

  • Java流的分类

  • 按流向分

    • 输出流 OutputStream和Writer作为基类

    • 输入流 InputStream和Reader作为基类

    • 输入输出流是相对于计算机内存来说的

  • 按照处理数据单元划分

    • 字节流

      • 字节输入流 InputStream基类

      • 字节输出流 OutputStream基类

    • 字符流

      • 字符输入流 Reader基类

      • 字符输出流 Writer基类

    • 字节流是8位通用字节流,字符流是16位Unicode字符流

  • InputStream

  • OutputStream

  • Reader

  • Writer

    InputStream和OutptStream继承结构图及关系

    Reader和Writer继承结构图及关系


5.InputStream: 字节输入流(抽象类)

  • InputStream 类常用方法

    • int read():

      • 从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果到了输入流的末尾,返回-1.

  • int read(byte[] b):

    • 从输入流读取若干字节,把这些字节保存到数组b中,返回的是读取到的字节数,如果到了流的末尾,返回-1.

  • int read(byte[] b, int off , int len):

    • 从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标,len指读取的字节数目。返回的是读取到的字节数,如果到了流的末尾,返回-1.

  • void close():

    • 关闭流。

  • int available():

    • 可以从输入流中读取的字节数目

  • 子类FileInputStream 常用的构造方法

    • FileInputStream(File file) //new对象的时候可以传一个文件

    • FileInputStream(String name) //new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径

 

//要读取某文件,先与这个文件创建一个“输入流”
//1.创建流
String filePath = "D:\\EditPlus\\test";//文件路径:可以跟相对路径,也可以跟绝对路径
FileInputStream fis = new FileInputStream(filePath);
//如果文件在同一目录下,可以直接访问
FileInputStream fis = new FileInputStream(“file”);

//2.开始读写
//第一种读写方式
int i1 = fis.read();//以字节的方式读取,这种方式频繁访问磁盘,伤害磁盘,并且效率低。
System.out.println(i1);//如果已经读取到文件末尾,就会返回-1
————————————————————————————————————————————————————————————————————————————————————————
//第二种读写方式
//准备一个byte数组
byte[] bytes = new byte[long n];//每一次最多读取n表字节
//int read(byte[] bytes);该方法返回的int类型的值代表的是,这次读取了多少个字节。
int i1 = fis.read(bytes);
//将byte数组转换成字符串
System.out.println(new String(bytes));
int temp = 0;
//循环读取
while((temp = fis.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, temp));//从下标0开始读,temp为返回读取字节的下标
}

//int available() 返回流中剩余的估计字节数。
System.out.println(fis.available());
fis.skip(long n);// 跳过n个字节不读取
————————————————————————————————————————————————————————————————————————————————————————

//3.关闭流
fis.close();

调用FileInputStream()方法时系统会抛出一个异常“FileNotFoundException”

调用读取【read()】方法和关闭【close()】方法时系统会抛出一个异常“IOException”


6.OutputStream 文件字节输出流(抽象类)

  • OutputStream类常用方法

    • void write(int c);

      • 从输出流一个字节一个字节的往外写,返回的是该字节的整数表示形式

    • void write(byte[] buf);

      • 从输出流写若干字节,把这些字节保存到数组b中,返回的是写出的字节数

    • void write(byte[] b, int off, int len);

      • 从输出流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标,len指写出的字节数目。返回的是写出的字节数

    • void close();

      • 关闭流

    • void flush();

      • 强制把缓冲区的数据写到输出流中 //flush():强制将缓冲区清空

  • 子类FileOutputStream

    • FileOutputStream 是将计算机内存中的数据写入硬盘文件中

    • 常用的构造方法

      • FileOutputStream(File file);

        • new对象的时候可以传一个文件

      • FileOutputStream(String name);

        • new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径

      • FileOutputStream(String name,boolean append);

        • 如果boolean append为true, 那他不会覆盖原有文本文件的内容,只是在原有的文本文件后面去追加内容;boolean append为false,那他就会覆盖原有的文本文件

 


//1.创建文件字节输出流
//谨慎使用,会将源文件内容覆盖。
FileOutputStream fos = new FileOutputStream("temp02"); //该文件不存在则自动创建。

//以追加的方式写入
FileOutputStream fos = new FileOutputStream("temp02",true);

//2.开始写
String msg = "HelloWorld!";
//将String转换成byte数组
byte[] bytes = msg.getBytes();

//将byte数组中所有的数据全部写入
fos.write(bytes);

//将byte数组一部分写入
fos.write(bytes, off, len);//从off下标开始写入,写到len下标为止

//推荐最后的时候为了保证数据完全写入硬盘,所以要刷新
fos.flush();//强制写入

//3.关闭流
fos.close();

7.Reader 字符输入流(抽象类)

  • 常用方法

    • int read();

      • 从输入流一个字符一个字符的读,返回的是该字节的整数表示形式,

    • int read(char[] c);

      • 从输入流读取若干字符,把这些字符保存到数组b中,返回的是读取到的字符数,

    • read(char[] c, int off, int len);

      • 从输入流读取若干字符,把这些字符保存到数组b中,off指的是字符数组中开始保存数据的起始下标,len指读取的字符数目。返回的是读取到的字符数,

    • void close();

      • 关闭流

  • 子类InputStreamReader常用的构造方法

    • InputStreamReader(InputStream in); //里面可以传一个字节流

    • InputStreamReader(InputStream in, String charsetName); //里面可以传一个字节流和编码格式,该方法可以指定编码格式

  • FileReader类是InputStreamReader的子类

    • FileReader(File file); //new对象的时候可以传一个文件

    • FileReader(String name); //new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径

  • 该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型

    • System.out.println(System.getProperty("file.encoding"));获得本地平台的字符编码类型

  • 在读取文件的时候会出现中文乱码

    • 原因:文件编码格式和程序环境的编码格式不一致

    • 解决方案:字符流去读的时候,批定字符流的编码格式

    • FileReader 无法指定编码格式,会按照文件系统默认编码格式读取

    • 我们可以使用InputStreamReader解决乱码问题

  • BufferedReader类(缓冲流)

    • BufferedReader类是Reader类的子类

    • BufferedReader类带有缓冲区,按行读取内容的readLine()方法


8.Writer 字符输出流(抽象类)

  • 常用方法

    • write(String str);

      • 从输出流已字符串的形式往外写

    • write(String str, int of, int len);

      • 从输出流读取若干字符串,off指的是字节数组中开始保存数据的起始下标,len指写出的字节数目。

    • void close();

      • 关闭流

    • void flush();

      • 强制把缓冲区的数据写到输出流中 //flush():强制将缓冲区清空

  • 子类OutputStreamWriter常用的构造方法

    • OutputStreamWriter(OutputStream out);

      • 里面可以传一个字节流

    • OutputStreamWriter(OutputStream out, String charsetName);

      • //里面可以传一个字节流和编码格式,该方法可以指定编码格式

  • FileWriter类是OutputStreamWriter的子类

    • FileWriter(File file) ;//new对象的时候可以传一个文件

    • FileWriter(String name); //new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径

    • 该类只能按照本地平台折字符编码来写数据,用户不能指定其他的字符编码类型

    • FileWriter与字节流FileOutputStream类实现向文本文件写入数据步骤类似

      • 引入相关的类(导包)

      • 创建FileReader对象 (构造BufferedWriter对象和FileWriter对象)

        • Writer fw = new FileWriter("相对路径/绝对路径");

      • 写文本文件(调用write()方法写数据)

        • fw.write();

      • 关闭相关的流对象(流对象的清空和关闭)

        • fw.close()和fw.flush();

  • BufferedWriter类是Writer类的子类,带有缓冲区

  • BufferedWriter类常用的构造方法

    • BufferedWriter(Writer out);


9.读写二进制文件

  • DataInputStream类

    • FileInputStream的子类

    • 与FileInputStream类结合使用读取二进制文件

  • DataOutputStream类

    • FileOutputStream的子类

    • 与FileOutputStream类结合使用写二进制文件


10.序列化和反序列化

  • 序列化和反序列化过程

    • 序列化是将对象的状态写入到特定的流中的过程

    • 内存(Java对象) -------> 流(二进制的字节序列)

    • 反序列化则是从特定的流中获取数据重新构建对象的过程

    • 流(二进制的字节序列)-------> 内存(Java对象)

  • 常见异常

    • NotSerializableException:类没有实现Serializable接口,不可被序列化

  • 实现序列化

    • ObjectInputStream 反序列化 readObject() -----> 类型转换

    • ObjectOutputStream 序列化 writeObject(Object)

    • 序列化的步骤

      • 实现Serializable接口

      • 创建对象输出流

      • 调用writeObject()方法将对象写入文件

      • 关闭对象输出流

  • transient 屏蔽某些敏感字段的序列化

    • 该关键字加在声明变量类型的前面

posted @ 2019-04-27 09:30  Smile雪孩子  阅读(84)  评论(0编辑  收藏  举报