Java 学习笔记(八) IO流

    科技2022-07-13  124

    I/O流


    一、File 类

    File类似一个与流无关的类;该类用于获取文件及文件所在的目录,文件的长度扥信息。

    构造方法:

    通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。

    File(String pathName) //具体实现如下; new File(pathName);

    通过给定的父路径名和子路径名字符串创建一个新的File实例。

    File(String path, String filename);

    通过指定的File的父类路径和字符串类型的子路径;

    File(File file, String filename); //file:父路径对象; //filename:子路径字符串; package classx.Demo15; import java.io.File; //文件 public class FileDemo { public static void main(String[] args) { File file=new File("E:\\学习资料\\实习实训\\天津_软通培训\\后端\\java\\学习笔记","9.2.txt"); System.out.println(file.getName());//9.2.txt System.out.println(file.length());//1191 System.out.println(file.getPath());//E:\学习资料\实习实训\天津_软通培训\后端\java\学习笔记\9.2.txt System.out.println(file.getAbsolutePath());//E:\学习资料\实习实训\天津_软通培训\后端\java\学习笔记\9.2.txt System.out.println(file.lastModified()/1000/60/60/24/365);//lastModified()最后一次修改的时间(毫秒) 50 } }

    二、流

    1个字符两个字节,1个字节等于8个二进制位;流是一组数据序列;根据操作类型可以分为:输入流、输出流。**字节流:InputStream和OutputStream**是java中可以按照最小字节单位读取的流,即每次读写一个字节,字节流是直接连接到输入源的流。**字符流:**是以字符为单位进行数据处理的IO流。本质其实就是基于字节流读取时,去查找指定的码表。

    三、字节流

    InputStream类和OutputStream类

    InputStream类和OutputStream类都是抽象类,不能直接实例化,所以使用他们的子类:FileInputStream和FileOutputStream来实现文件的读取和写入;

    InputStream是一个抽象类,是所有输入字节流的父类。

    `ByteArrayInputStream、 StringBufferInputStream、FileInputStream是三中基本的戒指了,他们分别从数组、StringBuffer、和本地文件中读取数据。**

    PipedInputStream是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。

    返回值类型方法intavailable() 返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。voidclose() 关闭此输入流并释放与流相关联的任何系统资源。voidmark(int readlimit) 标记此输入流中的当前位置。booleanmarkSupported() 测试这个输入流是否支持 mark和 reset方法。abstract intread() 从输入流读取数据的下一个字节。intread(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。intread(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。voidreset() 将此流重新定位到上次在此输入流上调用 mark方法时的位置。longskip(long n) 跳过并丢弃来自此输入流的 n字节数据。

    OutputStream 是所有的输出字节流的父类,它是一个抽象类。

    ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。

    追加写:

    FileOutputStream(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。

    参数:boolean append

    ​ true:创建对象不会覆盖源文件,继续在源文件末尾追加写数据;

    ​ false:创建一个新文件,覆盖源文件;

    换行写:

    windows:\r\n;linux :/n;mac:/r;

    FilterOutputStream 这个类是过滤输出流的所有类的超类;

    PipedOutputStream 是向与其它线程共用的管道中写入数据。

    ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储;

    返回值类型方法voidclose() 关闭此输出流并释放与此流相关联的任何系统资源。voidflush() 刷新此输出流并强制任何缓冲的输出字节被写出。voidwrite(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。voidwrite(byte[] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。abstract voidwrite(int b) 将指定的字节写入此输出流。 注意:在使用write(byte[] b)或write(byte[] b, int off, int len)时:如果写的第一个字节是正数(0-127),那么显示会查询ASCII码表;如果写的第一个字节是负数,那么第一个字节会和第二个字节一起组成一个中文显示,查询系统默认表(GBK);

    字符流

    Reader类和Writer类

    Reader 是所有的输入字符流的父类,它是一个抽象类。 **CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。**PipedReader 是从与其它线程共用的管道中读取数据。BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。 Writer 是所有的输出字符流的父类,它是一个抽象类。 CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据,BufferedWriter 是一个装饰器为Writer 提供缓冲功能。PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。 flush()和close()的区别: 1.fluse():使用fluse()把数据刷新到文件中,使用过后可以继续写,流没有关闭; 2. close():把数据刷新到文件中后就把流给关闭了;

    字节流和字符流使用情况

    字符流和字节流的使用范围:字节流一般用来处理图像,视频,以及PPT,Word类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,字节流可以用来处理纯文本文件,但是字符流不能用于处理图像视频等非文本类型的文件。

    字符流与字节流转换

    转换流的作用,文本文件在硬盘中以字节流的形式存储时,通过InputStreamReader读取后转化为字符流给程序处理,程序处理的字符流通过OutputStreamWriter转换为字节流保存。

    转换流的特点:

    其是字符流和字节流之间的桥梁可对读取到的字节数据经过指定编码转换成字符可对读取到的字符数据经过指定编码转换成字节

    何时使用转换流?

    当字节和字符之间有转换动作时;流操作的数据需要编码或解码时。

    具体的对象体现:

    InputStreamReader:字节到字符的桥梁OutputStreamWriter:字符到字节的桥梁

    这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。

    OutputStreamWriter(OutStreamout):将字节流以字符流输出。

    InputStreamReader(InputStream in):将字节流以字符流输入。

    节点流和处理流的概念**

    节点流:直接与数据相连,进行数据的读写;处理流:是指在节点流上套接了一层。

    常用的节点流:

    1.文 件 :FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter 文件进行处理的节点流

    2**.数 组** :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)

    3.字符串 :StringReader、 StringWriter 对字符串进行处理的节点流

    4**.管 道** :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 对管道进行处理的节点流

    常用的处理流

    1.缓冲流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加缓冲功能,避免频繁读写硬盘。

    2.转换流:InputStreamReader 、OutputStreamReader实现字节流和字符流之间的转换。

    3.数据流: DataInputStream 、DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来。

    字节流与字符流之间的区别:

    1.读写单位不同:字节流式以字节(8位2进制)为单位,字符流是以字符为单位,根据码表映射字符,一次可能读多个字节。

    2.处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

    3.一次读入或读出是8位二进制。

    4.字符流:一次读入或读出是16位二进制。

    结论:只要是纯文本数据优先使用字符流,除此之外都使用字节流。

    转换流

    InputStreamReader 、OutputStreamWriter 要InputStream或OutputStream作为参数,实现从字节流到字符流的转换。

    序列化和反序列化

    序列化和反序列化的定义:

    Java序列化就是指把Java对象转换为字节序列的过程;

    Java反序列化就是指把字节序列恢复为Java对象的过程。

    (1)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

    ​ 反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

    总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)

    序列化算法需要做的事:

    ① 将对象实例相关的类元数据输出。

    ② 递归地输出类的超类描述直到不再有超类。

    ③ 类元数据输出完毕后,从最顶端的超类开始输出对象实例的实际数据值。

    ④ 从上至下递归输出实例的数据。

    Java实现序列化和反序列化的过程

    1、实现序列化的必备要求:

    ​ 只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)

    2、JDK中序列化和反序列化的API:

    ​ ①java.io.ObjectInputStream:对象输入流。

    ​ 该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。

    ​ ②java.io.ObjectOutputStream:对象输出流。

    ​ 该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。

    Processed: 0.013, SQL: 8