输入输出和反射Word文档格式.docx
《输入输出和反射Word文档格式.docx》由会员分享,可在线阅读,更多相关《输入输出和反射Word文档格式.docx(26页珍藏版)》请在冰点文库上搜索。
![输入输出和反射Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/dc8819a7-a00f-457e-83d2-243dbe6828ef/dc8819a7-a00f-457e-83d2-243dbe6828ef1.gif)
skip():
跳过流中若干字节数
available():
返回流中可用字节数
mark():
在流中标记一个位置
reset():
返回标记过得位置
markSupport():
是否支持标记和复位操作
close():
关闭流
intread():
从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。
intread(byteb[]):
读多个字节到数组中。
intread(byteb[],intoff,intlen):
从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取得字节数。
write(intb):
将一个整数输出到流中(只输出低位字节,抽象)
write(byteb[]):
将字节数组中的数据输出到流中
write(byteb[],intoff,intlen):
将数组b中从off指定的位置开始,长度为len的数据输出到流中
flush():
刷空输出流,并将缓冲区中的数据强制送出
注:
进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。
如:
型FileNotFoundException,EOFException,IOException
四、文件操作类的方法
File类
File类声明如下:
publicclassFileectendsObjectimplementsSerializable,Comparable
构造方法:
publicFile(Stringpathname)
publicFile(Filepatent,Stringchild)
publicFile(Stringpatent,Stringchild)
文件名的处理
StringgetName();
//得到一个文件的名称(不包括路径)
StringgetPath();
//得到一个文件的路径名
StringgetAbsolutePath();
//得到一个文件的绝对路径名
StringgetParent();
//得到一个文件的上一级目录名
StringrenameTo(FilenewName);
//将当前文件名更名为给定文件的完整路径
文件属性测试
booleanexists();
//测试当前File对象所指示的文件是否存在
booleancanWrite();
//测试当前文件是否可写
booleancanRead();
//测试当前文件是否可读
booleanisFile();
//测试当前文件是否是文件(不是目录)
booleanisDirectory();
//测试当前文件是否是目录
普通文件信息和工具
longlastModified();
//得到文件最近一次修改的时间
longlength();
//得到文件的长度,以字节为单位
booleandelete();
//删除当前文件
目录操作
booleanmkdir();
//根据当前对象生成一个由该对象指定的路径
Stringlist();
//列出当前目录下的文件
文件过滤器
类FilterInputStream和FilterOutputStream分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。
另外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入/输出流。
类FilterInputStream和FilterOutputStream分别重写了父类InputStream和OutputStream的所有方法,同时,它们的子类也应该重写它们的方法以满足特定的需要
要使用过滤流,首先必须把它连接到某个输入/输出流上,通常在构造方法的参数中指
定所要连接的流:
FilterInputStream(InputStreamin);
FilterOutputStream(OutputStreamout);
这两个类是抽象类,构造方法也是保护方法
类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高读写效率
在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。
缺省大小的缓冲区适合于通常的情形;
最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;
一般缓冲区的大小为内存页或磁盘块等地整数倍,如8912字节或更小。
BufferedInputStream(InputStreamin[,intsize])
BufferedOutputStream(OutputStreamout[,intsize])
文件对话框
随机文件操作
于InputStream和OutputStream来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。
随机访问文件则允许对文件内容进行随机读/写。
在java中,类RandomAccessFile提供了随机访问文件的方法。
类RandomAccessFile的声明为:
publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutput
File:
以文件路径名的形式代表一个文件
FileDescriptor:
代表一个打开文件的文件描述
FileFilter&
FilenameFilter:
用于列出满足条件的文件
File.list(FilenameFilterfnf)
File.listFiles(FileFilterff)
FileDialog.setFilenameFilter(FilenameFilterfnf)
FileInputStream&
FileReader:
顺序读文件
FileOutputStream&
FileWriter:
顺序写文件
RandomAccessFile:
提供对文件的随机访问支持
类RandomAccessFile则允许对文件内容同时完成读和写操作,它直接继承Object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法
DataInput和DataOutput中的方法
readInt(),writeDouble()…
intskipBytes(intn):
将指针乡下移动若干字节
length():
返回文件长度
longgetFilePointer():
返回指针当前位置
voidseek(longpos):
将指针调到所需位置
voidsetLength(longnewLength):
设定文件长度
RandomAccessFile(Filefile,Stringmode)
RandomAccessFile(Stringname,Stringmode)
mode的取值
“r”只读.任何写操作都将抛出IOException。
“rw”读写.文件不存在时会创建该文件,文件存在时,原文件内容不变,通过写操作改变文件内容。
“rws”同步读写.等同于读写,但是任何协操作的内容都被直接写入物理文件,包括文件内容和文件属性。
“rwd”数据同步读写.等同于读写,但任何内容写操作都直接写到物理文件,对文件属性内容的修改不是这样。
五、字符流的方法
Reader类和Writer类
在JDK1.1之前,java.io包中的流只有普通的字节流(以byte为基本处理单位的流),这种流对于以16位的Unicode码表示的字符流处理很不方便。
从JDK1.1开始,java.io包中加入了专门用于字符流处理的类,它们是以Reader和Writer为基础派生的一系列类
同类InputStream和OutputStream一样,Reader和Writer也是抽象类,只提供了一系列用于字符流处理的接口。
它们的方法与类InputStream和OutputStream类似,只不过其中的参数换成字符或字符数组
Reader类
voidclose()
voidmark(intreadAheadLimit)
booleanmarkSupported():
intread()
intread(char[]cbuf)
intread(char[]cbuf,intoff,intlen)
booleanready()
voidreset()
longskip(longn)
Writer类
voidflush()
voidwrite(char[]cbuf)
voidwrite(char[]cbuf,intoff,intlen)
voidwrite(intc)
voidwrite(Stringstr)
voidwrite(Stringstr,intoff,intlen)
Class
1、Class是Java程序中各个Java类的总称;
它是反射的基石,通过Class类来使用反射。
2、Class和class的区别
1)class:
Java中的类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则由此类的实例对象确定,,不同的实例对象有不同的属性值。
2)Class:
指的是Java程序中的各个Java类是属于同一类事物,都是Java程序的类,这些类称为Class。
例如人对应的是Person类,Java类对应的就是Class。
3、属性:
类名,类的访问属性,类所属包名,字段名称列表,方法名称列表等。
二、对象的创建和使用:
1、创建实例对象:
不可用newClass()的方式,因为Class没有这样的构造方法。
而是将字节码对象赋值给Class变量。
如Classc1=Person.class。
如Person类,它的字节码:
首先要将Person的java文件编译为class文件放于硬盘上,即为二进制代码,再将这些代码加载到内存中,接着用它创建一个个对象。
就是把类的字节码加载进内存中,再用此字节码创建一个个对象。
当有如Person、Math、Date等等的类,那么这些字节码就是分别的一个Class对象。
即Classc2=Date.class;
。
2、获得类的字节码对象:
如Class.forName(”java.lang.String”)即获得String.class。
得到这个字节码对象有两种情况:
1)此类已经加载进内存:
若要得到此类字节码,不需要再加载。
2)此类还未加载进内存:
类加载器加载此类后,将字节码缓存起来,forName()方法返回加载进来的字节码。
3、得到各字节码对应的实例对象(Class类型)的方式:
1)类名.class:
如System.class,String.class等等
2)对象.class:
如newDate().getClass()或者d.getClass()。
(Dated=newDate())
3)Class.forName(“类名”):
如Class.forName(”java.lang.String”)
当获取类名的时候,是不知道此类的名称的,forName(字符串参数)方法中传入字符串型的变量作为对外访问的入口,即传入什么类名就获得什么类名,从而得知相应的类名。
注:
forName()是静态方法,是反射中使用的一种方式获取字节码的实例对象。
每个类的字节码对象只有唯一的一个,如任何字符串对象,对应唯一的String.clas字节码。
4、九个预定义的Class:
1)包括八种基本类型(byte、short、int、long、float、double、char、boolean)的字节码对象和一种返回值为void类型的void.class。
2)Integer.TYPE是Integer类的一个常量,它代表此包装类型包装的基本类型的字节码,所以和int.class是相等的。
基本数据类型的字节码都可以用与之对应的包装类中的TYPE常量表示
数组类型的Class实例对象,可以用Class.isArray()方法判断是否为数组类型的。
5、总结:
只要是在源程序中出现的类型都有各自的Class实例对象,如int[].class、void.class等。
三、方法:
1、staticClassforName(StringclassName)
--->
返回与给定字符串名的类或接口的相关联的Class对象。
2、ClassgetClass()
--->
返回的是Object运行时的类,即返回Class对象即字节码对象
3、ConstructorgetConstructor()
返回Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
4、FieldgetField(Stringname)
返回一个Field对象,它表示此Class对象所代表的类或接口的指定公共成员字段。
5、Field[]getFields()
返回包含某些Field对象的数组,表示所代表类中的成员字段。
6、MethodgetMethod(Stringname,Class…parameterTypes)
返回一个Method对象,它表示的是此Class对象所代表的类的指定公共成员方法。
7、Method[]getMehtods()
返回一个包含某些Method对象的数组,是所代表的的类中的公共成员方法。
8、StringgetName()
以String形式返回此Class对象所表示的实体名称。
9、StringgetSuperclass()
返回此Class所表示的类的超类的名称
10、booleanisArray()
判定此Class对象是否表示一个数组
11、booleanisPrimitive()
判断指定的Class对象是否是一个基本类型。
12、TnewInstance()
创建此Class对象所表示的类的一个新实例。
示例:
publicstaticvoidfuction()throwsException{
Stringstr1="
abc"
;
Classcls1=str1.getClass();
Classcls2=String.class;
Classcls3=Class.forName("
java.lang.String"
);
System.out.println(cls1==cls2);
//true
System.out.println(cls1==cls3);
//判断是否为基本类型:
isPrimitive()
System.out.println(cls1.isPrimitive());
//false
System.out.println(int.class==Integer.class);
//Integer.TYPE代表包装类对应的基本数据类型的字节码
System.out.println(int.class==Integer.TYPE);
System.out.println(int[].class.isPrimitive());
//判断是否为数组类型的
System.out.println(int[].class.isArray());
}
反射
1、概述:
把Java类中的各种成分映射成相应的Java类。
如Class中的每一个方法返回的都是一种类(型),即Method对所有方法抽取成了这个类Method,它的每一个对象(如变量methodObj1)代表了一个方法。
2、一个类中的组成成分:
成员变量、方法、构造函数、包等信息,也用一个个java类来表示(如汽车是一个类,其中的发动机,变速箱等也是对应的一个个类),表示Java类的Class类显然要提供一系列的方法来获取其中的变量、方法、构造函数、修饰符、包等信息,这些信息就是用相应的类的实例对象来表示,他们是Field、Method、Contructor、Package等。
3、一个类中的每个成员都可用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可得到这些实例对象。
反射中的各种类
一、Constructor类
Constructor代表某个类的构造方法
2、获取构造方法:
1)如何得到摸个类的所有构造方法:
如得到String类的所有构造方法
Constructor[]cons=Class.forName(“java.lang.String”).getConstructors();
2)获取某一个构造方法:
Constructorcon=String.class.getConstructor(StringBuffer.class);
①
3、创建实例对象:
1)通常方式:
Stringstr=newString(newStringBuffer(”abc”));
2)反射方式:
Stringstr=(String)con.newInstance(newStringBuffer(“abc”));
②
调用获得的方法时要用到上面相同类型的实例对象,即两个StringBuffer()要对应相等。
NewInstance():
构造出一个实例对象,每调用一次就构造一个对象。
注意:
上面的两个地方①②都要用到StringBuffer,这必须是一致的。
第①个是指定要带StringBuffer参数类型的构造方法,即所需使用的是含StringBuffer类型的构造方法。
第②个是用这个构造方法创建对象,要传入的参数类型是StringBuffer。
4、Class.newInstance():
创建一个对象,不带参数的构造方法。
演示:
//newString(newStringBuffer("
));
Constructorconstructor1=
String.class.getConstructor(StringBuffer.class);
Stringstr2=
(String)constructor1.newInstance(newStringBuffer("
System.out.println(str2);
//Class.newInstrance创建不带参数的构造方法
Stringstr3=
(String)Class.forName("
).newInstance();
System.out.println("
str3:
"
+str3);
二、Field类
Field类代表成员变量(字段)的反射。
publicclassReflectPoint{
privateintx;
publicinty;
publicStringtoString(){
returnstr1+"
+str2+"
+str3;
}
publicclassFieldTest(){
ReflectPointpt1=newReflectPoint(3,5);
//fieldX和fieldY并不是对象身上的变量,而是类上的
//要用它去取某个对象上的对应的值,传入什么对象,就取相应对象的值。
FieldfieldY=pt1.getClass().getField("
y"
System.out.println(fieldY.get(pt1));
//获取私有的成员变量
FieldfieldX=pt1.getClass().getDeclaredField("
x"
fieldX.setAccessible(true);
System.out.println(fieldX.get(pt1));
2、获取成员变量:
如上例子所示:
1)获取公有的成员变量:
getField(Stringname)和get(变量)
2)获取私有的成员变量:
暴力反射
getDeclared(Stringname)
setAccessible(boo