package cn.Exception;/*** 异常:程序出了不正常的情况* 程序出现的问题:* 1、严重问题:(Error)(不处理,这种问题一般解决不了,比如内存溢出)* 2、一般问题:(Exception)* a、编译期问题:不是RuntimeException的异常(必须处理,如果不处理,编译不能通过)* b、运行期问题:RuntimeException(不处理,因为代码不够严谨,需要修正代码)** 如果程序出现了问题,我们没有做处理,最终JVM会做出默认的处理* 把异常的名称,原因及出现的问题等在控制台输出* 同时会结束程序,但是后面的程序无法执行** */public class ExceptionDemo {public static void main(String[] args) {int a = 10;//int b = 2;//System.out.println(a/b);int c = 0;System.out.println(a/c);System.out.println("over");}}
package cn.Exception;/*** 如何处理异常* 1、try……catch……finally* 2、throws(抛出)** try …… catch ……finally 格式* try{* 可能出现问题的代码* }catch(异常变量名){* 针对问题的处理* }finally{* 释放资源* }** 变形格式* try{* 可能出现的问题* }catch(异常变量名){* 针对问题的处理* }** 注意:* 1、try 里面的问题越少越好* 2、catch里面必须有内容** */public class ExceptionDemo_02 {public static void main(String[] args) {//第一阶段int a = 10;//int b = 2;int b = 0;try {System.out.println(a / b);}catch(ArithmeticException ae){System.out.println("除数不能为0");}//第二阶段System.out.println("over");}}
package cn.Exception;/*** 1、一个异常* 2、写一个try多个catch* try{* ……* }catch(){* ……* }catch(){* ……* }**** 能明确的问题,就尽量明确,实在找不出就使用Exception* Exception 是可以匹配所有的问题,只能放在最后*** */public class ExceptionDemo_03 {public static void main(String[] args) {//method1();//method2();method3();}private static void method3() {int a = 10;int b = 0;int[] arr = {1, 2, 3};try {System.out.println(a / b);System.out.println(arr[3]);}// catch (ArithmeticException ae) {// System.out.println("除数不能为0");// } catch (ArrayIndexOutOfBoundsException ae) {// System.out.println("索引越界");// }catch(Exception e){System.out.println("出问题了"); //这个只能放在最后,否则后面的catch会保错}System.out.println("over");}private static void method2() {int a = 10;int b = 0;try {System.out.println(a / b);}catch(ArithmeticException ae){System.out.println("除数不能为0");}int []arr= {1,2,3};try{System.out.println(arr[3]);}catch(ArrayIndexOutOfBoundsException ae){System.out.println("索引越界");}System.out.println("over");}public static void method1() {//第一阶段int a = 10;//int b = 2;int b = 0;try {System.out.println(a / b);}catch(ArithmeticException ae){System.out.println("除数不能为0");}//第二阶段System.out.println("over");}}
package cn.Exception;/*** JDK7出现了一个新特性* try{* ……* }catch(异常名1|异常名2|……变量名){* ……* }** 注意:* 1、这种方式是一致的(开发中可能就会针对同一类型的问题,给出同一个处理)* 2、多个异常间必须是平级关系(不能使用Exception)*** */public class ExceptionDemo_04 {public static void main(String[] args) {int a = 10;int b = 0;int [] arr = {1,2,3};// try{// System.out.println(a/b);// System.out.println(arr[3]);// System.out.println("这里出现了问题,怎么办");// }catch(ArithmeticException ae){// System.out.println("除数不能为0");// }catch(ArrayIndexOutOfBoundsException ae){// System.out.println("索引越界");// }catch(Exception e){// System.out.println("出问题了");// }// System.out.println("over");//JDK7的处理方案try{System.out.println(a/b);System.out.println(arr[3]);System.out.println("这里出现了问题,怎么办");}catch(ArithmeticException |ArrayIndexOutOfBoundsException ae){System.out.println("出问题了");}System.out.println("over");}}
* 编译时异常和运行时异常的区别:
编译时异常:java程序必须显示处理,否则就会发生错误,无法通过编译
运行时异常:无需显示处理,也可以和编译时异常一样处理
package cn.Exception;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/*** 编译时异常和运行时异常的区别* 编译时异常:java程序必须显示处理,否则就会发生错误,无法通过编译* 运行时异常:无需显示处理,也可以和编译时异常一样处理** 在try里面发现问题,JVM会帮我们生成一个异常对象,然后把这个对象抛出,,和catch 里面的类进行匹配* 如果该对象是某个类型,就会执行catch里面的处理信息** 异常中要了解几个方法:* public String getMessage() 异常消息的字符串** public String toString() 返回异常的简单信息描述* 此对象的类的 name* ": "(冒号和一个空格)* 调用此对象 getLocalizedMessage() 方法的结果(默认返回的是getMessage()的内容)** printStackTrace() 获取异常类名和异常信息,一讲话异常出现在程序的位置,返回值void,把信息输出在控制台(相当于toString)* */public class Exception_05 {public static void main(String[] args) {// int a = 10;// int b = 0;// if(b!=0){// System.out.println(a/b);// }String s = "2014-11-20";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {Date d = sdf.parse(s); //创建一个ParseException 对象,然后抛出,和catch里面的进行匹配System.out.println(d);} catch (ParseException e) { //ParseException e = new ParseException();//e.printStackTrace();//getMessage()System.out.println(e.getMessage()); //Unparseable date: "2014-11-20"//toStringSystem.out.println(e.toString()); //java.text.ParseException: Unparseable date: "2014-11-20"e.printStackTrace();}System.out.println("over");}}
package cn.Exception;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/*** 有的时候,我们是可以对异常进行处理的,但有的时候没有权限去处理某个异常* 为了解决这个问题,java针对这种情况提供了一种处理方案:抛出(throws)* 格式:* throws 异常类名* 注意:* 1、这个格式必须是跟在方法的括号后面的* 2、尽量不要在main方法上面抛出异常** ArithmeticException 算数异常* parseException 解析异常** 小结:* 编译期异常抛出,奖励啊调用必须处理,* 运行期异常抛出,将来调用可以不用处理** */public class ExceptionDemo_06 {public static void main(String[] args) {System.out.println("今天天气很好");try {method();} catch (ParseException e) {e.printStackTrace();}System.out.println("但是就不该有雾霾");method2();}private static void method2() throws ArithmeticException{int a = 10;int b = 0;System.out.println(a/b);}public static void method() throws ParseException {String s = "2014-11-20";SimpleDateFormat sdf = new SimpleDateFormat();Date d = sdf.parse(s);System.out.println(d);}}
* throw:如果出现了异常情况我们可以把异常抛出,这个时候抛出的是异常的对象* throws:在方法上面声明异常(表示的是一种异常的可能性)* throw用在方法内部抛出异常对象(表示的是真的异常)* throws:* 1、用在方法声明后面跟的是异常类名* 2、可以跟多个异常类型,用逗号隔开* 3、表示抛出异常,由该方法的调用者处理* 4、throws表示出现异常的可能性,并不一定会发生这些异常** throw:* 1、用在方法体没,跟的是异常对象名* 2、一次只能抛出一个异常对象名* 3、表示抛出异常,有方法体内的语句处理* 4、throw则是抛出了异常,指定throw则是一定抛出了某种异常*
处理原则:
如果该功能颞骨可以将问题处理,同try,如果处理不了。交由调用者处理使用throws
区别:
后续程序还需要执行就是用try
后续程序不需要执行就使用throws
举例:
感冒吃点药就好:try
感冒吃药不见好:throws
如果医院解决不了:Error(严重问题)
异常的注意事项:
1、子类重写父类方法时,子类方法必须抛出相同的异常或者父类异常的子类
2、如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是它的子集,子类不能抛出父类没有的异常
3、如果被重写的方法没有抛出异常,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能使用try ,不能使用throws
package cn.Exception.Finally;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/*** finally(异常处理的异常格式)* 格式try……catch……finally** 特点:被finally控制的语句一定会执行** 注意:如果 执行到finally之前jvm退出了,就不能在执行了** 作用:用于释放资源,** 面试题:* 1、final、finally、finalize* 1、final:最终的意思,可以修饰类,成员变量,成员方法* 修饰类:类不能被继承* 修饰变量:变量是常量* 修饰方法:方法不能别重写** 2、finally:异常处理,用于释放资源* 一般来说,代码肯定会执行,特殊情况下:在执行finally之前jvm就退出了,就不在实行了** 3、finalize:是Object类的一个方法,垃圾回收器*** 2、如果catch里面有return,那么finally里面的代码还会执行吗* 如果会,是在return前执行还是return后执行* 会,return前执行** try ……catch ……finally的格式变形* 1、try……catch……finally* 2、try……catch* 3、try……catch……catch* 4、try……catch……catch ……finally* 5、try……finally这种做法是为了释放资源**** */public class ExceptionFinallyDemo {public static void main(String[] args) {// String s = "2014-11-10";// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//// Date d = null;// try {// d = sdf.parse(s);// } catch (ParseException e) {// e.printStackTrace();// }finally{// System.out.println("这里的代码是可以执行的");// }// System.out.println(d);System.out.println(getInt());}public static int getInt(){int a = 10;try{System.out.println(a/0);a=20;}catch(ArithmeticException e){a = 30;return a; //返回路径/*** return a 在执行到这一步的时候,这里不是return a ,二是return 30;这个返回路径就形成了* 但是在后面有finally,所以就继执行finally的内容,a=40* 再次回到以前的返回路径,此时继续走return 30* */}finally{a = 40;return a; // 此时,a = 40;}//return a; //面试是在这里return}}
File:
package cn.File;import java.io.File;/*** 我们要想实现IO的操作,就必须知道硬盘上文件的表现形式* 而java就提供了一个类File供我们使用** File:文件和目录(文件夹)路径名的抽象表现形式** 构造方法:* 1、File(String pathname) : 根据一个路径得到一个File对象* 2、File(String parent ,String child) :根据一个目录和一个子文件/目录得到一个File对象*** */public class FileDemo {public static void main(String[] args) {//1、File(String pathname) : 根据一个路径得到一个File对象//把e:\\demo\\a.tex封装成一个File对象File file = new File("e:\\demo\\a.txt");//2、File(String parent ,String child) :根据一个目录和一个子文件/目录得到一个File对象File file2 = new File("E:\\demo\\a.txt");//3、File(File parent ,String child) : 根据一个父File对象和一个子文件/目录得到一个File对象// File file3 = new File("e:\\demo);// File file4 = new File(file3,"a.txt");//以上三种表现形式效果都是一样的}}
package cn.File;import java.io.File;import java.io.IOException;/*** File 的创建功能* 1、public boolean createNewFile() //创建文件* 2、public boolean mkdir() //创建文件夹 如果存在就会返回false ,不创建* 3、public boolean mkdirs() //创建多级文件夹如果父类文件夹不存在,会自动创建** a.txt 不一定是文本文件,可以是文件名,所以需要判断一下是文件,还是文件夹** File 的删除功能:* 1、public boolean delete()* 注意:* 1、在删除之前必须要有文件夹* 2、java删除不走回收站** */public class FileDemo_02 {public static void main(String[] args) throws IOException {//需求: 在E盘创建一个文件夹demoFile file1 = new File("e:\\demo");System.out.println("mkdir : " + file1.mkdir());//需求:在e盘demo文件下创建一个a.txtFile file2 = new File("e:\\demo\\a.txt");System.out.println("creatNewFile : " +file2.createNewFile());//需求:在e盘目demo1录创建一个文件b.txt// File file3 = new File("e:\\demo1\\a.txt");// System.out.println("creatNewFile : "+ file3.createNewFile());//这样做会报错,因为在当前路径下,demo1文件夹还不存在,所以,需要先创建文件夹在穿件文件//需求:在e盘目录test下创建目录aaa(创建文件夹,在到文件夹里面创建文件夹)File file4 = new File("e:\\test\\aaa");System.out.println("mkdir : " + file4.mkdir()); //false,因为test文件夹还没有创建,所以创建不了aaa,但是没有报错File file5 = new File("e:\\test");File file6 = new File("e:\\test\\aaa");System.out.println("mkdir :" +file5.mkdir());System.out.println("mkdir :" + file6.mkdir()); //不适合多目录使用//3、public boolean mkdirs() //创建多级文件夹如果父类文件夹不存在,会自动创建File file7 =new File("e:\\aaa\\bbb\\ccc\\ddd\\eee\\fff\\zzz\\ddd\\eee\\ggg\\jjj");System.out.println("mkdir : " + file7.mkdirs());System.out.println("------");//创建目录dd并创建目录a.txtFile file8 = new File("e:\\dd\\a.txt");System.out.println("mkdir : " + file8.mkdirs()); //a.txt 不一定是文本文件,还可以是文件名//删除功能://创建文件:// File file = new File("a.txt"); //这里没有写盘符,但是可以创建成功,目录位置在当前项目路径// System.out.println("createNewFile :" + file.createNewFile()); //创建文件File file = new File("e:\\a.txt");System.out.println("createNewFile :" + file.createNewFile()); //创建文件//1、public boolean delete()// File file11 = new File("e:\\test\\aaa");// System.out.println("delete : " + file.delete());System.out.println("delete : " + file7.delete());}}
package cn.File;import java.io.File;/**** File 的创建功能* * 1、public boolean createNewFile() //创建文件* * 2、public boolean mkdir() //创建文件夹 如果存在就会返回false ,不创建* * 3、public boolean mkdirs() //创建多级文件夹如果父类文件夹不存在,会自动创建* ** * a.txt 不一定是文本文件,可以是文件名,所以需要判断一下是文件,还是文件夹* ** * File 的删除功能:* * 1、public boolean delete()* * 注意:* * 1、在删除之前必须要有文件夹* * 2、java删除不走回收站* * File 的重命名* public boolean renameTo(file dest) //重命名* 注意:* 1、如果路径名相同,就是改名* 2、如果路径名不同,就是改名并剪切** 路径以盘符开始:绝对路径: c:\\a\txt* 路径不以盘符开始:相对路径: a.txt** */public class FileDemo_03 {public static void main(String[] args) {//创建文件:File file = new File("证件照.jpg");//需求:改成邓同湖证件照.jpg// File newFile = new File("邓同湖证件照.jpg");// System.out.println("renameTo : " + file.renameTo(newFile));File file2 = new File("邓同湖证件照.jpg");File newFile2 = new File("e:\\dengtonghu");System.out.println("rename : " + file2.renameTo(newFile2)); //这一步相当于改名和剪切}}
file的判断功能
package cn.File;import java.io.File;import java.io.IOException;/*** File的判断功能:* 1、public boolean idDirectory() 判断是否是目录* 2、public boolean isFile(); 判断是否是文件* 3、public boolean exists(); 判断文件是否存在* 4、public boolean canRead() 判断是否可读* 5、public boolean canWrite(); 判断是否可写* 6、public boolean isHidden(); 判断是否隐藏*** */public class FileDemo_04 {public static void main(String[] args) throws IOException {//创建文件File file = new File("a.txt");System.out.println("createNewFile : " +file.createNewFile());System.out.println("idDirectory : " +file.isDirectory());System.out.println("isFile : " +file.isFile());System.out.println("exists : " +file.exists());System.out.println("canRead : " +file.canRead());System.out.println("canWrite : " +file.canWrite());System.out.println("isHidden : " +file.isHidden());}}
获取毫秒值转为格式化时间
Date d = new Date(1595841521032l);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd : HH:mm:ss");String s= sdf.format(d);System.out.println(s);
package cn.File;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;/*** File 的获取功能:* public String getAbsolutePath() 获取绝对路径* public String getPath() 获取相对路径* public String getName() 获取名字* public long length(); 获取长度,字节数* public long lastModified() 获取最后一次修改时间,返回毫秒值*** */public class FileDemo_05 {public static void main(String[] args) {//创建文件方法:File file = new File("test.txt");System.out.println("getAbsolutePath : " + file.getAbsolutePath());System.out.println("getPath: " + file.getPath());System.out.println("getName : " + file.getName());System.out.println("length : " + file.length());System.out.println("lastModified : " + file.lastModified());//1595840481722毫秒值Date d = new Date(1595841521032l);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd : HH:mm:ss");String s= sdf.format(d);System.out.println(s);}}
File的高级获取:(获取所有的文件夹)
package cn.File_01;import java.io.File;/*** File的高级获取* public String [] list() 获取指定目录下的所有文件或者文件夹的名称数组* public File[] listFiles() 获取指定目录下的所有文件或者文件下的file数组*** */public class FileDemo_06 {public static void main(String[] args) {//定义一个路径File file = new File("e:\\");//public String [] list() 获取制定目录下的所有文件或者文件夹名称的数组String[] strArray = file.list();for (String s : strArray) {System.out.println(s);}System.out.println("--------------");//public File[] listFiles() 获取指定目录下的所有文件或者文件下的file数组File[] fileArray = file.listFiles();for (File f : fileArray) {System.out.println(f);}}}
package cn.FileTest;import java.io.File;/*** 判断e盘目录下是否有后缀名为.jpg 的文件,如果有,就输出文件的名称* 分析:* 1、封装e判断目录* 2、获取该目录下面所有文件或者文件夹的File数组* 3、遍历该file数组,单后判断* 4、是否是文件* 是:继续判断是否以.jpg结尾* 是:输出文件名称* 否:不搭理* 否:不搭理* */public class FileDemo {public static void main(String[] args) {//封装e盘目录File file= new File("e:\\");//获取该目录下面所有的文件或者文件夹数组//public File[] listFiles() 获取指定目录下的所有文件或者文件下的file数组File [] fileArray = file.listFiles();//遍历file数组,得到每一个File对象,然后判断for (File f : fileArray){//判断是否是文件if(f.isFile()){//判断是不是以.jpg结尾if(f.getName().endsWith(".jpg")){//输出给文件的名称System.out.println(f.getName());}}}}}



递归:
package cn.DiGui;import java.util.Scanner;/*** 递归:方法定义中调用方法本身的现象* public void show(int n){* System.out.println(n)* show()* }** 注意事项:* 1、递归一定要有出口,否则就是死递归* 2、递归的次数不能太多,否则会造成内存溢出* 3、构造方法不能递归使用*** 需求:* 计算5的阶乘* n!表示阶乘* 5!= 1*2*3*4*5* 循环实现* 递归实现** 递归解决问题的思想* 1、分解法:* 2、合并法:* 先把大问题分解小问题解决,到后面返回形成一个大问题** 递归:方法定义中,调用本身的现象* 实现:* 1、做递归要写一个方法* 写方法:* 1、返回值类型* 2、参数列表* 2、出口条件* 3、规律** */public class DiGuiDemo {public static void main(String[] args) {// int jc = 1;// for(int x = 2;x<=5;x++){// jc*= x; //等价于jc = jc*x;//// }// System.out.println("5的阶乘是:" + jc);// Scanner sc =new Scanner(System.in);// System.out.println("请输入 : ");// int num = sc.nextInt();// int jc = 1;// for(int x = 2;x<=num;x++){// jc*= x; //等价于jc = jc*x;//// }// System.out.println("你输入:"+num+"的阶乘是:" + jc);// System.out.println("------------");System.out.println("5的阶乘是: "+jiecheng(5));}/*** 做递归要写一个方法* 返回值类型:int 或者long* 参数列表:int n** 出口条件:* if(n==1 ) {return 1;}** 规律:if(n!= 1) {return n*方法名(n-1)}*** */public static int jiecheng(int n){if(n==1){return 1;}else {return n*jiecheng(n-1);}}}
package cn.DiGui;/*** 有一对兔子,从出生后第三个月起,每个月生一对小兔子,小兔子长到第三个月的时候,每个月又生一对兔子,加入兔子不死,请问第20个月后有多少对兔子* 分析:* 兔子对数* 第一个月: 1* 第二个月: 1* 第三个月: 2 第一个月生的兔子生了一对小兔子* 第四个月: 3 第一个月生的兔子生一对,第二个月的兔子生一对,老兔子生一对* 第五个月: 5 第一个月的生一对,第二个月的生一对,第三个的生一对,第一个月生的小兔子兔子再生一对,第二个月生的小兔子再生一对* 第六个月: 8* ……** 兔子的对数是:1、1、2、3、5、8* 1+1=2* 2+3=5* 3+5=8* ……* 1、从第三项开始,每一项是前两项之和* 2、前两项是已知的** 实现:* 1、数组实现* 2、变量的变化实现** 假如相邻的两个月的兔子变量是a,b* 第一个相邻的数据:a = 1,b = 1;* 第二个相邻的数据:a = 1,b = 2* 第三个相邻的数据:a = 2,b = 3* 第四个相邻的数据:a = 3,b = 5* 下一次的a是上一次的b, b是上一次的a+b** */public class DiGuiDemo_02 {public static void main(String[] args) {//定义一个数组int [] arr = new int[20];arr[0] = 1;arr[1] = 1;// arr[2] = arr[0]+arr[1];// arr[3] = arr[1]+ arr[2];// ……for(int x = 2; x<arr.length;x++){arr[x] = arr[x-2] + arr[x-1];}System.out.println(arr[19]); //6765System.out.println("--------------------");int a = 1;int b = 1;for(int x = 0 ;x<18;x++){ //第一个月和第二个月已经拿出,所以是18//临时变量存储a的值int temp = a;a= b;b = temp+b;}System.out.println(b);//递归实现/** 方法:* 1、返回值类型:int* 2、参数列表:int n** 出口条件:* 第一个月是1,第二个月是1* 规律:* 从第三个月开始,每个月是前两个月之和**** */System.out.println(fib(20));}public static int fib(int n){if(n==1|| n==2){return 1;}else{return fib(n-1)+fib(n-2); //前一个月是n-1,前两个月是n-2}}}
package cn.DiGui;import java.io.File;/*** 需求: 把D:\javaProject中目录下所有的以.java结尾的文件的绝对路径输出在控制台* 分析:* 1、封装对象* 2、获取该目录下所有的文件或者文件夹的File[]* 3、遍历File数组,得到每一个File对象* 4、判断该File对象是否是文件夹* 是:回到2 //因为要回到2,所以使用递归方法* 否:判断是否以.java结尾* 是:数据该文件的绝对路径* 否:不搭理*** */public class FilePathDemo {public static void main(String[] args) {//封装对象File srcFolder = new File("d:\\javaProject");//递归功能实现getAllJavaFilePaths(srcFolder);}private static void getAllJavaFilePaths(File srcFolder) {//2、获取该目录下所有的文件或者文件夹的File[]File[] fileArray = srcFolder.listFiles();//3、遍历File数组,得到每一个File对象for(File file:fileArray){//4、判断该File对象是否是文件夹if(file.isDirectory()){ //判断是否是文件getAllJavaFilePaths(file);}else{if(file.getName().endsWith(".java")){ //判断是否以.java结尾System.out.println(file.getAbsoluteFile()); //是,则输出绝对路径}}}}}

package cn.IO.cn;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/*** IO:* 概述:IO流用来处理设备之前的数据传输* 上传文件和下载文件* java对数据的操作都是通过流的方式* java用于操作流的对象都在IO包下** 按照数据流向分:* 输入流 读数据* 输出流 写数据** 按照数据类型分:* 字节流 不能读懂** 字节输入流:读取数据 InputStream* 字节输出流:写出数据 OutputStream** 字符流 可以读懂** 字符输入流:读取数据 Reader* 字符输出流:写出数据 Writer** 注意:如果没有明确说明按哪种分分类,是按照数据类型分类的** 使用场景:* 如果数据所在的文件通过windows自带的记事本打开并且能够读懂里面的内容就是用字符流,其他使用字节流* 如果不清楚,就使用字符流** 查看FileOutputStream 的构造方法:* FileOutputStream(File file)* FileOutputStream(String name)** 字节输出流操作步骤:* 1.创建字节输出流对象* 2、写数据* 3、释放资源**** */public class IODemo {public static void main(String[] args) throws IOException {//创建字节输出流对象// //FileOutputStream(File file)// File file = new File("fos.txt");// FileOutputStream fos = new FileOutputStream(file);//FileOutputStream(String name)FileOutputStream fos = new FileOutputStream("fos.txt");/*** 创建字节流输出对象做了三件事情* 1、调用系统功能区创建文件* 2、创建fos对象* 3、把fos对象指向这个文件** *///写数据“hello,io”fos.write("hello,io".getBytes());//释放资源fos.close();/*** 为什么要close* 1、让流对象变成垃圾,这样就可以被垃圾回收器回收* 2、通知体统去释放跟该文件相关的资源,如果不释放,那么该文件就一直无法关闭,占用系统资源* */}}
package cn.IO.cn;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/*** 字节流输出得操作步骤* 1、创建字节输出流对象* 2、调用writer() 方法* 3、释放资源** public void write (int b) 写一个字节* public void write(byte[] b) 写一个字节数组* public void write(byte [] b, int off ,int len) 写一个字节数组的一部分*** */public class IODemo_02 {public static void main(String[] args) throws IOException {//创建字节输出流对象FileOutputStream fos = new FileOutputStream("fos2.txt");//调用writer()方法:// fos.write(97); //输出:a: 因为底层是二进制数据结构,通过对应的记事本打开,找97对应的字符值a// fos.write(57); //9// fos.write(55); //7//public void write(byte[] b) 写一个字节数组byte[] bytes = {97,98,99,100,101};fos.write(bytes);// public void write(byte [] b, int off ,int len) 写一个字节数组的一部分fos.write(bytes,1,3); //bcdfos.close();}}
标准的异常处理代码
package cn.IO_01;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/*** 加入异常处理的字节流输出操作** */public class FileOutputStream_02 {public static void main(String[] args) {//创建字节输出流// FileOutputStream fos = null;// try {// fos = new FileOutputStream("fos4.txt");// } catch (FileNotFoundException e) {// e.printStackTrace();// }// //写数据// try {// fos.write("java".getBytes());// } catch (IOException e) {// e.printStackTrace();// }// //释放资源// try {// fos.close();// } catch (IOException e) {// e.printStackTrace();// }//一起处理异常// try{// FileOutputStream fos = new FileOutputStream("fos.txt");// fos.write("java".getBytes());// fos.close();//// }catch(FileNotFoundException e){// e.printStackTrace();// }catch(IOException e){// e.printStackTrace();// }//改进版:FileOutputStream fos = null;try {//fos = new FileOutputStream("z:\\fos4.txt"); //不存在盘符fos = new FileOutputStream("fos4.txt");fos.write("java".getBytes());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//为了保证close()一定会被执行,就放在这里//如果fos不是null,才需要closeif (fos != null) { //如果对象没有造成功,就不会close从而触发空指针异常try {fos.close(); //close本身就有异常,所以要抛出} catch (IOException e) {e.printStackTrace();}}}}}
package cn.IO_InputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;/*** 字节输入流的操作步骤(读)* 1、创建字节输入流对象* 2、调用read()方法读取数据,并把数据显示在控制台* 3、释放资源** 读取数据的方式:* 1、int read() 一次读取一个字节数数组* 2、int read(byte [] b) 一次读取一个字节数组** */public class FileInputStreamDemo_01 {public static void main(String[] args) throws IOException {//创建字节流输入流对象//FileInputStream fis = new FileInputStream("fis.txt");FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");//这里读取的是代码,但是注释会乱码,因为当前是char类型//2、调用read()方法读取数据,并把数据显示在控制台// int by = fis.read();// System.out.println("by = " + by);// System.out.println("(char)by = " + (char)by);//// by = fis.read();// System.out.println("by = " + by);// System.out.println("(char)by = " + (char)by);//// by= fis.read();// System.out.println("by = " + by);// System.out.println("(char)by = " + (char)by);//// by = fis.read();// System.out.println("by = " + by); //-1说明文件已经到达末尾了//用循环改进// int by = fis.read(); // 先读取一次// while(by!= -1){// System.out.print((char)by);// by = fis.read();// }//最终版:int by = 0;while((by = fis.read())!=-1){ //读取、赋值、判断System.out.print((char) by);}//3、释放资源fis.close();}}
package cn.IO_InputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/*** 复制文本文件* 数据源:从哪里来* a.txt --- 读数据 --- FileInputStream* 目的地:到哪里去* b.txt --- 写数据 --- FileOutputStream*** java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)说明数据源不存在** 上一次我们出现问题的原因是每次获取到一个字节是数据,就把该字节数据转换为了字符数据,然后输出在控制台* 这里复制中文没有出现问题而这一次是通过IO流读取数据,写到文本文件,读一个字节,就写入一个字节,‘没有做任何的转换,会自己做转换**** */public class CopyFileDemo {public static void main(String[] args) throws IOException {//封装数据源(读)FileInputStream fis = new FileInputStream("a.txt");//封住目的地(写)FileOutputStream fos = new FileOutputStream("b.txt");int by = 0;while((by=fis.read())!=-1){fos.write(by);}//释放资源fos.close();fis.close();}}
计算机是如何识别什么时候该把两个字节转换为一个中文呢
在计算机中,中文的存储分为两个字节,:
第一个字节肯定是负数
第二个字节是负数,也可能是正数,但是没有印象
如:我—— -50
爱—— -46
复制数据:
int by= 0;
while(by = fis.read() != -1){
fos.write(by);
}
package cn.IO_InputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;/*** 字节输入流的操作步骤(读)* 1、创建字节输入流对象* 2、调用read()方法读取数据,并把数据显示在控制台* 3、释放资源** 读取数据的方式:* 1、int read() 一次读取一个字节数数组* 2、int read(byte [] b) 一次读取一个字节数组** */public class FileInputStreamDemo_01 {public static void main(String[] args) throws IOException {//创建字节流输入流对象//FileInputStream fis = new FileInputStream("fis.txt");FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");//这里读取的是代码,但是注释会乱码,因为当前是char类型//2、调用read()方法读取数据,并把数据显示在控制台// int by = fis.read();// System.out.println("by = " + by);// System.out.println("(char)by = " + (char)by);//// by = fis.read();// System.out.println("by = " + by);// System.out.println("(char)by = " + (char)by);//// by= fis.read();// System.out.println("by = " + by);// System.out.println("(char)by = " + (char)by);//// by = fis.read();// System.out.println("by = " + by); //-1说明文件已经到达末尾了//用循环改进// int by = fis.read(); // 先读取一次// while(by!= -1){// System.out.print((char)by);// by = fis.read();// }//最终版:int by = 0;while((by = fis.read())!=-1){ //读取、赋值、判断System.out.print((char) by);}//3、释放资源fis.close();}}
package cn.IO_InputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/*** 需求需求:把e:\\010_注释.mp4复制到当前目录下* 数据源* e:\\010_z注释.mp4 --- 读数据 ---FileInputStream* 目的地:* copy.mp4 ---写数据--- FileOutputStream*** */public class CopyMp4Demo_02 {public static void main(String[] args) throws IOException {//封装数据源FileInputStream fis = new FileInputStream("e:\\010_注释.mp4");//封装目的地FileOutputStream fos = new FileOutputStream("010_注释.mp4");//复制数据int by = 0;while((by = fis.read())!=-1){fos.write(by);}byte[] bys = new byte[1024]; // java缓冲区效果int len = 0;while((len = fis.read(bys))!=-1){fos.write(bys,0,len);}//释放资源fos.close();fis.close();}}
IO流的分类:
/*** IO流分类:* 字节流:* InputStream:(输入流(读))* FileInputStream* BufferedInputStream* OutputStream(输出流(写))* FileOutputStream* BufferedOutputStream** 字符流:* reader:(字符输入流(读))* FileReader* BufferedReader* writer:(字符输出流(写))* FileWriter* BufferedWrite** */
- 为什么要close
* 1、让流对象变成垃圾,这样就可以被垃圾回收器回收
- 2、通知系统去释放跟该文件相关的资源,如果不释放,那么该文件就一直无法关闭,占用系统资源
编码表:由现实世界的字符和对应的数值组成的一张表
ASCII码表:最高位位符号位,其余为数值位
‘a’ 97
‘A’ 65
‘0’ 48
ISO-8859-1: 拉码表 8位表示一个数据
GB2312: 中国的中文编码表
GBK: 中国的中文编码表升级,融合了更多的中文文字符号
GB19030 :GBK的取代版本
BIG-5码: 通用于台湾、香港地区的一个繁体字编码方案,俗称“大五码”
Unicode 国际编码表,融合了各种文字;
所有文字都是用两个字节表示,java语言使用的就是Unicode
UTF-8 最多三个字节表示一个字符
能用一个字符用一个字符表示,(ASCII兼容)
一个表示不了就使用两个,实在不行就使用三个
package cn.IO;import java.io.UnsupportedEncodingException;import java.util.Arrays;/*** String(byte[] bytes, String charsetName) 通过指定的字符集解码字节数组* byte [] getBytes(String charsetName) 使用指定的字符集和把字符串编码为字节数组** 编码:String --- byte[]* 把看的懂得变成看不懂的* 解码:byte[] --- String* 把看不懂的变成看得懂的** */public class StringDemo {public static void main(String[] args) throws UnsupportedEncodingException {String s = "你好";//String --- byte[]byte[] bys = s.getBytes();System.out.println(Arrays.toString(bys)); //[-28, -67, -96, -27, -91, -67]byte[] bys2 = s.getBytes("GBK ");System.out.println(Arrays.toString(bys2)); //[-60, -29, -70, -61]//byte[] --- StringString ss = new String(bys);System.out.println(ss);String sss = new String(bys2);System.out.println("sss = " + sss);}}
package cn.IO;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;/*** OutputStreamWriter(OutputStream out) 根据默认编码把字节流数据转换为字符流* OutputStreamWriter(OutputStream out ,String charsetName) 根据指定编码转把字节流数据转换为字符流* 把字节流转换为字符流* 字符流= 字节流+编码表** */public class OutputStreamWriterDemo {public static void main(String[] args) throws IOException {//创建对象//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt")); //默认编码OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"),"Unicode"); //制定编码//写数据osw.write("中国");//释放资源osw.close();}}
package cn.IO;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;/*** OutputStreamWriter的方法:* public void write(int c) 写一个字符* public void write(char[] cbuf) 写一个字符数组* public void write(char[] cbuf , int off ,int len) 写一个字符数组的一部分* public void write(String str) 写一个字符串* public void write(String str ,int off ,int len ) 写一个字符串的一部分** 面试题: close() 和flush()的区别:* 1、close() 关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象就不能再使用了* 2、flush()仅仅刷新缓冲区,刷新之后,流对象还可以使用*** */public class OutputStreamWriterDemo_02 {public static void main(String[] args) throws IOException {OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw2"));//写数据//public void write(int c) 写一个字符// osw.write('a');// osw.write(97);//public void write(char[] cbuf) 写一个字符数组// char[] chs = {'a','b','c','d','e'};// osw.write(chs);//public void write(char[] cbuf , int off ,int len) 写一个字符数组的一部分//osw.write(chs,1,4); //获取两个会报错//public void write(String str) 写一个字符串//osw.write("我爱林青霞");//public void write(String str ,int off ,int len ) 写一个字符串的一部分osw.write("我爱林青霞",2,3);osw.flush(); //刷新缓冲区,因为字符流数据没有直接进文件,而在缓冲区,所有刷新osw.write("我爱林青霞",2,3);osw.close();// osw.write("我爱林青霞",2,3); //写这里会报错}}
package cn.test;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/*** 由于常见的操作都是使用本地默认编码,所以不用指定编码* 而转换流的长度有点长,java就提供了其子类使用* OutputStreamWriter = FileOutputStream+ 编码表(GBK)* FileWriter = FilOutputStream+编码表(GBK)** InputStreamReader = FileInputStream + 编码表(GBK)* FileReader = FileInputStream + 编码表(GBK)*** 需求;把当前项目目录下的a.txt文件内容复制到当前项目目录下的b.txt* 数据源:* a.txt ---读取数据---字节转换流---InputStreamReader --- FileReader* 目的地:* b.txt ---写入数据---字节转换流---OutputStreamWriter ---FileWriter** */public class CopyFileDemo_02 {public static void main(String[] args) throws IOException {//数据源FileReader fr = new FileReader("a.txt");//目的地FileWriter fw = new FileWriter("b.txt");//读数据// int ch = 0;// while((ch = fr.read())!=-1){// fw.write((char) ch);// }char[] chars = new char[1024];int len = 0;while((len = fr.read(chars))!=-1){fw.write(chars,0,len);}//释放资源fr.close();fw.close();}}
package cn.Bufered;import java.io.*;/*** * 需求;把当前项目目录下的a.txt文件内容复制到当前项目目录下的b.txt* * 数据源:* * a.txt ---读取数据---字节转换流---InputStreamReader --- FileReader* * 目的地:* * b.txt ---写入数据---字节转换流---OutputStreamWriter ---FileWriter** */public class CopyDemo_01 {public static void main(String[] args) throws IOException {//封装数据源BufferedReader br = new BufferedReader(new FileReader("a.txt"));//封装目的地BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));//读数据// int ch = 0;// while((ch = br.read())!=-1){// bw.write(ch);// }char[] chars = new char[1024];int len = 0;while((len = br.read(chars))!= -1){bw.write(chars,0,len);bw.flush();}//释放资源br.close();bw.close();}}
package cn.Bufered;import java.io.*;/*** 字符流为了搞笑读写,也提供了字符缓冲流* BufferedWriter:字符输出流(写)* 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。* 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。** BufferedReader:字符输入流(读)*** */public class BufferedWriterDemo_01 {public static void main(String[] args) throws IOException {//BufferedWriter(Writer out)//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("bw.txt")));BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));//写数据// bw.write("hello"+"\n");// bw.write("java"+"\n");// bw.write("world"+"\n");bw.close();}}
package cn.Bufered;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;/*** BufferedReader:* 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。* 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。* BufferedReader(Reader in)** */public class BufferedReaderDemo_01 {public static void main(String[] args) throws IOException {//创建字符缓冲输入流对象BufferedReader br = new BufferedReader(new FileReader("bw.txt"));//// int ch = 0;// while ((ch = br.read())!=-1){// System.out.print((char)ch);// }char [] chars = new char[1024];int len = 0;while((len = br.read(chars))!=-1){System.out.println(new String(chars,0,len));}br.close();}}
package cn.Bufered;import java.io.*;/*** 字符 缓冲流的特殊方法:* BufferedWriter:* public void newLine() 根据 系统来决定换行符* BufferedReader:* public String readLine() 一次读取一行数据* 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null*** */public class BufferedDemo {public static void main(String[] args) throws IOException {//创建字符缓冲数据流对象// BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));//// for(int x = 0;x <10;x++){// bw.write("hello"+x);// //bw.write("\r\n");// bw.newLine();// bw.flush();////// }////// //释放资源// bw.close();//write();read();}private static void read() throws IOException{//创建字符缓冲输入流BufferedReader br = new BufferedReader(new FileReader("bw2.txt"));// String line = br.readLine();// System.out.println("line = " + line); //hello0// line = br.readLine();// System.out.println("line = " + line); //hello1String line = null;while((line = br.readLine())!=null){System.out.println(line);}br.close();}private static void write() throws IOException {BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));for(int x = 0;x <10;x++){bw.write("hello"+x);//bw.write("\r\n");bw.newLine();bw.flush();}//释放资源bw.close();}}
package cn.Bufered;import java.io.*;/*** * 需求;把当前项目目录下的a.txt文件内容复制到当前项目目录下的b.txt* * 数据源:* * a.txt ---读取数据---字节转换流---InputStreamReader --- FileReader* * 目的地:* * b.txt ---写入数据---字节转换流---OutputStreamWriter ---FileWriter** */public class CopyDemo_02 {public static void main(String[] args) throws IOException {//封装数据源BufferedReader br = new BufferedReader(new FileReader("a.txt"));//封装目的地BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));//读写数据String line = null;while((line = br.readLine())!=null){bw.write(line);bw.newLine(); //写换行符bw.flush();}//释放资源br.close();bw.close();}}

IO(复制文件的5中方式)重点是:第五种
package cn.test;import java.io.*;/*** 复制文本文件* 分析:* 1、复制数据用记事本打开兵并且可以读懂,就用字符流,否则用字节流,通过分析,使用字符流更方便* 而字符流有5种方式(掌握第5种)* 数据源: a.txt ---FileReader ---BufferedReader* 目的地: e:\\b.txt---FileWriter ---BufferedWriter** */public class CopyFileDemo_03 {public static void main(String[] args) throws IOException {String srcString= "a.txt";String destString = "e:''b.txt";// method1(srcString,destString);// method2(srcString,destString);// method3(srcString,destString);// method4(srcString,destString);method5(srcString,destString);}//字符缓冲流一次读写一个字符串(掌握)private static void method5(String srcString, String destString) throws IOException {BufferedReader br = new BufferedReader(new FileReader(srcString));BufferedWriter bw = new BufferedWriter(new FileWriter(destString));String line = null;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine(); //换行bw.flush();}bw.close();br.close();}//高效字符缓冲流(一次一个数组)private static void method4(String srcString, String destString) throws IOException {BufferedReader br = new BufferedReader(new FileReader(srcString));BufferedWriter bw = new BufferedWriter(new FileWriter(destString));char[] chars = new char[1024];int len = 0;while ((len = br.read(chars)) != -1) {bw.write(chars, 90, len);}bw.close();br.close();}//高效字符缓冲流(一次一个字符)private static void method3(String srcString, String destString) throws IOException {BufferedReader br = new BufferedReader(new FileReader(srcString));BufferedWriter bw = new BufferedWriter(new FileWriter(destString));int ch = 0;while ((ch = br.read()) != -1) {bw.write(ch);}br.close();bw.close();}private static void method2(String srcString, String destString) throws IOException {FileReader fr = new FileReader(srcString);FileWriter fw = new FileWriter(destString);//一次读写一个字符数组char[] chars = new char[1024];int len = 0;while ((len = fr.read(chars)) != -1) {fw.write(chars, 0, len);}fr.close();fw.close();}//基本字符流,一次读写一个private static void method1(String srcString, String destString) throws IOException {FileReader fr = new FileReader(srcString);FileWriter fw = new FileWriter(destString);int ch = 0;while ((ch = fr.read()) != -1) {fw.write(ch);}fr.close();fw.close();}}
掌握第四种
package cn.test;import java.io.*;/*** 复制图片:* 分析:* 复制数据用记事本打开可以读懂就是用字符流,而读不懂就使用字节流;* 而字节流有四种方式,掌握第四种** 数据源:e:\\证件照.jpg ---FileInputStream---BufferedInputStream* 目的地:证件照。jpg ---FileOutputStream---BufferedOutputStrsam** */public class CopyImageDemo {public static void main(String[] args) throws IOException {//使用字符串作为路径// String srcString="e:\\证件照.jpg";// String destString= "证件照.jpg";// method1(srcString,destString);// method2(srcString,destString);// method3(srcString,destString);// method4(srcString,destString);//使用File对象作为参数File srcfile = new File("e:\\证件照.jpg");File destfile = new File("证件照.jpg");//method1(srcfile,destfile);// method2(srcfile,destfile);// method3(srcfile,destfile);method4(srcfile,destfile);}//字节缓冲区,一次字符数组private static void method4(File srcfile, File destfile) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcfile));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfile));byte[] bytes = new byte[1024];int len = 0;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}}//字节缓冲流,一次一个字节private static void method3(File srcfile, File destfile) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcfile));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfile));int by = 0;while ((by = bis.read()) != -1) {bos.write(by);}}//一次读写一个字符数组private static void method2(File srcfile, File destfile) throws IOException {FileInputStream fis = new FileInputStream(srcfile);FileOutputStream fos = new FileOutputStream(destfile);byte[] bytes = new byte[1024];int len = 0;while ((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);}fis.close();fos.close();}//一次读写一个字节private static void method1(File srcfile, File destfile) throws IOException {FileInputStream fis = new FileInputStream(srcfile);FileOutputStream fos = new FileOutputStream(destfile);int by = 0;while ((by = fis.read()) != -1) {fos.write(by);}fis.close();fos.close();}}
package cn.test;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;/*** 需求:把ArrayList集合中的字符串数据存储到文本文件** 分析:* ArrayList集合里面存储的是字符串* 遍历ArrayList集合把数据获取到,然后存储到文本文件* 文本文件使用字符流** 数据源 : ArrayList<String>-- 遍历得到每一个字符串数据* 目的地: a.txt---FileWriter ---BufferedWrite** */public class ArrayListToFileDemo {public static void main(String[] args) throws IOException {//创建集合对象ArrayList<String> array = new ArrayList<>();array.add("hello");array.add("world");array.add("java");//封装数据源(目的地)BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));//遍历集合for(String s : array){//写数据bw.write(s);bw.newLine();bw.flush();}bw.close();}}
package cn.test;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;/**** 需求:从文本文件读取数据(每一行为椅子字符串数据) 到集合总并遍历* 分析:* 数据源是一个文本文件* 目的地是一个集合,元素是字符串** 数据源 b2.txt ---FileReader ---BufferedReader* 目的地 ArrayList<String>*** */public class FileToAArrayListDemo {public static void main(String[] args) throws IOException {//封装数据源BufferedReader br =new BufferedReader(new FileReader("b2.txt"));//封装目的地(创建集合对象)ArrayList<String> array = new ArrayList<>();//读取数据,存到集合中String line = null;while((line = br.readLine())!=null){array.add(line);}br.close();//遍历集合for(String s: array){System.out.println("s = " + s);}}}
package cn.test;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Random;/*** 需求:b2.txt文件存储了几个名称,写一个程序 实现随机获取一个人的名字* 分析:* 1、把文本文件的数据存储到集合中* 2、随机产生一个索引* 3.根据该索引获取一个值** */public class GetName {public static void main(String[] args) throws IOException {//把文本文件的数据存到集合中(f封装数据源)BufferedReader br =new BufferedReader(new FileReader("b2.txt"));//创建集合对象(封装目的地)ArrayList<String> array = new ArrayList<>();//读取数据String line = null;while ((line = br.readLine())!=null){array.add(line);}//释放资源br.close();//随机产生一个索引Random r = new Random();int index = r.nextInt(array.size());//根据该索引获取一个值String name = array.get(index);System.out.println("幸运者是: " + name);}}
package cn.IO;import java.io.FileReader;import java.io.IOException;import java.io.LineNumberReader;/*** BufferedReader* LineNumberReader* public int getLineNumber()获取当前行号* public void setLineNumber(int lineNumber)** */public class LineNumberReaderDemo {public static void main(String[] args) throws IOException {LineNumberReader lnr = new LineNumberReader(new FileReader("a.txt"));lnr.setLineNumber(10);//行号从10以后不包括10String line = null;while ((line = lnr.readLine()) != null) {System.out.println(lnr.getLineNumber() + ":" + line);//1:hello2:world3:java}lnr.close();}}
