IO流

本文深入探讨了Java中的IO流,包括输入流、输出流、字节流、字符流及其分类。介绍了四大家族InputStream、OutputStream、Reader、Writer,并强调了流的关闭与刷新操作。此外,讲解了文件拷贝、序列化与反序列化的过程,特别是序列化版本号的重要性。最后,提到了使用Properties类处理属性配置文件的方法,强调了动态读取配置文件的灵活性。

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

1、Io流,什么是Io?
l: Input
o: output
通过IO可以完成硬糍文件的读和写。
2、Io流的分类?
有多种分类方式:
一种方式是按照流的方向进行分类:

以内存作为参照物,
往内存中去,叫做输入(Input)。或者叫做读(Read).
从内存中出来,叫做输出(output)。或者叫做写(write).
假设文件file1.txt,采用字节流的话是这梓读的:
a中国bc张三fe
第一次读:一个字节,正好读到’a ’
第二次读:一个字节,正好读到中’字符的一半。
第三次读:一个字节,正好读到中’字符的另外一半。

另一种方式是按照读取数据方式不同进行分类:
有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二 进制这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件。。。。

有的流是按照字符的方式读取数据的,一次读取一个字符,这种流是为了方便读取
普通文本文件而存在的,这种流不能读取:图片、声音、视频等文件。只能读取纯文本 文件,连word文件都无法读取。
假设文件file1.txt,采用字符流的话是这样读的:
a中国bc张三fe
第一次读:'a’字符('a’字符在windows系统中占用1个字节。)
第二次读:'中’字符('中’字符在windows系统中占用2个字节。)

综上所述:流的分类
输入流、输出流
字节流、字符流

3、java Io流这块有四大家族:
四大家族的首领:

java.io.Inputstream//字节输入流
java.io.outputstream//字节输出流
java.io.Reader//字符输入流
java.io.writer//字符输出流

四大家族的首领都是抽象类。(abstract class)
所有的流都实现了:
java.io.Closeable接口,都是可关闭的,都有close()方法。

流毕竟是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭

注意:在java中只要"类名"以stream结尾的都是字节流。以"Reader/writer"结尾的都是字符流

所有的输出流都实现了:
java.io.Flushable接口,都是可刷新的,都有flush()方法。养成一个好习惯,输出流在最终输出之后,一定要记得flush ()刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道。
注意:如果没有flush ()可能会导致丢失数据。

4、java.io包下需要掌握的流有16个:
文件专属:

java.io.FileInputstream
java.io.Fileoutputstream
java . io.FileReader
java .io.Filewriter

转换流:(将字节流转换成字符流)

java. io. InputstreamReader
java . io.outjputstreanwriter

缓冲流专属:

java . io. BufferedReader
java .io. Bufferedwriter
java .io.Bufferedinputstream
java . io. Bufferedoutputstream

数据流专属:

java .io . Datainputstream
java .io. Dataoutputstream

标准输出流:

java.io . Printwriter
java.io. Printstream

对象专属流:

java . io. objectInputstream
java.io.objectoutputstream

5、相对路径的话呢?相对路径一定是从当前所在的位置作为起点开始找!
IDEA默认的当前路径是哪里?工程Project的根就是IDEA的默认当前路径。

6、文件拷贝

在这里插入图片描述

5、java序列化和反序列化

在这里插入图片描述

(1)java.io.NotSerializableException:
表示对象不支持序列化! ! ! !
参与序列化和反序列化的对象,必须实现serializable接口。

注意:通过源代码发现,Serializable接口只是一个标志接口∶

public interface Serializable {
}

这个接口当中什么代码都没有。那么它起到一个什么作用呢?
起到标识的作用,标志的作用,java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇。SeriaLizable这个标志接口是给java虚拟机参考的,java虚拟机看到这 个接口之后,会为该类自动生成一个序列化版本号。

变量加transient关键字表示游离的,不进行序列化的

(2)序列化版本号有什么用呢?
java.io.InvalidcLassException:
com.bjpowernode .java.bean.Student;local class incompatible :
stream classdesc serialVersionUID = -684255398724514298 ( 十年后),
local class serialVersionUID = -3463447116624555755 (十年前)
java语言中是采用什么机制来区分类的?
第一:首先通过类名进行比对,如果类名不二样,肯定不是同一个类。
第二:如果类名一样,再怎么进行类的区别?靠序列化版本号进行区分。

(3)序列化建议手写:
//Java虚拟机看到serializable接口之后,会自动生成一个序列化版本号。
//这里没有手动写出来,java虚拟机会默认提供这个序列化版本号。
//建议将序列化版本号手动的写出来。不建议自动生成
private static final long serialVersionUID = 1L;

(4)最终结论:
凡是一个类实现了Serializable接口,建议给该类提供一个固定不变的序列化版本号。这样,以后这个类即使代码修改了,但是版本号不变,java虚拟机会认为是同一个类

6、IO+Properties的联合应用。
非常好的一个设计理念:
以后经常改变的数据,可以单独写到一个文件中,使用程序动态读取。将来只需要修改这个文件的内容,java代码不需要改动,不需要重新编译,服务器也不需要重启。就可以拿到动态的信息。

类似于以上机制的这种文件被称为配置文件。并且当配置文件中的内容格式是:
keyl=value
key2=value
的时候,我们把这种配置文件叫做属性配置文件。
java规范中有要求:属性配置文件建议以.properties结尾,但这不是必须的。这种以.properties结尾的文件在java中被称为:属性配置文件。
其中Properties是专门存放属性配置文件内容的一个类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值