JavaI/O和反射机制

1,操作文件或目录属性
java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作,对文件读写的操作等
File对象即可表示文件,也可表示目录,在程序中一个File对象可以代表一个文件或目录,利用它可用来对文件或目录进行基本操作,它可以查出与文件相关的信息,如名称,最后修改日期,文件大小等
使用File类操作文件和目录属性的步骤:
(1),引入File类
(2),构造一个文件对象
(3),利用File类的方法访问文件或目录的属性
注意:写文件名时要注意后缀,File类不能访问文件的内容,不能从文件中读取数据或往文件里写数据
2,Java的流
流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道
流分为输入流和输出流,输出流主要由OutputStream和Writer作为基类,输入流主要由InputStream和Reader作为基类,这些输入/输出流类的对象称为流对象,可以通过这些流对象将内存中的数据以流的方式写入文件,也可以将文件中的数据以流的方式读取到内存
构造流对象时往往会和数据源联系起来,数据源分为源数据源和目标数据源,输入流关联的是源数据源,输出流关联的是目标数据源
输入/输出流又分为字节流和字符流:
字节流是8位通用字节流,基本单位是字节,字节流的基类是InputStream类和OutputStream类,它们是抽象类
字符流是16位Unicode字符流,基本单位是Unicode字符,字符流的基类是Reader类和Writer类,它们也是抽象类
InputStream类的常用子类有FileInputStream,用于从文件中读取数据
OutputStream类的常用子类有FileOutputStream,用于向文件写数据
Reader类的常用子类为BufferedReader,接受Reader对象作为参数,并对其添加字符缓冲器
Writer类的常用子类为BufferedWriter,用于将数据缓冲到字符输出流
注意:在操作上字节流与字符流有个区别,字符流在操作时使用了缓冲区(内部存储器),字节流在操作时直接操作文件,不会使用缓冲区
3,读写文件
1,使用字节流类FileInputStream读文本文件
FileInputStream称为文件输入流,将文件中的数据输入到内部存储器中,可以利用它来读取文本文件中的数据
具体步骤:
(1),导入相关的类
(2),构造一个文件输入流对象
(3),利用文件输入流类的方法读取文本文件的数据
(4),关闭文件输入流对象
注意:
(1),read()方法返回整数,如果读取的是字符串,需要进行强制类型转换
(2),流对象使用完毕后需要关闭
2,使用字节流类FileOutputStream写文本文件
FileOutputStream称为文件输出流,作用是把内存中的数据输出到文件中,可以利用它把内存中的数据写入到文本文件中
具体步骤:
(1),引入相关的类
(2),构造一个文件输出流对象
(3),利用文件输出流的方法把数据写入到文本文件中
(4),关闭文件输出流对象
注意:
(1),在创建FileOutputStream实例时,如果相应的文件并不存在,就会自动创建一个新的文件
(2),如果参数file或name表示的文件路径存在,但是代表一个文件目录,则此时会抛出FileNotFoundException类型的异常
(3),默认情况下,向文件写数据时将覆盖文件中原有的内容
3,使用字符流类BufferedReader和FileReader读文本文件
BufferedReader和FileReader两个类可以通过字符流的方式读取文件,并使用缓冲区,提高了读文本文件的效率
4,使用字符流类BufferedWriter和FileWriter写文本文件
BufferedWriter和FileWriter两个类可以通过字符流的方式并通过缓冲区把数据写入文本文件,提高了写文本文件的效率
5,读写二进制文件
读写二进制文件常用的类有DataInputStream和DataOutputStream
4,重定向标准I/O
Java提供的还有两个非常重要的标准输入/输出流,即System.in和System.out,主要用于从键盘接受数据以及向屏幕输出数据,使用这两个标准输入/输出流,首先需要重定向标准I/O,也就是将标准I/O重新定向到其他的I/O设备
5,认识序列化
序列化就是将对象的状态存储到特定存储介质的过程,也就是将对象状态转换为可保持或可传输格式的过程,在序列化过程中,会将对象的公有成员,私有成员包括类名,转换为字节流,然后再把字节流写入数据流,存储到存储介质中
使用序列化的意义在于将Java对象序列化后,可以将其转换为字节序列,这些字节序列可以被保存在磁盘上,也可以借助网络进行传输,同时序列化后的对象保存的是二进制状态,这样实现了平台无关性
6,序列化保存对象信息
序列化机制允许将实现了序列化的Java对象转换为字节序列,这个过程需要借助于I/O流来实现
Java中只有实现了java.io.Serializable接口的类的对象才能被序列化,Serializable表示可串行的,可序列化的,所以,对象序列化在某些文献上也被称为串行化
对象序列化的步骤:
(1),创建一个对象输出流(ObjectOutputStream),它可以包装一个其他类型的输出流
(2),通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象
注意:通常,对象中的所有属性都会被序列化,对于一些比较敏感的信息,出于安全的考虑,使用transient来修饰限制某些属性被序列化
7,反序列化获取对象信息
反序列化是从特定存储介质中读取数据并重新构建成对象的过程,通过反序列化,可以将存储在文件上的对象信息读取出来,然后重新构建为对象
反系列化的步骤:
(1),创建一个对象输入流(ObjectInputStream),它可以包装一个其他类型的输入流
(2),通过对象输入流的readObject()方法读取对象,该方法返回一个Object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成其真实的类型
注意:
(1),如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取
(2),如果一个可序列化的类,有多个父类(包括直接或间接父类),则这些父类要么是可序列化的,要么有无参数的构造器,否则会抛出异常
8,对象引用的序列化
当需要序列化某个特定对象时,它的各个成员对象也必须是可序列化的,要理解这一点,需要了解序列化算法的相关知识
序列化的算法规则:
(1),所有保存到磁盘中的对象都有一个序列号
(2),当程序试图序列化一个对象时,将会检查是否已经被序列化,只有序列化后的对象才能被转换成字节序列输出
(3),如果对象已经被序列化,则程序直接输出一个序列化编号,而不在重新序列化
9,认识反射
Java的反射机制是Java的特性之一,反射机制是构建框架技术的基础,Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能
Java反射的三个动态性质:
(1),运行时生成对象实例
(2),运行期间调用方法
(3),运行时更改属性
反射的特定是在程序运行时才加载,探知,使用,在计算机科学领域,反射是指一类应用,它们能够自描述和自控制
Java反射机制能够知道类的基本结构,这种对Java类结构探知的能力,称为Java类的“自审”
通过Java反射,可以实现以下功能:
(1),在运行时判断任意一个对象所属的类
(2),在运行时构造任意一个类的对象
(3),在运行时判断任意一个类所具有的方法和属性
(4),在运行时调用任意一个对象的方法
使用反射的步骤:
(1),导入java.lang.reflect.*
(2),获得需要操作的类的Java.lang.Class对象
(3),调用Class的方法获取Field,Method等对象
(4),使用反射API进行操作
10,反射的应用
1,获取类的信息
通过反射获取类的信息分为两步,首先获取Class对象,然后通过Class对象获取信息
每个类被加载后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问Java虚拟机中的这个类,获得Class对象的方式:
(1),调用对象的getClass()方法
(2),调用类的Class属性
(3),使用Class类的forName()静态方法
调用类的Class属性的优势:
(1),代码更安全,程序在编译阶段就可以检查需要访问的Class对象是否存在
(2),程序性能更高,因为这种方式无须调用方法,所以性能更好
在获得了某个类所对应的Class对象之后,程序就可以调用Class对象的方法来获取该类的详细信息
Class对象可以获得该类里的成员,包括方法,构造方法和属性,其中方法由Method对象表示,构造方法由Constructor对象表示,属性由Field对象表示
程序可以通过Method对象来执行对应的方法,通过Constructor对象来调用相应的构造方法创建对象,通过Field对象直接访问并修改对象的属性值
2,创建对象
通过反射来创建对象的方式:
(1),使用Class对象的newInstance()方法创建对象
(2),使用Constructor对象创建对象
使用Class对象的newInstance()方法来创建该Class对象对应类的实例,这种方式要求该Class对象的对应类有默认构造方法,而执行newInstance()方法时实际上是利用默认构造方法来创建该类的实例,而使用Constructor对象创建对象,要先使用Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()方法创建该Class对象对应类的实例
指定构造方法创建Java对象的步骤:
(1),获取该类的Class对象
(2),利用Class对象的getConstructor()方法来获取指定构造方法
(3),调用Constructor的newInstance()方法创建Java对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值