JAVA -- 文件和IO

一、File对象
1.作用

	 操作系统的任何一个单独的文件或者文件目录,都可以使用File对象来表示,使用File对象可以获取文件的一些基本信息,也可以实现删除文件、目录创建等操作,但是,如果要面对文件中的具体内容进行操作,则无法通过File对象来完成,需要使用IO流

2、File对象的构建

	 File file = new File(String path);
	 path:文件所在的路径,用来指定当前要进行操作的文件或目录所在的位置
     路径的写法分类
	    绝对路径:从盘符开始到目的地(可以是单个文件也可以是目录)的完整   路径
	相对路径:以当前目录作为起始目录,不需要写出从盘符开始的完整路径

3、常用API

二、IO流
(一)概念

I:Input,输入,使用输入流对文件进行读操作
O:Output,输出,使用输出流对文件进行写操作
Java中的IO流分为字节流和字符流

在这里插入图片描述
(二)字节流

以字节为单位对文件进行操作的流
字节流的顶级父类:InputStream(输入流,读)、OutputStream(输出流,写)InputStream(输入流,读)、OutputStream(输出流,写)中分别提供了以字节为单位进行读写的常用方法。
1、FileOutputStream、FileInputStream
      以字节为单位,对文件进行读写操作
2、BufferedInputStream、BufferedOuputStream
	缓冲字节流
	缓冲流的原理
	缓冲输出流
	在向硬件设备做写出操作时,增大写出次数无疑会降低写出的效率,为此,可以使用缓冲输出流来一次性批量写出若干数据减少写出次数来提高写出效率。
	BufferedOutputStream内部维护一个缓冲区,每当向该流写数据时,都会先将数据存入缓冲流,当缓冲区满了,缓冲流会将数据一次性全部写出。
	
缓冲输入流
	在读取数据时若以字节为单位读取数据,会导致读取次数过于频繁从而降低读取效率,为此可以通过提高一次读取的字节数量减少读写次数来提高读取的效率。
	内部维护者一个缓冲区,使用该流在读取一个字节时,会尽量多的一次性读取若干字节并存入缓冲区,然后逐一将字节返回,直到将缓冲区的数据全部读取完毕,会再次读取若干字节从而反复,这样就减少了读取的次数,从而提高了读取效率。     

3、ObjectOutputStream、ObjectInputStream
序列化流、对象流

在这里插入图片描述
序列化、反序列化的概念

	序列化:将对象转换为字节序列
	反序列化:字节序列转换为对象
	因为有时候需要在不同的计算机之间共享对象或传输对象,而计算机中内存里的对象无法直接共享,所以先通过序列化将对象转化为字节序列,将字节序列传输后再另外一台计算机中再通过反序列化转换为对象。
	
    Serializable接口
	Serializable接口是一个标记接口,其中没有任何需要被实现的方法,只是用来标记当前的类是一个可以被序列化和反序列的类型,所有需要进行序列化和反序列化的类型必须实现Serializable接口
	
	序列化编号serialVersionUID
		首先创建一个Emp对象,包含name和age两个属性,此时对Emp对象进行序列化操作得到一个字节序列,如果此时直接对字节序列进行反序列化则没有任何的问题!
		如果在反序列化之前对Emp对象添加salary属性,此时再进行反序列化,会出现InvalidClassException。原因是因为序列化和反序列化的时候版本号不相同了。
		对于每一个已经实现Serializable接口的类而言,如果不显式声明,这些类都有一个隐含的属性serialVersionUID,该属性在默认情况下是通过类的方方面面以及当前所在的操作系统平台计算得到的,所以一旦类的属性发生变化以后,就会改变原来的serialVersionUID,而对于序列化和反序列化时如果serialVersionUID不一样,则反序列化的时候会出现错误。
		如果要修改属性又想保证其serialVersionUID一样,则可以在类中手动声明一个serialVersionUID属性。手动声明后的serialVersionUID就固定下来了,不会因为操作系统或属性的变化而重新计算。
		可以使用序列化版本号来解决序列化前后类内容不相同导致的兼容性问题!

transient 关键字

	private transient String name;
		transient关键字用来修饰成员属性,被该关键字修饰的属性在序列化过程中会被自动忽略,如果某些属性不需要被转换为字节序列,可以使用该关键字修饰这个属性,从而达到对序列化对象进行“瘦身”的效果。
		static修饰的关键字无论是否被transient 修饰,都不会被序列化

(三)字符流

	字符流是以字符为基本单元进行操作的
	字符流的顶级父类是Reader和Writer
	1、OutputStreamWriter、InputStreamReader
	2、PrintWriter、BufferedReader

字节流和字符流的区别

	字节流以字节为单位进行操作,字符流以字符为单位进行操作
	字节流默认不带缓冲区(除非使用缓冲流),字符流默认自带缓冲区
	字节流可以操作任何类型的文件,但是字符流只能操作文本文件(word文档不属于纯文本文档,csv属于纯文本文档)

序列化和反序列化的区别

序列化:将对象转换为字节序列
反序列化:字节序列转换为对象

因为有时候需要在不同的计算机之间共享对象或传输对象,而计算机中内存里的对象无法直接共享,所以先通过序列化将对象转化为字节序列,将字节序列传输后再另外一台计算机中再通过反序列化转换为对象。

猜你喜欢

转载自blog.csdn.net/weixin_43727372/article/details/90299664