当前位置: 首页 > news >正文

第八章.javaI/O和反射机制

文章目录

  • 一.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读文本文件步骤:
          • 引入相关类—>创建构造—>读取文件—>关闭文件流对象
          • 在这里插入图片描述
          • 在这里插入图片描述
          • 在这里插入图片描述
          • 在这里插入图片描述
      • 用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();}}}
http://www.xdnf.cn/news/280855.html

相关文章:

  • 【深度解析】DCN-V2:Google新一代特征交叉网络,如何实现推荐系统精准度飞跃?
  • [硬件电路-7]:模拟电路常见元器件 - 功率检测与PD光电二极管
  • SpringBoot简介详解:从入门到精通
  • 学习方法讨论——正论科举精神的内核
  • 51单片机入门教程——每个音符对应的重装载值
  • 解决在 Linux 中 WPS 字体缺失问题
  • 算法学习时段效能分布
  • GateWay使用
  • Linux系统之----进程控制
  • 【C++】哈希表
  • 调试Cortex-M85 MCU启动汇编和链接命令文件 - 解题一则
  • JAVA---多态
  • 文章记单词 | 第61篇(六级)
  • SpringBoot的启动流程
  • Encoder和Decoder的区别
  • MySQL Binlog二进制格式与解析详解
  • MySQL — 数据查询
  • 如何提高情商?(优化版)
  • 【RocketMQ Broker 相关源码】- broker 启动源码(1)
  • 身份认证、访问控制技术、SSO单点登录技术、特权访问管理、身份治理与管理——数据安全守护者
  • 支撑座的安装精度对滚珠丝杆性能有哪些影响?
  • 5.3【T】pc
  • 【Java idea配置】
  • load_dotenv()详解
  • 数据采集文氏管旋风高效湿式除尘器文丘里旋风除尘组合实验装置
  • Nginx核心功能 02
  • SAM-Decoding_ 后缀自动机助力大模型推理加速!
  • 《“昊龙一号”:开启中国航天货运新时代》
  • Linux网络编程 day3 五一结假
  • uniapp开发微信小程序时如何进行分包(新手图文)