2021-09-17 字符流对象流详解

本文详细介绍了Java中的字符流,包括Reader和Writer的概述,转换流的作用,以及BufferedWriter和PrintWriter的构造方法和特性。同时,讲解了对象流的概念,如ObjectOutputStream和ObjectInputStream,以及对象序列化和反序列化的过程。此外,还提到了Serializable接口和transient关键字在序列化中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、java.io.Reader和java.io.Writer

是所有字符流的超类,与字节流的超类平级,也是抽象类,里面规定了所有字符流必须具备的读写字符的方法。字符流最小的读写单位是char字符,但是底层实际读写的还是字节,只是字符与字节之间的转换工作由字符流来完成。

1、转换流:

java.io.InputStreamReader和OutputStreamWriter
他们是一对高级流,实际开发中我们在读写字符串而组建流连接时,他们是非常重要的一环,但是我们不会直接操作这两个流。


2、主要作用:

1、衔接其他高级字符流与字节流
2、将字符与字节按照指定字符集进行转换

二、BW和PW

java.io.BufferedWriter:内部有缓冲区,可以块写文本数据来加快写出数据的速度。
java.io.PrintWriter:带有自动行刷新功能的缓冲字符输出流,内部总是连接着BufferedWriter作为缓冲加速功能,更常用。

1、构造方法:

PrintWriter提供了直接对文件进行写操作的构造方法:
        PrintWriter(String filename)
        PrintWriter(File file)

内部会自动完成流的链接,对文件进行写文本操作。
        PrintWriter(String filename,String csn)
        PrintWriter(File file,String csc)

创建的同时还可以指定字符集,推荐使用这种方式创建。实际开发中我们写出文本数据时都应该确定字符集,而不是使用系统默认的。

2、PW底层源码:

this(new BufferedWriter( new OutputStreamWriter (new FileOutputStream(file) ) );

在创建时默认是覆盖模式,想要追加,就在FOS改为(file,true);

当创建PrintWriter时,第一个参数为流,第二个参数可以传入一个boolean类型的参数。如果参数的值为ture,当前PrintWriter具有自动行刷新的功能,即每次调用println()后都会自动flush()。

3、写出方法:println()

4、简易记事本

 /*
    简易记事本:
    程序启动后要求用户输入一个文件名,然后对该文件进行操作。之后用户在控制台输入的每一行字符都写入到该文件中。但用户单独输入exit时程序结束;
    要求:创建PrintWriter并且自行创建流完成链接。
     */
    public static void method3()throws Exception{
        FileOutputStream fos = new FileOutputStream("./src/TXT/haha.txt",true);
        PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fos,"UTF-8")),true);
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入新增内容:");
        while (true) {
            String str = sc.next();
            if(str.equals("exit")){
                System.out.println("结束输入。");
                break;
            }
            pw.println(str);
        }
        pw.close();
    }

三、BR:

1、读入方法; String readLine():

读取一行字符串并返回,返回的字符串中不包含这一行的换行符。若某一行中似乎一个空行(只有一个换行符),则返回一个空字符串。当返回值为null时,表示流读取到了末尾。

注:缓冲字符流第一次调用readLine()方法时并非只读取了第一行内容,二十一次性读取了若干字符并存入内部的缓冲区,然后仅将第一行内容进行返回而已,再次调用则返回第二行内容,以此类推。

 

四、对象流

java.io.ObjectOutputStream和ObjectInputStream
对象流是一对字节流,也是一对高级流,在流连接中的作用时进行对象的序列化(也叫串行化)与反序列化。方便我们进行对java对象的读写操作。

1、对象序列化:

也叫串行化,是将java对象按照其结构转换为字节序列的过程。

2、反序列化:

将字节序列还原为java对象的过程。

3、Serializable接口

Serializable接口中没有定义任何的字段和方法,这个接口称为签名接口,是编译器敏感的一个接口,只有实现该接口才可以进行序列化和反序列化,否则运行会出现异常。
序列化时:java.io.NotSerializableException 不可序列化异常
反序列化时:java.io.InvalidClassException 无效的类异常

关于版本号:serialVersionUID 序列化版本号

如果我们自己没有声明,接口会默认生成一个。
工作机制:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件的serivalVersionUID跟当前文件是否一致,如果一致则反序列化成功,否则说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者类型发生了变化,会抛出异常,反序列化失败。

序列化保存对象:

序列化用于保存的对象,所以只能保存对象的非静态成员变量,不能保存任何的成员方法和静态成员变量。而且序列化保存的只是变量的值,对于变量的任何修饰符都不能保存。

如果把类中的属性定义为static的话,在进行反序列化时就不能得到原本的值,就只能得到这个类型的默认值。

transient关键字:

当一个类实现了序列化接口后,可以通过这个关键字修饰某个属性,那么当这个类的实例进行序列化时会忽略这个属性的值,达到对象瘦身的目的。

在进行反序列化时就不能得到原本的值,就只能得到这个类型的默认值。

4、javaBean规范:

1、javaBean类必须是一个公共类,即访问属性应设置为public
2、必须有一个公共的无参构造
3、javaBean类不应该有公共属性,所有属性都应该是private修饰的
4、为私有属性提供符合命名规范的get和set方法
5、实现Serializable接口

5、类的实例写出方法:

[void]writeObject(Object o)
        对象输出流提供了一个写出对象的方法,但是在写出对象时要求该对象所属的类必须实现Serializable接口,否则会抛出异常。

6、什么是对象的序列化?

当我们调用writeObject()方法将一个对象写出时,首先该对象经过对象流,它会将对象按照其结构转换为一组字节,这个过程称为对象的序列化。

7、什么是持久化?

序列化后的字节再经过对象流连接的文件流写出,而文件流会将这个字节最终写入到文件中(磁盘中)做长久保存这个过程称为数据持久化。

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值