第八章.javaI/O和反射机制
文章目录
- 一.File类
- 二.流
- 三.反射
一.File类
- file类访问文件属性
- file类–>创建文件对象(物理文件或目录)–>操作文件或目录的属性(路径,权限,日期和时间等)
- file类–>创建文件对象(物理文件或目录)–>操作文件或目录的属性(路径,权限,日期和时间等)
package Enumm;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;public class FileTest {public static void myFile(String path) {//1.创建文件对象File file = new File(path);System.out.println("文件的长度"+file.length());System.out.println("绝对路径"+file.getAbsolutePath());System.out.println("传参路径"+file.getPath());//桌面上的文件并不是在c盘的根目录下,要点击属性看具体情况System.out.println("文件名"+file.getName());//判断文件是否存在boolean isExists = file.exists();System.out.println("文件是否存在:"+isExists);System.out.println("是不是文件:"+file.isFile());System.out.println("是不是文件夹"+file.isDirectory());
// //创建文件
// if(!isExists) {
// try {
// file.createNewFile();//只能创建文件,不能创建目录
// System.out.println("文件创建成功");
// } catch (IOException e) {
// e.printStackTrace();
// }
// }//创建文件夹
// file.mkdir();//单层目录,前面目录都有才可以创建
// file.mkdirs();//多层目录//文件删除
// System.out.println("文件是否删除成功:"+file.delete());//获取文件操作时间
// System.out.println("文件操作时间:"+file.lastModified());//输出的是秒数,需要转换
// long time = file.lastModified();
// Date date = new Date(time);
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// System.out.println(sdf.format(date));// System.out.println("是否可读:"+file.canRead());
// System.out.println("是否可写:"+file.canWrite());//查看当前目录下存在哪些文件及目录名String[] files = file.list();for(String p:files) {System.out.println("当前目录下存在哪些文件及目录名:"+p);}//查看文件File[] fs = file.listFiles();for(File f : fs) {System.out.println("文件名:"+f.getName()+"-"+f.length()+"长度-----------");}}public static void main(String[] args) {
// myFile("D:\\Sql.txt");//注意要\\
// myFile("Sql2.txt");
// myFile("Sql.txt");//eclipse不写盘符的情况下,文件就在根目录下(JRE下建立一个文件夹访问)//文件夹使用
// myFile("D:\\Test\\cheat\\endtest");//在随便一个盘创建一个文件夹,在加上一个不存在的路径验证单层创建是否可以成功//cheat不存在,创建endtest创建不出来//mkdirs可以创建出来//查看当前目录下存在哪些文件及目录名myFile("D:\\");}}
二.流
- 如何读写文件
- 通过流来读写文件
- 流是指一连串流动的字符,是以先进先出方式发送信息的通道
- java流的分类
- 文件的读写
- 文本文件的读写
-
用FileInputStream和FileOutputStream读写文本文件
- 使用FileInputStream读文本文件步骤:
- 引入相关类—>创建构造—>读取文件—>关闭文件流对象
- 使用FileInputStream读文本文件步骤:
-
用BufferedReader和BufferedWriter读写文本文件
-
- 二进制文件的读写
- 使用DataInputStream和DataOutputStream读写二进制文件(与FileputStream一样,适合读图片视频流)
- 文本文件的读写
package Enumm;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class IOTest {
// public void input() {public static void input() {//改为静态方法,直接在main里读取FileInputStream fis = null;try {//1.创建文件输入流对象//添加异常fis = new FileInputStream("Sql.txt");System.out.println("文件流的长度为:"+fis.available());//这个操作后会抛出IO异常
// fis.read();//重复读文件最小为1int i = -1;while((i= fis.read()) !=-1) {System.out.println(i);}} catch (FileNotFoundException e) {System.out.println("文件没有找到");} catch (IOException e) {System.out.println("文件流异常了");}finally {//关闭try {//再次抛出异常fis.close();} catch (IOException e) {e.printStackTrace();}}}//简洁写法1---------------------------------------------------------public void input1() throws Exception{FileInputStream fis = new FileInputStream("Sql.txt");System.out.println("文件流的长度为:"+fis.available());//这个操作后会抛出IO异常
// fis.read();//重复读文件最小为1int i = -1;while((i= fis.read()) !=-1) {System.out.println(i);}fis.close();}//简洁写法2(jdk1.7后使用)---------------------------------------------------------public static void input2() {//不需要关闭流和finallytry(FileInputStream fis = new FileInputStream("Sql.txt")){int i = -1;while((i= fis.read()) !=-1) {System.out.println(i);}}
// catch (Exception e) {
// System.out.println("出现了异常");
// }//异常比较多的情况下catch (FileNotFoundException e) {System.out.println("文件没有找到");} catch (IOException e) {System.out.println("文件流异常了");}}//输出操作--------------------------------------------------------------------public static void output() {//输出对象// try(FileOutputStream fos = new FileOutputStream("Sql2.txt")){//可以输出到一个没有创建的文件里try(FileOutputStream fos = new FileOutputStream("Sql2.txt",true)){//,后是追加内容//结合file.writeString str = "天气真好适合出去玩哈哈哈哈";//将字符串转为字节数组byte[] by = str.getBytes();
// fos.write(by);//输出整个数组fos.write(by, 0, by.length);//与上面那个一样//换行fos.write("\n".getBytes());//\r也可以换行,回车符;//把\n转换为字符串fos.write(by, 0, 8);//整个数组,起始,长度(字节流,2的倍数)}catch (FileNotFoundException e) {System.out.println("文件没有找到");} catch (IOException e) {System.out.println("文件流出现问题");}}//合并复制文件--------------------------------------------------------------------public static void copyFile(String srcFile,String outFile) {System.out.println();long stime = System.currentTimeMillis();//获取当前毫秒数System.out.println("开始时间:"+stime);try(FileInputStream fis = new FileInputStream(srcFile);FileOutputStream fos = new FileOutputStream(outFile);){//读完就写 int i = -1;while((i=fis.read()) != -1) {fos.write(i);}}catch (Exception e) {}long etime = System.currentTimeMillis();//结束毫秒数System.out.println("结束时间:"+etime);System.out.println("复制文件用时:"+(etime-stime));}public static void copyFile1(String srcFile,String outFile) {System.out.println();long stime = System.currentTimeMillis();//获取当前毫秒数System.out.println("开始时间:"+stime);try(FileInputStream fis = new FileInputStream(srcFile);FileOutputStream fos = new FileOutputStream(outFile);){//读完就写 //按数组读byte[] by = new byte[1024];//[]合理范围内设置(不要太大,会烧内存),一般为2的倍数int i = -1;while((i=fis.read(by)) != -1) {System.out.println(i);
// fos.write(by);//这样操作文件变大fos.write(by, 0, i);}//=================================}catch (Exception e) {}long etime = System.currentTimeMillis();//结束毫秒数System.out.println("结束时间:"+etime);System.out.println("复制文件用时:"+(etime-stime));}//字符流---------------------------------------------------------------------//一个个字符读public static void read() {try(FileReader fr = new FileReader("mytemplate.tmp");){
// fr.read();//-1表结束int i = -1;//数字编码while((i=fr.read()) != -1) {System.out.println((char)i); }}catch (Exception e) {}}//数组读------------public static void read1() {try(FileReader fr = new FileReader("mytemplate.tmp");){
// fr.read();//-1表结束char[] cs = new char[10];//每次读十个字符int i = -1;//i现在代表字符数组长度while((i=fr.read()) != -1) {System.out.println(i); }}catch (Exception e) {}}//在此基础上创建Buffer流---------------------------------------------------------//常用public static void read2() {
// try(FileReader fr = new FileReader("mytemplate.tmp");
// BufferedReader br = new BufferedReader(fr);//缓冲字符流try(BufferedReader br = new BufferedReader(new FileReader("mytemplate.tmp"));//可以合成一行使用){String lineString = null;while((lineString = br.readLine()) !=null) {//读一行//读一行可以替换字符内容lineString = lineString.replace("{name}", "土豆");lineString = lineString.replace("{age}", "18");lineString = lineString.replace("{money}", "100");System.out.println(lineString);} }catch (Exception e) {}}//输出(以字符流的方式)public static void write() {try(FileWriter fw = new FileWriter("my.txt",true);) {System.out.println("每天开心伐");} catch (Exception e) {// TODO: handle exception}}//以buffer形式输出//如果接下来,不使用fw,建议创建一条语句,比较快public static void write1() {try(FileWriter fw = new FileWriter("my.txt",true);BufferedWriter bw = new BufferedWriter(fw)) {//必须传个对象bw.write("今天你开心吗");
// System.out.println("每天开心伐");} catch (Exception e) {// TODO: handle exception}}public static void main(String[] args) {
// input();//读取
// input2();
// output();//复制文件
// copyFile1("D:\\temp\\Sq2.txt", "D:\\temp\\qq.txt");//复制前的文件,复制后的文件read2();write();write1();}}
- 图片的复制
package ImgTest;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class ImgTest {public static void imgStream(String srcPath,String outPath) {//来源路径,输出路径//改文件名//先创建文件对象File file = new File(srcPath);if(file.exists()) {//获取文件名String nameString = file.getName();//获取文件名后缀String hzString = nameString.substring(nameString.lastIndexOf("."));System.out.println("文件后缀名:"+hzString);String newname2 =System.currentTimeMillis()+hzString; //新的文件名File outFile = new File(outPath+File.separator+newname2);//输出文件//File.separator分隔符//复制文件try( FileInputStream fis = new FileInputStream(file);//输入流FileOutputStream fos = new FileOutputStream(outFile)//输出流){int i = -1;//设置读取到文件末尾while((i = fis.read()) !=-1) {fos.write(i);}System.out.println("文件复制成功");// //释放流(jdk1.7以后)可以不写
// fos.flush();//情空流
// fos.close();//关闭流
// fis.close();//关闭流}catch (Exception e) {System.out.println("文件出现异常 ");}System.out.println("文件是否删除成功:"+file.delete());}else {System.out.println("文件不存在");}}public static void main(String[] args) {imgStream("D:\\1.jpg","D:\\Test");}}//字节流-----------------------------------------------------------
package ImgTest;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class ImgTest {//public static void imgStream(String srcPath,String outPath) {//来源路径,输出路径public static void imgDataStream(String srcPath,String outPath) {//来源路径,输出路径//改文件名//先创建文件对象File file = new File(srcPath);if(file.exists()) {//获取文件名String nameString = file.getName();//获取文件名后缀String hzString = nameString.substring(nameString.lastIndexOf("."));System.out.println("文件后缀名:"+hzString);String newname2 =System.currentTimeMillis()+hzString; //新的文件名File outFile = new File(outPath+File.separator+newname2);//输出文件//File.separator分隔符//复制文件try( FileInputStream fis = new FileInputStream(file);//输入流FileOutputStream fos = new FileOutputStream(outFile)//输出流){int i = -1;//设置读取到文件末尾while((i = fis.read()) !=-1) {fos.write(i);}System.out.println("文件复制成功");}catch (Exception e) {System.out.println("文件出现异常 ");}System.out.println("文件是否删除成功:"+file.delete());}else {System.out.println("文件不存在");}}public static void main(String[] args) {imgStream("D:\\1.jpg","D:\\Test");}}
- 对象流:
- 类:ObjectInputStream;ObjectOutputStream
- 传的实体类必须实例化
package XuLie;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class ObjectTest {//序列化对象public static void objectOut() {//先创建输出流try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\Test\\qq.txt"))) {Person person = new Person("qq",11,"开心");oos.writeObject(person);//输出对象System.out.println("文件生成成功");} catch (Exception e) {System.out.println("文件输出异常");}}//反序列化-------------------------------------------//要求对象一致(包,方法,属性)public static void objectIn() {try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\Test\\qq.txt"))) {Object object = ois.readObject();Person person = (Person)object;System.out.println(person.getNameString()+"\t"+person.getAddressString());} catch (Exception e) {e.printStackTrace();System.out.println("输出异常");}}public static void main(String[] args) {objectIn();}
}
三.反射
- 运行过程中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性
- 补充知识(文件导出/导入jar包)
- 导出:选择导出的文件----->右键----->Export-----> 找到Java,选择JAR file----->输出,选择合适的目的地
- 导入:选择一个文件夹----->右键新建一个目录Folder(lib)----->把jar包拖进来即可----->右键点击拖入的jar包,选择Build Path—Add to Build Path------>可以新建一个类,去new一个对象,调用里面的方法
package FanShe;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Iterator;import XuLie.Person;public class FsTest {public static void main(String[] args) {
//
// try {
// Class cla=Class.forName("Fanshe.Student");//获取路径
// //获取公开方法----------------------
// Method[] mts = cla.getMethods();
// for(Method m:mts) {
// System.out.println(m.getName());
// }
// //获取所有方法----------------------------
// Method[] mtas = cla.getDeclaredMethods ();
// for(Method m:mtas) {
// System.out.println(m.getName());
// }
//
// //创建对象
Student student = new Student();
//反射方式创建
Student stu = (Student)cla.newInstance();//无参构造方法
stu.show();
// } catch (ClassNotFoundException e) {
//
// e.printStackTrace();
// }try {ptest();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void ptest() throws InstantiationException, IllegalAccessException {//加载类try {Class clazz = Class.forName("XuLie.Person");Person p1 = (Person)clazz.newInstance();//调用类的无参构造方法//获取所有的构造方法Constructor<Person>[] cs=clazz.getDeclaredConstructors();for(Constructor c:cs) {System.out.println("方法名:"+c.getName());//获取参数列表Parameter [] ps = c.getParameters();for(Parameter p:ps) {System.out.println("参数名:"+p.getName()+",类型名:"+p.getType());}}//有参构造方法创建对象Constructor gz = clazz.getConstructor(String.class,double.class,String.class);Person per = (Person)gz.newInstance("11",22,"33");per.show();//获取所有的方法Method [] ms = clazz.getDeclaredMethods();for(Method method :ms) {System.out.println(method.getName());Parameter[] ps = method.getParameters();for(Parameter p2:ps) {System.out.println("参数名"+p2.getName()+",类型"+p2.getType());}}//调用方法
// Method ffMethod = clazz.getMethod("show");
// ffMethod.invoke(per);//调用私有方法会出错,权限访问不足Method ffMethod = clazz.getDeclaredMethod("show");ffMethod.invoke(per);} catch (ClassNotFoundException e) {e.printStackTrace();}}}