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"
//toString
System.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盘创建一个文件夹demo
File file1 = new File("e:\\demo");
System.out.println("mkdir : " + file1.mkdir());
//需求:在e盘demo文件下创建一个a.txt
File 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.txt
File 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]); //6765
System.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); //bcd
fos.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,才需要close
if (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[] --- String
String 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); //hello1
String 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以后不包括10
String line = null;
while ((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + line);//1:hello2:world3:java
}
lnr.close();
}
}