第五周学习视频(二)

一、“流”的分类

(1) 按照流向分可以分为输入流和输出流。
输入流:只能从中读取数据,不能写入数据 (基类是InputStream和Reader) 。
输出流:只能向其中写入数据,不能读取数据(基类是OutputStream和Writer) 。
(输入/读取:input->main;输出/写入:output<-main)
(2) 按照操作的数据单元分为字节流和字符流。
字节流:操作的数据单元是8bit的字节(基类是InputStream和OutputStream),它 以二进制格式存储数据
字符流:操作的数据单元是16bit的字节(unicode字符)【单字节的ASCII码时用0补齐至16bit】(基类时Reader和Writer),它以字符顺序存储数据
(3) 按照角色可以分为节点流和处理流。
节点流(低级流):可以从/向一个特定的IO设备中读/写数据的流,也被称为低级流。
处理流(高级流):用于对一个已存在的流进行连接或封装来实现读/写功能,也称为高级流或包装流。

二、文件与流

(1)Java将每个文件都视为流的存储。
(2)程序员根据实际应用的需要指定文件的结构。
(3)文件类型:
基于字节的流创建的文件,称为二进制文件。
基于字符的流创建的文件,称为文本文件。

三、File类

(1)File类不负责数据的输入输出,而是专门用于管理文件和目录。
(2)每个File对象表示一个磁盘文件或者目录,其对象属性中包含了文件或目录的相关信息,如名称、长度、所含文件个数等。
(3)它还提供相应的方法用来获取路径、目录和文件的相关信息。
eg.File f1 = new File("/etc/passwd");
File f2 = new File("/etc", "passwd");

四、处理文件

使用FileInputStream、 FileOutputStream来创建文件流,这两个类负责对本地文件进行数据读写。
例如:假设参数fp指输入输出的文件名。
打开文件,准备读数据:FileInputStream in=new FileInputStream(fp);
打开文件,准备写数据:FileOutputStream out=new FileOutputStream(fp);


当文件无法正常打开时,将发生异常,程序对此异常进行处理。(受检异常,编译不过时抛出 IOException,所以必须进行该部分异常处理

 try{
        ……
 }
 catch (IOException e)
 {   ……    } 

五、对象序列化

有时,无法准确知道数据是如何存储在文件中的,此时我们希望能从文件中读取或者写入整个对象。Java提供这种机制,称为对象序列化。
对象序列化(Serialize)是指将一个Java对象写入IO流中。
对象反序列化(Deserialize)是指从IO流中恢复该Java对象。
序列化必须实现Serializable和 Externalizable接口。


至少有下面两种场景需要序列化:
远程方法调用 (RMI)——通过socket进行对象的复制和通讯等;
程序版本升级问题。

// J_SerialData.java;  
//     序列化例程: 序列化数据 
import java.io.Serializable; 
 
public class J_SerialData implements Serializable 
{
     static final long serialVersionUID = 123456L;
     int m_id = 111; 
 
     public void mb_output( )     {
         System.out.println("序号是: " + m_id);
     } // 方法mb_output结束 
} // 类J_SerialData结束  
// J_ObjectOutputStream.java;  
//     对象输出例程 import java.io.FileOutputStream;
import java.io.ObjectOutputStream; 
 
public class J_ObjectOutputStream {
     public static void main(String args[ ]) throws Exception
     {
         ObjectOutputStream f = new ObjectOutputStream
             (new FileOutputStream("object.dat"));
         J_SerialData s = new J_SerialData( );
         f.writeObject(s);
         f.writeObject("字符串对象序列化示例");
         f.close( );
     } // 方法main结束 
} // 类J_ObjectOutputStream结束 
原文地址:https://www.cnblogs.com/caihan/p/12516545.html