第三章:I/0
1、文件File
(1)构造方法
File(String pathName) :用指定的文件路径构造文件
File(String dir,String subpath):在指定目录下创建指定文件。
(2)常用方法
新建空文件:createFile()
新建空目录:mkdir()
新建包括父目录的目录:mkdirs()
删除指定文件:delete()
判断是否是文件:isFile()
判断是否是目录:isDirectory()
判断文件或目录是否存在:exists()
获取文件或目录名字:getName()
获取文件或目录路径:getPath()
获取文件或目录绝对路径:getAbsolutePath()
获取文件或目录的最后修改日期:lastModified()
获取文件或目录的字节大小:lenth()
2、流
(1)作用:读写文件
含义:流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道
概念:读文件是指把文件中的数据读取到内存中;写文件是把内存中的数据写到文件中。
输入流是将数据输入到内存;输出流则是将数据从内存中输出。
字节流是8位通用字节流;字符流是16位Unicode字符流。
字节流直接操作文件,即使不使用close关闭流,文件也能输出;而字符流通过缓存再操作文件,必须关闭流或者flush强制刷新
(2)分类
1>按流向分:输出流(OutputStream和Writer作为基类)和输入流(InputStream和Reader作为基类)
2>按处理数据单元分:字节流(InputStream和OutputStream作为基类)和字符流(Reader和Writer作为基类)
(3)1>字节流(中文会乱码)
输入:InputStream fis=new FileInputStream(file); //file不存在(无输出)
int data=fis.read();
while (data!=-1){
System.out.print((char)data);
data=fis.read();
}
输出:OutputStream fos=new FileOutputStream(file,true); //file不存在(自动创建)
String str=“hello world”;
byte bytes[]=str.getBytes();
fos.write(bytes);
fos.flush();
2>字符流:读取文本文件的效率高(中文会乱码)
输入:Reader fr=new FileReader(file); //file不存在(运行异常:系统找不到指定的文件)
StringBuffer sb=new StringBuffer();
char chars[]=new char[(char)file.length()];
fr.read(chars);
for(int i=0;i<chars.length;i++){
sb.append(chars[i]);
}
System.out.println(sb);
输出:Writer fw=new FileWriter(file,true); //true是否追加;file不存在(自动创建)
String str=“JAVA”;
fw.write(str);
fw.flush();
3>字符流处理中文乱码:
//txt文件ANSI,程序可正常读取,也可设置为gbk;txt文件UTF-8,设置为UTF-8
输入:InputStreamReader isr=new InputStreamReader(new FileInputStream(file),“UTF-8/gbk”);
输出:OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(file,true),“UTF-8/gbk”);
4>缓冲流
输入:BufferedReader br=new BufferedReader(new FileReader(file)/new InputStreamReader(new FileInputStream(file),“UTF-8/gbk”));
String str=br.readLine();
while (str!=null){
System.out.println(str);
str=br.readLine();
}
输出:BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,true),“UTF-8”));
bw.write(“你好”);
bw.newLine(); //换行
bw.write(“JAVA”);
bw.flush();
5>二进制流(属于字节流,可以读取图片,读取文本同1)
DataInputStream dis=new DataInputStream(new FileInputStream(“D:\mao.jpg”));
DataOutputStream dos=new DataOutputStream(new FileOutputStream(“D:\gou.jpg”));
int read=dis.read();
while (read!=-1){
dos.write(read);
read=dis.read();
}
6>对象流(前提是实体类实现Serializable接口)
序列化:把对象写到文件
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(“students.txt”));
oos.writeObject(Student/ArrayList/Map);
oos.flush();
反序列化:从文件读取对象
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(“students.txt”));
Student stu=ois.readObject();/ArrayList list=ois.readObject();/Map maps=(Map)ois.readObject();
3、反射:
(1)概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
(2)作用:java反射机制编译时并不确定那个类被加载了,而是在程序运行时才加载,探知使用,这样的特点就是反射。
1>在运行时判断任意一个对象所属的类型。
2>在运行时构造任意一个类的对象。
3>在运行时判断任意一个类所具有的成员变量和方法。
4>在运行时调用任意一个对象的方法,甚至可以调用private方法。
(3)注:任何类都是Class的实例对象;反射都是在运行时环境中,而不是在编译时环境中。
public class ClassDemo {
public static void main(String[] args) {
Foo obj=new Foo();
//Class cl=obj.getClass();
System.out.println(obj.getClass().getName()); //obj.getClass().getName()类的名称。 输出:api.io.Foo
Method methods[]=obj.getClass().getMethods(); //obj.getClass().getMethods()类的方法的集合
for(int i=0;i<methods.length;i++){
System.out.println(methods[i]); //输出:public void api.io.Foo.show(java.lang.String,int)
System.out.println(methods[i].getReturnType()); //methods[i].getReturnType()方法的返回值类型。 输出:void
System.out.println(methods[i].getName()); //methods[i].getName()方法的名称。 输出:show
Class parameterTypes[]=methods[i].getParameterTypes(); //methods[i].getParameterTypes()方法的参数的集合
for(Class c:parameterTypes){
System.out.println(c.getName()+"?"); //java.lang.String?int
}
}
}
}
class Foo {
public void show(String name,int age){}
}
JavaAPI3(I/0流与反射)
最新推荐文章于 2020-05-28 12:04:41 发布