输入流:是数据源到程序的过程
输出流:程序到数据源的过程
(1)字节流和字符流的区别?
字节流是将数据解析成原始的二进制数据,与主机的编码方式无关,可移植性高,二进制数据不需要编码解码的过程,效率高;字符流是将数据解释成字符的序列,文件数据存储依赖文件的编码方式,并且输入输出都是需要编码和解码的,效率低,可移植性低。
(2)JavaIO常见的类,字节流,字符流的具体实现类与阻塞的方法?
字节流中有抽象类InputStream和OutputStream,它们的子类FileInputStream,FileOutputStream,字节缓冲输出流BufferedOutputStream(BufferedOutputStream不是OutputStream的直接实现子类,是FilterOutputStream的子类),字节缓冲区输入流BufferedInputStream(BufferedInputStream不是InputStream的直接实现子类,是FilterInputStream的子类),缓冲区通常都是8KB;字符流的类通常以reader和writer结尾,常见字符输入流Reader,InputStreamReader,FileReader,BufferedReader,调用read()方法会返回一个int类型,如果么有数据会返回-1。常见字符输出流:Writer,OutputStreamWriter,FileWriter,BufferedWriter。
java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。比如read()和readLine()方法。
(3)序列化?
序列化:是将类的对象转化为字节流保存到磁盘中
反序列化:从字节流恢复到类对象
序列化的目的:对象序列化机制把内存中对象转化为与平台无关的二进制流,并且可以持久化的保存在磁盘中,使得Java对象的持久化保存;或者允许在网络中直接传输序列化的对象,一旦另一个网络节点获取到这种二进制流,都可以将其恢复成java对象,使得对象可以脱离程序独立存在。
(4)序列化如何实现?
- 实现java.io.Serializable接口,标记当前的类是可序列化的,(标记接口不包含任何的方法和字段,只是用于标记),使用Serializable接口去实现序列化,会产生一个序列化ID,这是一个标识符号,它通常使用对象哈希序列化标记在对象上,可以使用序列化ID对对象实现版本控制。
- 创建一个ObjectOutputStream对象
- 通过ObjectOutputStream对象的writeObject方法输出可序列化的对象
(5)反序列化的步骤
- 创建一个ObjectInputStream对象
- 通过ObjectInputStream对象的readObject方法读取流中的对象,将其反序列化为真实的