package com.it.demo02_lambda;

//接口, 表示动物.
//public abstract class Animal { //报错, Lambda表达式只针对于接口有效
public interface Animal {
//抽象方法, 表示吃饭.
public abstract void eat(); //void sleep(); //报错, Lambda表达式只针对于一个抽象方法有效. }
package com.it.demo02_lambda;

/*
案例: Lambda表达式初体验(入门) 需求:
1.已知接口Animal中有一个抽象方法eat()
2.在测试类AnimalTest中定义show(Animal an)方法, 实现调用Animal#eat()方法.
3.并在main方法中, 调用AnimalTest#show()方法. Lambda表达式简介:
概述:
它是JDK1.8的特性, 体现的是 函数式编程思想, 即: 我们告诉程序做什么就行了, 怎么做是程序的事儿, 创建哪些对象, 重写什么方法也是程序的是, 我们不关心.
格式:
(形参列表) -> {
方法体, 即: 告诉程序需要它做的事儿.
}
解释:
形参列表: 和以前定义方法时的形参列表一样.
-> : 表示具体的指向动作, 固定格式.
方法体 : 和以前定义的方法体一致, 就是告诉程序需要它做的事儿
前提:
Lambda表达式只针对于: 有且只能有一个抽象方法的接口有效. */
public class AnimalTest {
public static void main(String[] args) {
//并在main方法中, 调用AnimalTest#show()方法.
//方式一: 定义子类Cat, 实现Animal接口, 多态的方式创建 Animal接口的子类对象. //方式二: 匿名内部类, 体现的是 面向对象 编程思想,
//即: 对象还需要我们自己new, 逻辑还要我们告诉对象.
show(new Animal() {
@Override
public void eat() {
System.out.println("我是匿名内部类, 动物会吃!");
}
});
System.out.println("----------------------"); //方式三: Lambda表达式实现, 体现的是 函数式 编程思想.
//即: 告诉程序做什么, 怎么做是程序的事儿, 创建哪些对象, 重写什么方法也是程序的是, 我们不关心.
show(() -> {
System.out.println("我是匿名内部类, 动物会吃!");
});
} //在测试类AnimalTest中定义show(Animal an)方法, 实现调用Animal#eat()方法.
public static void show(Animal an) { //Animal an = new Cat();
an.eat();
}
}
package com.it.demo02_lambda;

//表示具有加法运算的功能
public interface Addable {
//表示加法运算
int add(int x,int y);
} package com.it.demo02_lambda; /*
Lambda表达式案例: 演示有参有返回值的方法. 需求:
定义一个接口(Addable),里面定义一个抽象方法:int add(int x,int y);
定义一个测试类(AddableDemo),在测试类中提供两个方法
一个方法是:useAddable(Addable a)
一个方法是主方法,在主方法中调用useAddable方法
*/
public class AddableTest {
public static void main(String[] args) {
//需求: 调用useAddable(Addable a)方法
//方式一: 匿名内部类
useAddable(new Addable() {
@Override
public int add(int x, int y) {
System.out.println("匿名内部类");
return x + y;
}
});
System.out.println("-----------------------------"); //方式二: Lambda表达式
useAddable((int x, int y) -> {
System.out.println("Lambda表达式");
return x + y;
}); } //定义方法useAddable(Addable a), 接收Addable接口的子类对象.
public static void useAddable(Addable a) {
int sum = a.add(10, 20);
System.out.println(sum);
}
}
package com.it.demo02_lambda;

//表示具有吃饭的功能
public interface Eatable {
//吃饭
void eat();
} package com.it.demo02_lambda; /*
Lambda表达式案例: 演示无参无返回值的方法. 需求:
–定义一个接口(Eatable),里面定义一个抽象方法:void eat();
–定义一个测试类(EatableDemo),在测试类中提供两个方法
•一个方法是:useEatable(Eatable e)
•一个方法是主方法,在主方法中调用useEatable方法
*/
public class EatableTest {
public static void main(String[] args) {
//需求: 调用useEatable()方法
//useEatable(Eatable接口的子类对象); //方式一: 匿名内部类, 体现的是 面向对象 编程思想.
useEatable(new Eatable() {
@Override
public void eat() {
System.out.println("匿名内部类, 吃饭!");
}
});
System.out.println("----------------------------"); //方式二: Lambda表达式, 体验的是 函数式 编程思想.
useEatable(() -> {
System.out.println("Lambda表达式, 吃饭!");
});
} //定义方法:useEatable(Eatable e), 调用Eatable#eat()
public static void useEatable(Eatable e) {
e.eat();
}
}
package com.it.demo02_lambda;

//表示具有 飞翔 的功能
public interface Flyable {
//飞翔的功能
void fly(String s);
} package com.it.demo02_lambda; /*
Lambda表达式案例: 演示有参无返回值的方法. 需求:
定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s);
定义一个测试类(FlyableDemo),在测试类中提供两个方法
一个方法是:useFlyable(Flyable f)
一个方法是主方法,在主方法中调用useFlyable方法
*/
public class FlyableTest {
public static void main(String[] args) {
//需求: 调用useFlyable(Flyable f)方法.
//格式: useFlyable(Flyable接口的子类对象) //方式一; 匿名内部类.
useFlyable(new Flyable() {
@Override
public void fly(String s) {
System.out.println("匿名内部类");
System.out.println(s); //"风和日丽, 晴空万里"
System.out.println("适合开飞机自驾游!");
}
});
System.out.println("-------------------"); //方式二: Lambda表达式.
useFlyable((String s) -> {
System.out.println("Lambda表达式");
System.out.println(s); //"风和日丽, 晴空万里"
System.out.println("适合开飞机自驾游!");
});
} //定义方法 useFlyable(Flyable f), 接收Flyable对象.
public static void useFlyable(Flyable f){
f.fly("风和日丽, 晴空万里");
}
}
package com.it.demo02_lambda;

/*
案例: 演示Lambda表达式的省略模式. 规则:
1. 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
2. 如果参数有且仅有一个,那么小括号可以省略
3. 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字
*/
public class Demo01_省略模式 {
public static void main(String[] args) {
//演示: 1. 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
//useFlyable((String s) -> {
useFlyable((s) -> { //参数类型可以省略
System.out.println(s);
System.out.println("适合开飞机进行自驾游!");
});
System.out.println("------------------"); //useAddable((int x,int y) -> {
//useAddable((x,int y) -> { //报错, 有多个参数的情况下,不能只省略一个
useAddable((x,y) -> {
return x + y;
});
System.out.println("------------------"); //演示: 2. 如果参数有且仅有一个,那么小括号可以省略
useFlyable(s -> { //小括号可以省略
System.out.println(s);
System.out.println("适合开飞机进行自驾游!");
});
System.out.println("------------------"); //演示: 3. 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字
useEatable(() -> System.out.println("动物会吃!")); //多态, 父接口引用指向子类对象(Lambda表达式会帮我们创建)
Addable a = (x, y) -> x + y;
useAddable((x, y) -> x + y);
} //定义方法, 接收Eatable对象.
public static void useEatable(Eatable e) {
e.eat();
} //定义方法, 接收Flyable对象.
public static void useFlyable(Flyable f) {
f.fly("风和日丽, 晴空万里!");
} //定义方法, 接收Addable对象.
public static void useAddable(Addable a) {
int sum = a.add(11, 22);
System.out.println(sum);
}
}
package com.it.demo03_exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /*
案例: 异常入门. 异常简介:
概述:
Java中, 把程序出现不正常的情况统称为: 异常.
分类:
Throwable: 异常体系的顶层类.
Error: 表示错误, 一般和我们的代码没关系, 也不需要我们处理, 你也处理不了.
服务器宕机, 数据库崩溃.
Exception: 表示异常, 这个才是我们常说的异常, 需要程序员处理.
编译期异常: 发生在编译期间的异常.
非RuntimeException及其子类都是: 编译期异常.
运行时异常: 当程序运行之后, 才会出现的异常.
RuntimeException及其子类都是: 运行时异常.
JVM的默认处理异常的方式:
1. 会将异常的类型, 出现的原因以及异常出现的位置打印到控制台上.
2. 并终止程序的执行. */
public class Demo01 {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println(a / b); //运行时异常.
System.out.println("看看我执行了吗?"); //SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
//String s = "2020/08/02";
//Date date = sdf.parse(s); //编译期异常.
}
}
package com.it.demo03_exception;

/*
案例: 演示如何自己处理异常. 异常的处理方式:
方式一: try.catch.finally语句, 捕获异常.
格式:
try{
//这里写的是可能出现问题的代码.
}catch(异常类型 对象名) {
e.printStackTrace(); //该方法会将异常的类型, 原因, 位置打印到控制台上.
} finally{
//正常情况下, 这里的代码永远会执行, 一般是用来释放资源的.
}
特点:
1. try.catch.finally处理完异常之后, 程序会继续执行.
2. 先走try,
如果代码没有出问题, 当try执行完后, 会执行finally里边的内容.
如果代码有问题, 会立马跳到catch语句中执行, catch执行完毕后, 会执行finally里边的内容. 方式二: throws处理, 表示 声明抛出异常.
*/
public class Demo02 {
public static void main(String[] args) {
try{
//这里写的是可能出现问题的代码.
int a = 10;
int b = 0;
System.out.println(a / b);
System.out.println("看看我执行了吗? try语句...");
}catch(Exception e) {
e.printStackTrace(); //该方法会将异常的类型, 原因, 位置打印到控制台上.
} finally{
//正常情况下, 这里的代码永远会执行, 一般是用来释放资源的.
System.out.println("我是finally, 我是释放资源的");
} System.out.println("看看我执行了吗? try走完了.");
}
}
package com.it.demo03_exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /*
案例: 演示 throws声明抛出异常. 特点:
会将异常的类型, 原因, 以及异常出现的位置打印到控制台上, 并终止程序的执行.
*/
public class Demo03 {
public static void main(String[] args) { //调用者, 买西瓜的.
//调用show()方法
try {
show();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("看看我执行了吗? ");
} //定义show()方法
public static void show() throws Exception{ //被调用者, 卖西瓜的.
//方式一: try.catch处理, 调用者无需处理了.
/* try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String s = "2020/08/02";
//遇到异常了, 请问, 怎么办?
Date date = sdf.parse(s); //编译期异常.
System.out.println(date);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("我是释放资源的");
}*/ //方式二: 声明抛出异常, 即: 告诉调用者我这里有问题, 但是我不处理, 交给调用者处理.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String s = "2020年08月02日";
//遇到异常了, 请问, 怎么办?
Date date = sdf.parse(s); //编译期异常.
System.out.println(date);
}
}
package com.it.demo03_exception;

/*
案例: 演示关于异常的两个小问题 思考题如下:
1.final, finally, finalize三个关键字之间的区别是什么?
final: 最终. //Day07
finally: 释放资源.
finalize: 是Object类中的一个方法, 当对象变成垃圾的时候, 由GC调用该对象的此方法, 来回收对象. 2.finally里边的代码真的永远会执行吗?
是的, 正常情况下永远会执行. 当然非正常情况也存在, 例如: 还没有来得及执行finally呢, 程序退出了, 或者断电了,
则finally里边的代码就不会执行了.
*/
public class Demo04 {
public static void main(String[] args) {
try {
//可能出问题的代码.
int a = 10;
int b = 0;
System.out.println(a / b); //运行时异常.
System.out.println("看看我执行了吗?");
} catch (Exception e) {
//出现问题后的解决方案
e.printStackTrace();
//System.err.println("给夯哥发短信, 说程序有问题..."); System.exit(0); //退出正在执行的JVM,
} finally {
System.out.println("我一般是用来: 释放资源的");
}
}
}
package cn.it.demo;
/*
* Throwable
* Exception 异常 感冒,阑尾炎
* 将异常处理掉,可以继续执行
* RuntimeException
* Error 非典,艾滋,癌
* 必须修改程序
*/
public class Demo {
public static void main(String[] args) {
/*int[] arr = new int[99999999];
System.out.println(arr[3]);*/ } }
package cn.it.demo;
/*
* 异常中的关键字
* throw,在方法内部,抛出异常的对象
* throw 后面,必须写new 对象,必须是异常的对象,必须是Exception或者子类
*
* 方法中声明异常关键字
* throws 用于在方法的声明上,标明次方法,可能出现异常
* 请调用者处理
* throws 后面必须写异常类的类名
*
* 调用了一个抛出异常的方法,调用者就必须处理
* 不处理,编译失败
*/
public class ExceptionDemo {
public static void main(String[] args) throws Exception {
int[] arr = {};
int i = getArray(arr);
System.out.println(i);
}
//对数组的最后索引*2,返回
public static int getArray(int[] arr) throws Exception {
//对方法参数进行合法性的判断,进行判断是不是null
if( arr == null){
//抛出异常的形式,告诉调用者
//关键字 throw
throw new Exception("传递数组不存在");
} //对数组进行判断,判断数组中,是不是有元素
if(arr.length == 0){
//抛出异常的形式,告诉调用者,数组没有元素
throw new Exception("数组中没任何元素");
}
int i = arr[arr.length-1];
return i*2;
}
}
package cn.it.demo;
/*
* 异常的处理方式:
* try...catch...finally
* 格式:
* try{
* 被检测的代码
* 可能出现异常的代码
* }catch(异常类名 变量){
* 异常的处理方式
* 循环,判断,调用方法,变量
* }finally{
* 必须要执行代码
* }
*/
public class ExceptionDemo1 {
public static void main(String[] args) {
int[] arr = null;
try{
int i = getArray(arr);
System.out.println(i); }catch(NullPointerException ex){
System.out.println("###"+ex); }catch(ArrayIndexOutOfBoundsException ex){ System.out.println("!!!!!!"+ex);
}
System.out.println("Game Over");
}
/*
* 定义方法,抛出异常
* 调用者使用try catch
*/
public static int getArray(int[] arr)throws NullPointerException,ArrayIndexOutOfBoundsException{
//对数组判空
if( arr == null){
//手动抛出异常,抛出空指针异常
throw new NullPointerException("数组不存在");
}
//对数组的索引进行判断
if( arr.length < 3){
//手动抛出异常,抛出数组的索引越界异常
throw new ArrayIndexOutOfBoundsException("数组没有3索引");
}
return arr[3]+1;
}
}
package cn.it.demo;

import java.util.NoSuchElementException;

/*
* 多catch写在一起
* 细节:
* catch小括号中,写的是异常类的类名
* 有没有顺序的概念,有
*
* 平级异常: 抛出的异常类之间,没有继承关系,没有顺序
* NullPointerException extends RuntimeException
* NoSuchElementException extends RuntimeException
* ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException extends RuntimeException
*
* 上下级关系的异常
* NullPointerException extends RuntimeException extends Exception
* 越高级的父类,写在下面
*/
public class ExceptionDemo2 {
public static void main(String[] args) {
try{ }catch(NullPointerException ex){ }
catch(Exception ex){ }
}
public static void function(int a)throws NullPointerException,Exception{
if(a == 0){
throw new NullPointerException();
}
if(a == 1){
throw new Exception();
}
}
}
package cn.it.demo;
/* try{
* 被检测的代码
* 可能出现异常的代码
* }catch(异常类名 变量){
* 异常的处理方式
* 循环,判断,调用方法,变量
* }finally{
* 必须要执行代码
* }
* finally,无论程序是否有异常出现,程序必须执行
* 释放资源
*/
public class ExceptionDemo3 {
public static void main(String[] args) {
try{
function(0);
}catch(Exception ex){
System.out.println(ex); }finally{
System.out.println("代码必须执行");
}
} public static void function(int a)throws Exception{
if( a == 0)
throw new Exception();
System.out.println(a);
} }
package cn.it.demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class ExceptionDemo4 {
public static void main(String[] args) {
try{
function();
}catch(ParseException ex){ }
} public static void function()throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("2088-8-8");
System.out.println(date);
}
}
package cn.it.demo1;
/*
* 异常分为编译异常和运行时期异常
* 编译异常: 调用了抛出异常的方法,不处理编译失败 (try throws)
* 运行异常: 抛出的异常是RuntimeException类,或者是他的子类
*
* 运行异常的特点:
* 方法内部抛出的异常是运行异常, new XXXException
* 方法的声明上,不需要throws语句,调用者,不需要处理
* 设计原因:
* 运行异常,不能发生,但是如果发生了,程序人员停止程序修改源代码
*
* 运行异常: 一旦发生,不要处理,请你修改源代码, 运行异常一旦发生,后面的代码没有执行的意义
*/
public class RuntimeExceptionDemo {
public static void main(String[] args) {
double d = getArea(1);
System.out.println(d);
} /*
* 定义方法,计算圆形的面积
* 传递参数0,或者负数,计算的时候没有问题
* 但是,违反了真实情况
* 参数小于=0, 停止程序,不要在计算了
*/
public static double getArea(double r){
if(r <= 0)
throw new RuntimeException("圆形不存在");
return r*r*Math.PI;
} public static void function(){
int[] arr = {1,2,3};
//对数组的5索引进行判断,如果5索引大于100,请将5索引上的数据/2,否则除以3
//索引根本就没有
if(arr[5] > 100){
arr[5] = arr[5]/2;
}else{
arr[5] = arr[5]/3;
}
}
}
package cn.it.demo2;
/*
* 继承后,在子类重写父类方法的时候,异常处理
* 结论:
* 父类的方法,如果抛出异常,子类重写后
* 可以不抛出异常
* 也可以抛出异常,但是,如果子类要抛,抛出的异常不能大于父类的异常
* 大于,都指的是继承关系
*
* 父类的方法,没有异常抛出,子类重写后
* 也不能抛出异常
* 如果子类中调用了抛出异常的方法,别无选择,只能try..catch处理
*/
public class ExceptionDemo {
public static void main(String[] args) {
Fu f = new Zi();
f.function();
}
} class Fu{
public void function(){ }
}
class Zi extends Fu{
public void function(){ try {
method();
} catch (Exception e) { e.printStackTrace();
} }
public void method()throws Exception{ }
}
package cn.it.demo2;
/*
* Throwable类中的方法
* 三个方法,都和异常的信息有关系
* String getMessage() 对异常信息的详细描述 异常了!
* String toString() 对异常信息的简短描述 java.lang.Exception: 异常了!
* void printStackTrace() 将异常信息追踪到标准的错误流 异常信息最全,JVM默认调用方法也是这个方法
*/
public class ExceptionDemo1 {
public static void main(String[] args) {
try{
function();
}catch(Exception ex){
//System.out.println(ex.toString());
ex.printStackTrace();
}
} public static void function() throws Exception{
throw new Exception("异常了!");
}
}
package cn.it.demo3;

public class ExceptionDemo {
public static void main(String[] args) { int avg = getAvg(50,60,-70,80);
System.out.println(avg); }
/*
* 传递成绩,计算成绩的平均数
* 成绩没有负数,需要抛出异常,停止运算
*/
public static int getAvg(int...source){
int sum = 0 ;
for(int s : source){
if( s < 0){
throw new FuShuException("成绩错误 "+s);
}
sum = sum + s;
}
return sum/source.length;
}
}
package cn.it.demo3;
/*
* 自定义异常
* 继承Exception,或者继承RuntimeException
* 构造方法中,super将异常信息,传递给父类
*/
public class FuShuException extends RuntimeException{
public FuShuException(String s){
super(s);
} public FuShuException(){}
}
package com.it.demo04_file;

import java.io.File;

/*
案例: File类入门. File类简介:
概述:
它是用来描述文件(夹)的, 通过 路径的形式进行描述.
大白话翻译: File表示 文件(夹)的路径.
构造方法:
public File(String pathName); 根据给定的目录, 获取其对应的File对象.
public File(String parent, String child); 根据给定的字符串形式的父目录 和 子目录名, , 获取其对应的File对象.
public File(File parent, String child); 根据给定的File对象形式的父目录 和 子目录名, , 获取其对应的File对象.
细节:
为什么要设计这么多的构造方法呢?
就是为了满足用户灵活多变的需求, 在不同的场景下, 有不同的构造方法可以选择.
*/
public class Demo01 {
public static void main(String[] args) {
//需求: 定义File对象, 描述: d:/abc/1.txt
//方式一: public File(String pathName); 根据给定的目录, 获取其对应的File对象.
File file1 = new File("d:/abc/1.txt");
//File file1 = new File("d:\\abc\\1.txt"); //方式二: public File(String parent, String child); 根据给定的字符串形式的父目录 和 子目录名, , 获取其对应的File对象.
File file2 = new File("d:/abc", "1.txt"); //方式三: public File(File parent, String child); 根据给定的File对象形式的父目录 和 子目录名, , 获取其对应的File对象.
File file3 = new File("d:/abc");
File file4 = new File(file3, "1.txt"); //打印结果:
System.out.println("file1: " + file1);
System.out.println("file2: " + file2);
System.out.println("file4: " + file4);
}
}
package com.it.demo04_file;

import java.io.File;
import java.io.IOException; /*
案例: 演示File类的创建功能. 涉及到的File类中的成员方法:
public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
public boolean mkdir() 创建由此抽象路径名命名的目录, 创建单级目录
make directory: 制造文件夹
public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录, 能创建单级目录, 也能创建多级目录. 细节:
1. 上述三个方法都是, 文件(夹)不存在就创建, 返回true, 存在就不创建, 返回false.
2. 创建文件时, 要求其父目录必须存在.
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
//需求1: 创建 d:/abc/1.txt文件
File file1 = new File("d:/abc/1.txt");
System.out.println(file1.createNewFile());
System.out.println("--------------------"); /*File file2 = new File("d:/aaa/1.txt");
System.out.println(file2.createNewFile()); //报错, 创建文件时, 要求其父目录必须存在.*/ //需求2: 创建 d:/aa 文件夹
File file2 = new File("d:/aa");
System.out.println(file2.mkdir()); //创建单级目录 /*File file3 = new File("d:/aa/bb/cc");
System.out.println(file3.mkdir()); //false, 因为mkdir()只能创建单级目录.
*/
System.out.println("--------------------"); //需求3: 创建 d:/aa/bb/cc/dd 文件夹
File file3 = new File("d:/aa/bb/cc/dd");
System.out.println(file3.mkdirs()); //创建多级目录(也能创建单级目录)
}
}
package com.it.demo04_file;

import java.io.File;

/*
案例: 演示File类的判断功能 涉及到的File类的成员方法:
public boolean isDirectory() 测试此抽象路径名表示的File是否为(存在的)目录
public boolean isFile() 测试此抽象路径名表示的File是否为(存在的)文件
public boolean exists() 测试此抽象路径名表示的File是否存在
细节:
isDirectory(), isFile()方法都默认包含了 exists()方法的功能.
*/
public class Demo03 {
public static void main(String[] args) {
//需求1: 测试 public boolean exists() 测试此抽象路径名表示的File是否存在
File file1 = new File("d:/abc/1.txt");
System.out.println(file1.exists()); //判断文件(夹)是否存在的.
System.out.println("-------------------"); //需求2: 测试public boolean isFile() 测试此抽象路径名表示的File是否为(存在的)文件
File file2 = new File("d:/abc/123.txt");
System.out.println(file2.isFile()); //要求: 1. 必须是文件. 2. 必须是存在的文件. 才会返回true,其他都返回false
System.out.println("-------------------"); //需求3: public boolean isDirectory() 测试此抽象路径名表示的File是否为(存在的)目录
File file3 = new File("d:/abc");
System.out.println(file3.isDirectory()); //要求: 1. 必须是文件夹. 2. 必须是存在的文件夹. 才会返回true,其他都返回false }
}
package com.it.demo04_file;

import java.io.File;

/*
案例: 演示File类的获取功能. 涉及到的File类的成员方法:
public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串
public String getPath() 将此抽象路径名转换为路径名字符串
public String getName() 返回由此抽象路径名表示的文件或目录的名称
public String[] list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组 绝对路径和相对路径的区别:
绝对路径: 固定的, 写"死"的路径, 即: 以盘符开头的路径.
例如: c:/abc/1.txt
相对路径: 指的是相对于某个路径来讲的, 默认的相对路径都是: 当前项目的路径.
例如: 1.txt, 其实他是当前项目下的1.txt, 即: 当前项目路径/1.txt
*/
public class Demo04 {
public static void main(String[] args) {
//测试: public String getAbsolutePath() 获取绝对路径.
File file1 = new File("d:/abc/123.txt"); //文件不存在也不会报错.
File file2 = new File("123.txt");
System.out.println(file1.getAbsolutePath());
System.out.println(file2.getAbsolutePath());
System.out.println("------------------------------"); //测试: public String getPath() 创建文件的时候用什么路径, 就获取什么路径, 一般是获取相对路径的.
System.out.println(file1.getPath());
System.out.println(file2.getPath());
System.out.println("------------------------------"); //测试: public String getName() 获取文件(夹)的名字
System.out.println(file1.getName());
System.out.println("------------------------------"); //测试: public String[] list() 获取指定目录下的文件(夹)的 名称字符串数组, 大白话翻译: 获取的是子文件(夹)的名字.
File file3 = new File("D:\\Compile\\abc");
String[] listNames = file3.list();
for (String listName : listNames) {
//listName: 就是file3目录下 每个文件(夹)的名字.
System.out.println(listName);
}
System.out.println("------------------------------"); //测试: public File[] listFiles() 获取指定目录下的文件(夹)的 File对象数组, 大白话翻译: 获取的是子文件(夹)的File对象形式.
File[] listFiles = file3.listFiles();
for (File listFile : listFiles) {
System.out.println(listFile);
}
}
}
package com.it.demo04_file;

import java.io.File;

/*
案例: 演示File类的删除功能 涉及到的File类的成员方法:
public boolean delete() 删除由此抽象路径名表示的文件或目录 细节:
1. Java中的删除不走回收站, 而是直接删除的.
2. 要删除的文件夹必须为空文件夹, 如果是文件, 则可以直接删除.
*/
public class Demo05 {
public static void main(String[] args) {
//需求1: 删除 d:/abc/1.txt
File file1 = new File("d:/abc/1.txt");
System.out.println(file1.delete());
System.out.println("-------------------"); //需求2: 删除 d:/abc文件夹
File file2 = new File("d:/abc");
System.out.println(file2.delete());
}
}
package cn.it.demo;

import java.io.File;

/*
* java.io.File
* 将操作系统中的,文件,目录(文件夹),路径,封装成File对象
* 提供方法,操作系统中的内容
* File与系统无关的类
* 文件 file
* 目录 directory
* 路径 path
*/
public class FileDemo {
public static void main(String[] args) {
//File类静态成员变量
//与系统有关的路径分隔符
String separator = File.pathSeparator;
System.out.println(separator);// 是一个分号,目录的分割 Linux : //与系统有关的默认名称分隔符
separator = File.separator;
System.out.println(separator);// 向右 \ 目录名称分割 Linux /
}
}
package cn.it.demo;

import java.io.File;

/*
* File类的构造方法
* 三种重载形式
*/
public class FileDemo1 {
public static void main(String[] args) {
function_2();
}
/*
* File(File parent,String child)
* 传递路径,传递File类型父路径,字符串子路径
* 好处: 父路径是File类型,父路径可以直接调用File类方法
*/
public static void function_2(){
File parent = new File("d:");
File file = new File(parent,"eclipse");
System.out.println(file);
} /*
* File(String parent,String child)
* 传递路径,传递字符串父路径,字符串子路径
* 好处: 单独操作父路径和子路径
*/
public static void function_1(){
File file = new File("d:","eclipse");
System.out.println(file);
} /*
* File(String pathname)
* 传递路径名: 可以写到文件夹,可以写到一个文件
* c:\\abc c:\\abc\\Demo.java
* 将路径封装File类型对象
*/
public static void function(){
File file = new File("d:\\eclipse");
System.out.println(file);
}
}
package cn.it.demo;

import java.io.File;
import java.io.IOException; /*
* File类的创建和删除功能
* 文件或者是目录
*/
public class FileDemo2 {
public static void main(String[] args)throws IOException {
function_2();
}
/*
* File类的删除功能
* boolean delete()
* 删除的文件或者是文件夹,在File构造方法中给出
* 删除成功返回true,删除失败返回false
* 删除方法,不走回收站,直接从硬盘中删除
* 删除有风险,运行需谨慎
*/
public static void function_2(){
File file = new File("c:\\a.txt");
boolean b = file.delete();
System.out.println(b);
} /*
* File创建文件夹功能
* boolean mkdirs() 创建多层文件夹
* 创建的路径也在File构造方法中给出
* 文件夹已经存在了,不在创建
*/
public static void function_1(){
File file = new File("c:\\abc");
boolean b = file.mkdirs();
System.out.println(b);
} /*
* File创建文件的功能
* boolean createNewFile()
* 创建的文件路径和文件名,在File构造方法中给出
* 文件已经存在了,不在创建
*/
public static void function()throws IOException{
File file = new File("c:\\a.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
}
package cn.it.demo;

import java.io.File;

/*
* File类的获取功能
*/
public class FileDemo3 {
public static void main(String[] args) {
function_3();
}
/*
* File类的获取功能
* String getParent() 返回String对象
* File getParentFile()返回File对象
* 获取父路径
*/
public static void function_3(){
File file = new File("d:\\eclipse\\eclipse.exe");
File parent = file.getParentFile();
System.out.println(parent);
} /*
* File类获取功能
* String getAbsolutePath() 返回String对象
* File getAbsoluteFile() 返回File对象
* 获取绝对路径
* eclipse环境中,写的是一个相对路径,绝对位置工程根目录
*/
public static void function_2(){
File file = new File("src");
File absolute = file.getAbsoluteFile();
System.out.println(absolute);
} /*
* File类获取功能
* long length()
* 返回路径中表示的文件的字节数
*/
public static void function_1(){
File file = new File("d:\\eclipse\\eclipse.exe");
long length = file.length();
System.out.println(length);
} /*
* File类的获取功能
* String getName()
* 返回路径中表示的文件或者文件夹名
* 获取路径中的最后部分的名字
*/
public static void function(){
File file = new File("d:\\eclipse\\eclipse.exe");
String name = file.getName();
System.out.println(name); /*String path = file.getPath();
System.out.println(path);*/
// System.out.println(file);
}
}
package cn.it.demo;

import java.io.File;

/*
* File类的判断功能
*/
public class FileDemo4 {
public static void main(String[] args) {
function_1();
}
/*
* File判断功能
* boolean isDirectory()
* 判断File构造方法中封装的路径是不是文件夹
* 如果是文件夹,返回true,不是文件返回false
*
* boolean isFile()
* 判断File构造方法中封装的路径是不是文件
*/
public static void function_1(){
File file = new File("d:\\eclipse\\eclipse.exe");
if(file.exists()){
boolean b = file.isDirectory();
System.out.println(b);
}
} /*
* File判断功能
* boolean exists()
* 判断File构造方法中封装路径是否存在
* 存在返回true,不存在返回false
*/
public static void function(){
File file = new File("src");
boolean b = file.exists();
System.out.println(b);
}
}
package cn.it.demo1;

import java.io.File;

/*
* File类获取功能
* list
* listFiles
*/
public class FileDemo {
public static void main(String[] args) {
function_2();
}
public static void function_2(){
//获取系统中的所有根目录
File[] fileArr = File.listRoots();
for(File f : fileArr){
System.out.println(f);
}
} /*
* File类的获取功能
* File[] listFiles()
* 获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
* 返回的是目录或者文件的全路径
*/
public static void function_1(){
File file = new File("d:\\eclipse");
File[] fileArr = file.listFiles();
for(File f : fileArr){
System.out.println(f);
}
} /*
* File类的获取功能
* String[] list()
* 获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
* 返回只有名字
*/
public static void function(){
File file = new File("c:");
String[] strArr = file.list();
System.out.println(strArr.length);
for(String str : strArr){
System.out.println(str);
}
}
}
package cn.it.demo1;

import java.io.File;

/*
* File类的获取,文件获取过滤器
* 遍历目录的时候,可以根据需要,只获取满足条件的文件
* 遍历目录方法 listFiles()重载形式
* listFiles(FileFilter filter)接口类型
* 传递FileFilter接口的实现类
* 自定义FileFilter接口实现类,重写抽象方法,
* 接口实现类对象传递到遍历方法listFiles
*/
public class FileDemo1 {
public static void main(String[] args) {
File file = new File("c:\\demo");
File[] fileArr = file.listFiles(new MyFilter());
for(File f : fileArr){
System.out.println(f);
}
}
}
package cn.it.demo1;

import java.io.File;
import java.io.FileFilter; /*
* 自定义过滤器
* 实现FileFilter接口,重写抽象方法
*/
public class MyFilter implements FileFilter{
public boolean accept(File pathname) {
/*
* pathname 接受到的也是文件的全路径
* c:\\demo\\1.txt
* 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
* 文件的后缀结尾是.java
*/
//String name = pathname.getName();
return pathname.getName().endsWith(".java"); }
}
package cn.it.demo2;
/*
* 方法的递归调用
* 方法自己调用自己
* 适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
* 注意:
* 递归一定要有出口, 必须可以让程序停下
* 递归次数不能过多
* 构造方法,禁止递归
*/
public class DiGuiDemo {
public static void main(String[] args) {
/*int sum = getSum(3);
System.out.println(sum);*/
System.out.println(getJieCheng(5));
System.out.println(getFBNQ(12));
}
/*
* 方法递归,计算斐波那契数列
*
*/
public static int getFBNQ(int month){
if( month == 1)
return 1;
if( month == 2)
return 1;
return getFBNQ(month-1)+getFBNQ(month-2);
} /*
* 计算阶乘 5!
* 5*4*3*2*1
*/
public static int getJieCheng(int n){
if ( n == 1)
return 1;
return n * getJieCheng(n-1);
} /*
* 计算 1+2+3+100和 = 5050
* 计算规律:
* n+(n-1)+(n-2)
* 100+(100-1)+(99-1)+...1
*/
public static int getSum(int n){
if( n == 1)
return 1;
return n + getSum(n-1);
} }
package cn.it.demo2;

import java.io.File;

/*
* 对一个目录的下的所有内容,进行完全的遍历
* 编程技巧,方法的递归调用,自己调用自己
*/
public class FileDemo {
public static void main(String[] args) {
File dir = new File("d:\\eclipse");
getAllDir(dir);
}
/*
* 定义方法,实现目录的全遍历
*/
public static void getAllDir(File dir){
System.out.println(dir);
//调用方法listFiles()对目录,dir进行遍历
File[] fileArr = dir.listFiles();
for(File f : fileArr){
//判断变量f表示的路径是不是文件夹
if(f.isDirectory()){
//是一个目录,就要去遍历这个目录
//本方法,getAllDir,就是给个目录去遍历
//继续调用getAllDir,传递他目录
getAllDir(f);
}else{
System.out.println(f);
}
}
}
}
package cn.it.demo2;

import java.io.File;

/*
* 遍历目录,获取目录下的所有.java文件
* 遍历多级目录,方法递归实现
* 遍历的过程中,使用过滤器
*/
public class FileDemo1 {
public static void main(String[] args) {
getAllJava(new File("c:\\demo"));
// new File("c:\\demo").delete();
}
/*
* 定义方法,实现遍历指定目录
* 获取目录中所有的.java文件
*/
public static void getAllJava(File dir){
//调用File对象方法listFiles()获取,加入过滤器
File[] fileArr = dir.listFiles(new MyJavaFilter());
for(File f : fileArr){
//对f路径,判断是不是文件夹
if(f.isDirectory()){
//递归进入文件夹遍历
getAllJava(f);
}else{
System.out.println(f);
}
}
}
}
package cn.it.demo2;

import java.io.File;
import java.io.FileFilter; public class MyJavaFilter implements FileFilter {
public boolean accept(File pathname) {
//判断获取的是目录,直接返回true
if(pathname.isDirectory())
return true;
return pathname.getName().toLowerCase().endsWith(".java");
} }
package cn.it.copy;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; /*
* 字节流复制文件
* 采用数组缓冲提高效率
* 字节数组
* FileInputStream 读取字节数组
* FileOutputStream 写字节数组
*/
public class Copy_1 {
public static void main(String[] args) {
long s = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream("c:\\t.zip");
fos = new FileOutputStream("d:\\t.zip");
//定义字节数组,缓冲
byte[] bytes = new byte[1024*10];
//读取数组,写入数组
int len = 0 ;
while((len = fis.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件复制失败");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}
}
}
long e = System.currentTimeMillis();
System.out.println(e-s);
}
}
package cn.it.copy;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; /*
* 字符流复制文本文件,必须文本文件
* 字符流查询本机默认的编码表,简体中文GBK
* FileReader读取数据源
* FileWriter写入到数据目的
*/
public class Copy_2 {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("c:\\1.txt");
fw = new FileWriter("d:\\1.txt");
char[] cbuf = new char[1024];
int len = 0 ;
while(( len = fr.read(cbuf))!=-1){
fw.write(cbuf, 0, len);
fw.flush();
} }catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("复制失败");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}
}
}
}
}
package cn.it.copy;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; /*
* 将数据源 c:\\a.txt
* 复制到 d:\\a.txt 数据目的
* 字节输入流,绑定数据源
* 字节输出流,绑定数据目的
*
* 输入,读取1个字节
* 输出,写1个字节
*/
public class Copy {
public static void main(String[] args) {
//定义两个流的对象变量
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//建立两个流的对象,绑定数据源和数据目的
fis = new FileInputStream("c:\\t.zip");
fos = new FileOutputStream("d:\\t.zip");
//字节输入流,读取1个字节,输出流写1个字节
int len = 0 ;
while((len = fis.read())!=-1){
fos.write(len);
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件复制失败");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}
}
}
}
}
package com.it.demo05_outputstream;

/*
案例: IO流简介, 本类中只有文字, 没有代码. IO流简介:
概述:
IO流也叫输入(Input)/输出(Output)流, 它是用来进行文件传输, 拷贝文件等工作的.
应用场景:
文件上传
文件下载
文件拷贝
分类:
按照流向分:
输入流: 读取数据的.
输出流: 写数据的.
按照操作分:
字节流: 以字节为单位来操作数据, 也叫"万能流", 因为它能操作任意类型的数据.
字节输入流: 以字节为单位 读取 数据, 顶层抽象类是: InputStream
常用的子类如下:
普通的字节输入流: FileInputStream
高效的字节输入流: BufferedInputStream
字节输出流: 以字节为单位 写 数据, 顶层抽象类是: OutputStream
常用的子类如下:
普通的字节输出流: FileOutputStream
高效的字节输出流: BufferedOutputStream 字符流; 以字符为单位来操作数据, 只能操作纯文本文件.
字符输入流: 以字符为单位 读取 数据, 顶层抽象类是: Reader
常用的子类如下:
普通的字符输入流: FileReader
高效的字符输入流: BufferedReader
字符输出流: 以字符为单位 写 数据, 顶层抽象类是: Writer
常用的子类如下:
普通的字符输出流: FileWriter
高效的字符输出流: BufferedWriter 关于字节流和字符流的选择问题:
当一个文件能用微软自带的记事本打开, 并且里边的内容你也能看懂的时候, 就可以考虑使用字符流了,
否则使用字节流.
*/
public class Demo01 {
public static void main(String[] args) { }
}
package com.it.demo05_outputstream;

import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 字节输出流入门. 需求:
1.创建FileOutputStream对象, 关联指定的目的地文件.
2.往文件中写入字符'a', 'b', 'c'. 普通的字节输出流简介:
概述:
普通的字节输出流指的是FileOutputStream, 它是以 字节 为单位往文件中 写数据的.
构造方法:
public FileOutputStream(String pathName); 创建字节输出流对象, 关联目的地文件(字符串形式), 会覆盖文件中的内容.
public FileOutputStream(File pathName); 创建字节输出流对象, 关联目的地文件(File对象形式), 会覆盖文件中的内容. public FileOutputStream(String pathName, boolean append); 创建字节输出流对象, 关联目的地文件(字符串形式), 第二个参数值如果为true, 表示往文件中追加数据.
public FileOutputStream(File pathName, boolean append); 创建字节输出流对象, 关联目的地文件(File对象形式), 第二个参数值如果为true, 表示往文件中追加数据. 成员方法:
public void write(int ch); 一次写一个字节
public void write(byte[] bys); 一次写一个字节数组
public void write(byte[] bys, int start, int len); 一次写一个字节数组的一部分.
public void close(); 关闭流对象, 释放资源.
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
//1. 创建输出流, 关联目的地文件.
/*
细节:
1. 目的地文件不存在, 程序会自动创建.
2. 目的地文件的父目录必须存在.
*/
FileOutputStream fos = new FileOutputStream("day11/data/1.txt"); //2. 往文件中写数据.
//方式一: 一次写一个字节
fos.write(97);
fos.write(98);
fos.write(99); //3. 关流, 释放资源.
fos.close();
}
}
package com.it.demo05_outputstream;

import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 字节输出流写数据的三种方式. 需求:
1.创建FileOutputStream对象, 关联指定的目的地文件.
2.往文件中写入字符'a', 'b', 'c'. 普通的字节输出流简介:
概述:
普通的字节输出流指的是FileOutputStream, 它是以 字节 为单位往文件中 写数据的.
构造方法:
public FileOutputStream(String pathName); 创建字节输出流对象, 关联目的地文件(字符串形式), 会覆盖文件中的内容.
public FileOutputStream(File pathName); 创建字节输出流对象, 关联目的地文件(File对象形式), 会覆盖文件中的内容. public FileOutputStream(String pathName, boolean append); 创建字节输出流对象, 关联目的地文件(字符串形式), 第二个参数值如果为true, 表示往文件中追加数据.
public FileOutputStream(File pathName, boolean append); 创建字节输出流对象, 关联目的地文件(File对象形式), 第二个参数值如果为true, 表示往文件中追加数据. 成员方法:
public void write(int ch); 一次写一个字节
public void write(byte[] bys); 一次写一个字节数组
public void write(byte[] bys, int start, int len); 一次写一个字节数组的一部分.
public void close(); 关闭流对象, 释放资源.
*/
public class Demo03 {
public static void main(String[] args) throws IOException {
//1. 创建输出流, 关联目的地文件.
/*
细节:
1. 目的地文件不存在, 程序会自动创建.
2. 目的地文件的父目录必须存在.
*/
FileOutputStream fos = new FileOutputStream("day11/data/1.txt"); //2. 往文件中写数据.
//方式一: 一次写一个字节
/*fos.write(97);
fos.write(98);
fos.write(99);*/ //方式二: 一次一个字节数组
/*byte[] bys = {65, 66, 67, 68, 69}; //ABCDE
fos.write(bys);*/ //方式三: 一次一个字节数组的一部分 //CD
byte[] bys = {65, 66, 67, 68, 69};
fos.write(bys, 2, 2); //3. 关流, 释放资源.
fos.close();
}
}
package com.it.demo05_outputstream;

import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 演示关于IO流的两个小问题 问题1: 如何换行?
写入 \r\n 即可 问题2: 如何追加数据?
创建输出流的时候, 第二个参数传入 true 即可.
true: 追加. false: 不追加. 需求:
1.创建FileOutputStream对象, 关联指定的目的地文件.
2.往文件中写入10次hello, 每个hello占一行.
3.往文件中追加一句话: 键盘敲烂, 月薪过万!
*/
public class Demo04 {
public static void main(String[] args) throws IOException {
//1. 创建输出流, 关联目的地文件.
//FileOutputStream fos = new FileOutputStream("day11/data/1.txt"); //默认是覆盖
FileOutputStream fos = new FileOutputStream("day11/data/1.txt", true); //true: 表示追加 //2. 往文件中写入10次hello, 每个hello占一行.
//String#getBytes()方法的作用: 把字符串转成其对应的 字节数组形式.
/*for (int i = 0; i < 10; i++) {
fos.write("hello".getBytes());
//加入换行
fos.write("\r\n".getBytes());
}*/ //3. 往文件中追加一句话: 键盘敲烂, 月薪过万!
fos.write("键盘敲烂, 月薪过万!".getBytes()); //4. 关流, 释放资源.
fos.close();
}
}
package com.it.demo05_outputstream;

import java.io.FileOutputStream;
import java.io.IOException; //这个是做空文件的, 明天上课还会在详细讲一遍.
public class Demo05 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\Compile\\王兴平(蓝光高清无码).avi");
byte[] bys = new byte[1024]; //1KB = 1023byte for (int i = 0; i < 1024 * 1024; i++) {
fos.write(bys);
}
fos.close();
}
}
package cn.it.demo;

import java.io.FileOutputStream;
import java.io.IOException; /*
* FileOutputStream
* 写入数据文件,学习父类方法,使用子类对象
*
* 子类中的构造方法: 作用:绑定输出的输出目的
* 参数:
* File 封装文件
* String 字符串的文件名
*
* 流对象使用步骤
* 1. 创建流子类的对象,绑定数据目的
* 2. 调用流对象的方法write写
* 3. close释放资源
*
* 流对象的构造方法,可以创建文件,如果文件存在,直接覆盖
*/
public class FileOutputStreamDemo {
public static void main(String[] args)throws IOException {
FileOutputStream fos = new FileOutputStream("c:\\a.txt");
//流对象的方法write写数据
//写1个字节
fos.write(97); //写字节数组
byte[] bytes = {65,66,67,68};
fos.write(bytes); //写字节数组的一部分,开始索引,写几个
fos.write(bytes, 1, 2); //写入字节数组的简便方式
//写字符串
fos.write("hello".getBytes()); //关闭资源
fos.close(); }
}
package cn.it.demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; /*
* FileOutputStream 文件的续写和换行问题
* 续写: FileOutputStream构造方法, 的第二个参数中,加入true
* 在文件中,写入换行,符号换行 \r\n
* \r\n 可以写在上一行的末尾, 也可以写在下一行的开头
*/
public class FileOutputStreamDemo1 {
public static void main(String[] args)throws IOException {
File file = new File("c:\\b.txt");
FileOutputStream fos = new FileOutputStream(file,true);
fos.write("hello\r\n".getBytes());
fos.write("world".getBytes());
fos.close();
}
}
package cn.it.demo;

import java.io.FileOutputStream;
import java.io.IOException; /*
* IO流的异常处理
* try catch finally
*
* 细节:
* 1. 保证流对象变量,作用域足够
* 2. catch里面,怎么处理异常
* 输出异常的信息,目的看到哪里出现了问题
* 停下程序,从新尝试
* 3. 如果流对象建立失败了,需要关闭资源吗
* new 对象的时候,失败了,没有占用系统资源
* 释放资源的时候,对流对象判断null
* 变量不是null,对象建立成功,需要关闭资源
*/
public class FileOutputStreamDemo3 {
public static void main(String[] args) {
//try 外面声明变量,try 里面建立对象
FileOutputStream fos = null;
try{
fos = new FileOutputStream("s:\\a.txt");
fos.write(100);
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件写入失败,重试");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("关闭资源失败");
}
}
}
}
package cn.it.demo;
/*
* 字节输出流
* java.io.OutputStream 所有字节输出流的超类
* 作用: 从Java程序,写出文件
* 字节: 这样流每次只操作文件中的1个字节
* 写任意文件
*
* 方法都是写文入的方法
* write(int b) 写入1个字节
* write(byte[] b) 写入字节数组
* write(byte[] b,int,int)写入字节数组,int 开始写入的索引, int 写几个
* close() 方法,关闭流对象,释放与次流相关的资源
*
* 流对象,操作文件的时候, 自己不做,依赖操作系统
*/
public class OutputStreamDemo { }
package cn.it.demo1;

import java.io.FileInputStream;
import java.io.IOException; /*
* FileInputStream读取文件
*
* 构造方法: 为这个流对象绑定数据源
*
* 参数:
* File 类型对象
* String 对象
* 输入流读取文件的步骤
* 1. 创建字节输入流的子类对象
* 2. 调用读取方法read读取
* 3. 关闭资源
*
* read()方法,
* read()执行一次,就会自动读取下一个字节
* 返回值,返回的是读取到的字节, 读取到结尾返回-1
*/
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("c:\\a.txt");
//读取一个字节,调用方法read 返回int
//使用循环方式,读取文件, 循环结束的条件 read()方法返回-1
int len = 0;//接受read方法的返回值 while( (len = fis.read()) != -1){
System.out.print((char)len);
}
//关闭资源
fis.close();
}
} /*
* int i = fis.read();
System.out.println(i); i = fis.read();
System.out.println(i); i = fis.read();
System.out.println(i); i = fis.read();
System.out.println(i);
*/
package cn.it.demo1;

import java.io.FileInputStream;
import java.io.IOException; /*
* FileInputStream读取文件
* 读取方法 int read(byte[] b) 读取字节数组
* 数组作用: 缓冲的作用, 提高效率
* read返回的int,表示什么含义 读取到多少个有效的字节数
*/
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("c:\\a.txt");
//创建字节数组
byte[] b = new byte[1024]; int len = 0 ;
while( (len = fis.read(b)) !=-1){
System.out.print(new String(b,0,len));
}
fis.close();
}
}
/*
*
int len = fis.read(b);
System.out.println(new String(b));//ab
System.out.println(len);//2 len = fis.read(b);
System.out.println(new String(b));//cd
System.out.println(len);//2 len = fis.read(b);
System.out.println(new String(b));//ed
System.out.println(len);//1 len = fis.read(b);
System.out.println(new String(b));//ed
System.out.println(len);//-1
*/
package cn.it.demo1;
/*
* 字节输入流
* java.io.InputStream 所有字节输入流的超类
* 作用: 读取任意文件,每次只读取1个字节
* 读取的方法 read
* int read() 读取1个字节
* int read(byte[] b) 读取一定量的字节,存储到数组中
*/
public class InputStreamDemo { }
package cn.it.demo2;

import java.io.FileReader;
import java.io.IOException; /*
* 字符输入流读取文本文件,所有字符输入流的超类
* java.io.Reader
* 专门读取文本文件
*
* 读取的方法 : read()
* int read() 读取1个字符
* int read(char[] c) 读取字符数组
*
* Reader类是抽象类,找到子类对象 FileReader
*
* 构造方法: 绑定数据源
* 参数:
* File 类型对象
* String文件名
*/
public class ReaderDemo {
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("c:\\1.txt");
/*int len = 0 ;
while((len = fr.read())!=-1){
System.out.print((char)len);
}*/
char[] ch = new char[1024];
int len = 0 ;
while((len = fr.read(ch))!=-1){
System.out.print(new String(ch,0,len));
} fr.close();
}
}
package cn.it.demo2;

import java.io.FileWriter;
import java.io.IOException; /*
* 字符输出流
* java.io.Writer 所有字符输出流的超类
* 写文件,写文本文件
*
* 写的方法 write
* write(int c) 写1个字符
* write(char[] c)写字符数组
* write(char[] c,int,int)字符数组一部分,开始索引,写几个
* write(String s) 写入字符串
*
* Writer类的子类对象 FileWriter
*
* 构造方法: 写入的数据目的
* File 类型对象
* String 文件名
*
* 字符输出流写数据的时候,必须要运行一个功能,刷新功能
* flush()
*/
public class WriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("c:\\1.txt"); //写1个字符
fw.write(100);
fw.flush(); //写1个字符数组
char[] c = {'a','b','c','d','e'};
fw.write(c);
fw.flush(); //写字符数组一部分
fw.write(c, 2, 2);
fw.flush(); //写如字符串
fw.write("hello");
fw.flush(); fw.close();
}
}
package cn.it.copy;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; /*
* 使用缓冲区流对象,复制文本文件
* 数据源 BufferedReader+FileReader 读取
* 数据目的 BufferedWriter+FileWriter 写入
* 读取文本行, 读一行,写一行,写换行
*/
public class Copy_1 {
public static void main(String[] args) throws IOException{
BufferedReader bfr = new BufferedReader(new FileReader("c:\\w.log"));
BufferedWriter bfw = new BufferedWriter(new FileWriter("d:\\w.log"));
//读取文本行, 读一行,写一行,写换行
String line = null;
while((line = bfr.readLine())!=null){
bfw.write(line);
bfw.newLine();
bfw.flush();
}
bfw.close();
bfr.close();
}
}
package cn.it.copy;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; /*
* 文件复制方式,字节流,一共4个方式
* 1. 字节流读写单个字节 125250 毫秒
* 2. 字节流读写字节数组 193 毫秒 OK
* 3. 字节流缓冲区流读写单个字节 1210 毫秒
* 4. 字节流缓冲区流读写字节数组 73 毫秒 OK
*/
public class Copy {
public static void main(String[] args)throws IOException {
long s = System.currentTimeMillis();
copy_4(new File("c:\\q.exe"), new File("d:\\q.exe"));
long e = System.currentTimeMillis();
System.out.println(e-s);
}
/*
* 方法,实现文件复制
* 4. 字节流缓冲区流读写字节数组
*/
public static void copy_4(File src,File desc)throws IOException{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc));
int len = 0 ;
byte[] bytes = new byte[1024];
while((len = bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
bos.close();
bis.close();
}
/*
* 方法,实现文件复制
* 3. 字节流缓冲区流读写单个字节
*/
public static void copy_3(File src,File desc)throws IOException{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc));
int len = 0 ;
while((len = bis.read())!=-1){
bos.write(len);
}
bos.close();
bis.close();
} /*
* 方法,实现文件复制
* 2. 字节流读写字节数组
*/
public static void copy_2(File src,File desc)throws IOException{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(desc);
int len = 0 ;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
} /*
* 方法,实现文件复制
* 1. 字节流读写单个字节
*/
public static void copy_1(File src,File desc)throws IOException{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(desc);
int len = 0 ;
while((len = fis.read())!=-1){
fos.write(len);
}
fos.close();
fis.close();
}
}
package cn.it.demo;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader; /*
* 转换流
* java.io.InputStreamReader 继承 Reader
* 字符输入流,读取文本文件
*
* 字节流向字符的敲了,将字节流转字符流
*
* 读取的方法:
* read() 读取1个字符,读取字符数组
*
* 技巧: OuputStreamWriter写了文件
* InputStreamReader读取文件
*
* OuputStreamWriter(OuputStream out)所有字节输出流
* InputStreamReader(InputStream in) 接收所有的字节输入流
* 可以传递的字节输入流: FileInputStream
* InputStreamReader(InputStream in,String charsetName) 传递编码表的名字
*/
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
// readGBK();
readUTF();
}
/*
* 转换流,InputSteamReader读取文本
* 采用UTF-8编码表,读取文件utf
*/
public static void readUTF()throws IOException{
//创建自己输入流,传递文本文件
FileInputStream fis = new FileInputStream("c:\\utf.txt");
//创建转换流对象,构造方法中,包装字节输入流,同时写编码表名
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
char[] ch = new char[1024];
int len = isr.read(ch);
System.out.println(new String(ch,0,len));
isr.close();
}
/*
* 转换流,InputSteamReader读取文本
* 采用系统默认编码表,读取GBK文件
*/
public static void readGBK()throws IOException{
//创建自己输入流,传递文本文件
FileInputStream fis = new FileInputStream("c:\\gbk.txt");
//创建转换流对象,构造方法,包装字节输入流
InputStreamReader isr = new InputStreamReader(fis);
char[] ch = new char[1024];
int len = isr.read(ch);
System.out.println(new String(ch,0,len)); isr.close();
}
}
package cn.it.demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter; /*
* 转换流
* java.io.OutputStreamWriter 继承Writer类
* 就是一个字符输出流,写文本文件
* write()字符,字符数组,字符串
*
* 字符通向字节的桥梁,将字符流转字节流
*
* OutputStreamWriter 使用方式
* 构造方法:
* OutputStreamWriter(OuputStream out)接收所有的字节输出流
* 但是: 字节输出流: FileOutputStream
*
* OutputStreamWriter(OutputStream out, String charsetName)
* String charsetName 传递编码表名字 GBK UTF-8
*
* OutputStreamWriter 有个子类, FileWriter
*/
public class OutputStreamWriterDemo {
public static void main(String[] args)throws IOException {
// writeGBK();
writeUTF();
}
/*
* 转换流对象OutputStreamWriter写文本
* 采用UTF-8编码表写入
*/
public static void writeUTF()throws IOException{
//创建字节输出流,绑定文件
FileOutputStream fos = new FileOutputStream("c:\\utf.txt");
//创建转换流对象,构造方法保证字节输出流,并指定编码表是UTF-8
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
osw.write("你好");
osw.close();
} /*
* 转换流对象 OutputStreamWriter写文本
* 文本采用GBK的形式写入
*/
public static void writeGBK()throws IOException{
//创建字节输出流,绑定数据文件
FileOutputStream fos = new FileOutputStream("c:\\gbk.txt");
//创建转换流对象,构造方法,绑定字节输出流,使用GBK编码表
OutputStreamWriter osw = new OutputStreamWriter(fos);
//转换流写数据
osw.write("你好"); osw.close();
}
}
package cn.it.demo1;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException; /*
* 字节输入流的缓冲流
* java.io.BufferedInputStream
* 继承InputStream,标准的字节输入流
* 读取方法 read() 单个字节,字节数组
*
* 构造方法:
* BufferedInputStream(InputStream in)
* 可以传递任意的字节输入流,传递是谁,就提高谁的效率
* 可以传递的字节输入流 FileInputStream
*/
public class BufferedInputStreamDemo {
public static void main(String[] args) throws IOException{
//创建字节输入流的缓冲流对象,构造方法中包装字节输入流,包装文件
BufferedInputStream bis = new
BufferedInputStream(new FileInputStream("c:\\buffer.txt"));
byte[] bytes = new byte[10];
int len = 0 ;
while((len = bis.read(bytes))!=-1){
System.out.print(new String(bytes,0,len));
}
bis.close();
}
}
package cn.it.demo1;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException; /*
* 字节输出流的缓冲流
* java.io.BufferedOuputStream 作用: 提高原有输出流的写入效率
* BufferedOuputStream 继承 OutputStream
* 方法,写入 write 字节,字节数组
*
* 构造方法:
* BufferedOuputStream(OuputStream out)
* 可以传递任意的字节输出流, 传递的是哪个字节流,就对哪个字节流提高效率
*
* FileOutputSteam
*/
public class BufferedOutputStreamDemo {
public static void main(String[] args)throws IOException {
//创建字节输出流,绑定文件
//FileOutputStream fos = new FileOutputStream("c:\\buffer.txt");
//创建字节输出流缓冲流的对象,构造方法中,传递字节输出流
BufferedOutputStream bos = new
BufferedOutputStream(new FileOutputStream("c:\\buffer.txt")); bos.write(55); byte[] bytes = "HelloWorld".getBytes(); bos.write(bytes); bos.write(bytes, 3, 2); bos.close();
}
}
package cn.it.demo2;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; /*
* 字符输入流缓冲流
* java.io.BufferedReader 继承 Reader
* 读取功能 read() 单个字符,字符数组
* 构造方法:
* BufferedReader(Reader r)
* 可以任意的字符输入流
* FileReader InputStreamReader
*
* BufferedReader自己的功能
* String readLine() 读取文本行 \r\n
*
* 方法读取到流末尾,返回null
* 小特点:
* 获取内容的方法一般都有返回值
* int 没有返回的都是负数
* 引用类型 找不到返回null
* boolean 找不到返回false
*
* String s = null
* String s ="null"
*
* readLine()方法返回行的有效字符,没有\r\n
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
int lineNumber = 0;
//创建字符输入流缓冲流对象,构造方法传递字符输入流,包装数据源文件
BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));
//调用缓冲流的方法 readLine()读取文本行
//循环读取文本行, 结束条件 readLine()返回null
String line = null;
while((line = bfr.readLine())!=null){
lineNumber++;
System.out.println(lineNumber+" "+line);
}
bfr.close();
}
} /*
* String line = bfr.readLine();
System.out.println(line); line = bfr.readLine();
System.out.println(line); line = bfr.readLine();
System.out.println(line); line = bfr.readLine();
System.out.println(line); line = bfr.readLine();
System.out.println(line);
*/
package cn.it.demo2;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; /*
* 字符输出流缓冲区流
* java.io.BufferedWriter 继承 Writer
* 写入方法 write () 单个字符,字符数组,字符串
*
* 构造方法:
* BufferedWriter(Writer w)传递任意字符输出流
* 传递谁,就高效谁
* 能传递的字符输出流 FileWriter, OutputStreamWriter
*
* BufferedWriter 具有自己特有的方法
* void newLine() 写换行
*
* newLine()文本中换行, \r\n也是文本换行
* 方法具有平台无关性
* Windows \r\n
* Linux \n
*
* newLine()运行结果,和操作系统是相互关系
* JVM: 安装的是Windows版本,newLine()写的就是\r\n
* 安装的是Linux版本,newLine()写的就是\n
*/
public class BufferedWrierDemo {
public static void main(String[] args) throws IOException{
//创建字符输出流,封装文件
FileWriter fw = new FileWriter("c:\\buffer.txt");
BufferedWriter bfw = new BufferedWriter(fw); bfw.write("你好");
bfw.newLine();
bfw.flush(); bfw.write("我好好");
bfw.newLine();
bfw.flush(); bfw.write("大家都好");
bfw.flush(); bfw.close(); }
} /*
*
bfw.write(100);
bfw.flush(); bfw.write("你好".toCharArray());
bfw.flush();*/
package cn.it.demo;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set; /*
* 集合对象Properties类,继承Hashtable,实现Map接口
* 可以和IO对象结合使用,实现数据的持久存储
*/
public class PropertiesDemo {
public static void main(String[] args)throws IOException {
function_2();
}
/*
* Properties集合的特有方法store
* store(OutputStream out)
* store(Writer w)
* 接收所有的字节或者字符的输出流,将集合中的键值对,写回文件中保存
*/
public static void function_2()throws IOException{
Properties pro = new Properties();
pro.setProperty("name", "zhangsan");
pro.setProperty("age", "31");
pro.setProperty("email", "123456789@163.com");
FileWriter fw = new FileWriter("c:\\pro.properties");
//键值对,存回文件,使用集合的方法store传递字符输出流
pro.store(fw, "");
fw.close();
} /*
* Properties集合特有方法 load
* load(InputStream in)
* load(Reader r)
* 传递任意的字节或者字符输入流
* 流对象读取文件中的键值对,保存到集合
*/
public static void function_1()throws IOException{
Properties pro = new Properties();
FileReader fr = new FileReader("c:\\pro.properties");
//调用集合的方法load,传递字符输入流
pro.load(fr);
fr.close();
System.out.println(pro);
} /*
* 使用Properties集合,存储键值对
* setProperty等同与Map接口中的put
* setProperty(String key, String value)
* 通过键获取值, getProperty(String key)
*/
public static void function(){
Properties pro = new Properties();
pro.setProperty("a", "1");
pro.setProperty("b", "2");
pro.setProperty("c", "3");
System.out.println(pro); String value = pro.getProperty("c");
System.out.println(value); //方法stringPropertyNames,将集合中的键存储到Set集合,类似于Map接口的方法keySet
Set<String> set = pro.stringPropertyNames();
for(String key : set){
System.out.println(key+"..."+pro.getProperty(key));
}
}
}
package cn.it.demo1;

import java.io.Serializable;

public class Person implements Serializable{
public String name;
public /*transient阻止成员变量序列化*/ int age;
//类,自定义了序列号,编译器不会计算序列号
private static final long serialVersionUID = 1478652478456L; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(){} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }
package cn.it.demo1;

public class Demo {
public static void main(String[] args) {
Person p = new Person("a",22);
System.out.println(p);
}
}
package cn.it.demo1;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; /*
* IO流对象,实现对象Person序列化,和反序列化
* ObjectOutputStream 写对象,实现序列化
* ObjectInputStream 读取对象,实现反序列化
*/
public class ObjectStreamDemo {
public static void main(String[] args)throws IOException, ClassNotFoundException {
// writeObject();
readObject();
}
/*
* ObjectInputStream
* 构造方法:ObjectInputStream(InputStream in)
* 传递任意的字节输入流,输入流封装文件,必须是序列化的文件
* Object readObject() 读取对象
*/
public static void readObject() throws IOException, ClassNotFoundException{
FileInputStream fis = new FileInputStream("c:\\person.txt");
//创建反序列化流,构造方法中,传递字节输入流
ObjectInputStream ois = new ObjectInputStream(fis);
//调用反序列化流的方法 readObject()读取对象
Object obj =ois.readObject();
System.out.println(obj);
ois.close();
} /*
* ObjectOutputStream
* 构造方法: ObjectOutputStream(OutputSteam out)
* 传递任意的字节输出流
* void writeObject(Object obj)写出对象的方法
*/
public static void writeObject() throws IOException{
//创建字节输出流,封装文件
FileOutputStream fos = new FileOutputStream("c:\\person.txt");
//创建写出对象的序列化流的对象,构造方法传递字节输出流
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p = new Person("lisi",25);
//调用序列化流的方法writeObject,写出对象
oos.writeObject(p);
oos.close();
}
}
package cn.it.demo2;
/*
* String s = "abc";final char[] value
*/
public class Demo {
public static void main(String[] args) {
int[] arr = {1};
System.out.println(arr); char[] ch = {'a','b'};
System.out.println(ch); byte[] b = {};
System.out.println(b);
}
}
package cn.it.demo2;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; /*
* 打印流
* PrintStream
* PrintWriter
* 打印流的特点:
* 1. 此流不负责数据源,只负责数据目的
* 2. 为其他输出流,添加功能
* 3. 永远不会抛出IOException
* 但是,可能抛出别的异常
*
* 两个打印流的方法,完全一致
* 构造方法,就是打印流的输出目的端
* PrintStream
* 构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream
* PrintWriter
* 构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer
*
*/
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
function_3(); }
/*
* 打印流,可以开启自动刷新功能
* 满足2个条件:
* 1. 输出的数据目的必须是流对象
* OutputStream Writer
* 2. 必须调用println,printf,format三个方法中的一个,启用自动刷新
*/
public static void function_3()throws IOException{
//File f = new File("XXX.txt");
FileOutputStream fos = new FileOutputStream("c:\\5.txt");
PrintWriter pw = new PrintWriter(fos,true);
pw.println("i");
pw.println("love");
pw.println("java");
pw.close();
} /*
* 打印流,输出目的,是流对象
* 可以是字节输出流,可以是字符的输出流
* OutputStream Writer
*/
public static void function_2() throws IOException{
// FileOutputStream fos = new FileOutputStream("c:\\3.txt");
FileWriter fw = new FileWriter("c:\\4.txt");
PrintWriter pw = new PrintWriter(fw);
pw.println("打印流");
pw.close();
}
/*
* 打印流,输出目的,String文件名
*/
public static void function_1() throws FileNotFoundException{
PrintWriter pw = new PrintWriter("c:\\2.txt");
pw.println(3.5);
pw.close();
} /*
* 打印流,向File对象的数据目的写入数据
* 方法print println 原样输出
* write方法走码表
*/
public static void function() throws FileNotFoundException{
File file = new File("c:\\1.txt");
PrintWriter pw = new PrintWriter(file);
pw.println(true);
pw.write(100);
pw.close();
}
}
package cn.it.demo2;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; /*
* 打印流实现文本复制
* 读取数据源 BufferedReader+File 读取文本行
* 写入数据目的 PrintWriter+println 自动刷新
*/
public class PrintWriterDemo1 {
public static void main(String[] args) throws IOException{
BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("d:\\a.txt"),true);
String line = null;
while((line = bfr.readLine())!=null){
pw.println(line);
}
pw.close();
bfr.close();
}
}
package cn.it.demo3;

import org.apache.commons.io.FilenameUtils;

public class Commons_IODemo {
public static void main(String[] args) {
function_2();
}
/*
* FilenameUtils类的方法
* static boolean isExtension(String filename,String extension)
* 判断文件名的后缀是不是extension
*/
public static void function_2(){
boolean b = FilenameUtils.isExtension("Demo.java", "java");
System.out.println(b);
} /*
* FilenameUtils类的方法
* static String getName(String filename)
* 获取文件名
*/
public static void function_1(){
String name = FilenameUtils.getName("c:\\windows\\");
System.out.println(name);
} /*
* FilenameUtils类的方法
* static String getExtension(String filename)
* 获取文件名的扩展名
*/
public static void function(){
String name = FilenameUtils.getExtension("c:\\windows");
System.out.println(name);
}
}
package cn.it.demo3;

import java.io.File;
import java.io.IOException; import org.apache.commons.io.FileUtils; public class Commons_IODemo1 {
public static void main(String[] args)throws IOException {
function_3();
}
/*
* FileUtils工具类方法
* static void copyDirectoryToDirectory(File src,File desc)
* 复制文件夹
*/
public static void function_3() throws IOException{
FileUtils.copyDirectoryToDirectory(new File("d:\\demo"), new File("c:\\"));
} /*
* FileUtils工具类的方法
* static void copyFile(File src,File desc)
* 复制文件
*/
public static void function_2() throws IOException{
FileUtils.copyFile(new File("c:\\k.jpg"),new File("d:\\k.jpg"));
} /*
* FileUtils工具类的方法
* static void writeStringToFile(File src,String date)
* 将字符串直接写到文件中
*/
public static void function_1() throws IOException{
FileUtils.writeStringToFile(new File("c:\\b.txt"),"我爱Java编程");
} /*
* FileUtils工具类的方法
* static String readFileToString(File src)读取文本,返回字符串
*/
public static void function() throws IOException{
String s = FileUtils.readFileToString(new File("c:\\a.txt"));
System.out.println(s);
}
}
package com.it.demo01_outputStream;

import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 演示字节输出流写数据.
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
//1. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/1.txt");
//2. 写数据.
//一次一个字节
fos.write(97);
fos.write("\r\n".getBytes()); //一次一个字节数组
byte[] bys = {65, 66, 67};
fos.write(bys);
fos.write("\r\n".getBytes()); //一次一个字节数组 的一部分
fos.write(bys, 1, 1);; //3. 释放资源.
fos.close();
}
}
package com.it.demo01_outputStream;

import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 演示 try.catch 处理 IO流异常.
*/
public class Demo02 {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
//System.out.println(1 / 0);
//1. 创建输出流, 关联目的地文件.
fos = new FileOutputStream("day12/data/1.txt");
//2. 写数据, 一次一个字节数组
byte[] bys = {65, 66, 67};
fos.write(bys);
fos.write("\r\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
//3. 释放资源.
try {
if (fos != null) {
fos.close();
fos = null; //GC会优先回收null对象.
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.it.demo01_outputStream;

import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 制作空文件. 需求:
在指定的路径下(例如: d:/abc)创建一个大小为1G的空文件.
*/
public class Demo03 {
public static void main(String[] args) throws IOException {
//1. 创建字节输出流对象, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("D:\\BaseClass\\程德与牟老师(蓝光高清无码).avi");
//2. 往文件中写数据.
//1KB = 1024B
byte[] bys = new byte[1024];
//fos.write(bys); //造出来的文件只有1KB /*
1GB = 1024MB
1MB = 1024KB
1KB = 1024B
*/
for (int i = 0; i < 1024 * 1024; i++) {
fos.write(bys);
} //3. 释放资源.
fos.close(); //System.out.println("制造完成");
}
}
package com.it.demo02_Inputstream;

import java.io.FileInputStream;
import java.io.IOException; /*
案例: 演示字节输入流入门. 普通的字节输入流简介
概述:
普通的字节输入流指的是FileInputStream, 它是以字节为单位来读取数据的.
构造方法:
public FileInputStream(String pathName); 创建字节输入流对象, 关联数据源文件(字符串形式)
public FileInputStream(File pathName); 创建字节输入流对象, 关联数据源文件(File对象形式)
成员方法:
public int read(); 一次读取一个字节, 并返回该字节对应的ASCII码值, 读不到返回-1 'a' -> 97
public int read(byte[] bys); 一次读取一个字节数组, 把读取到的数据存储到字节数组中,
并返回读取到的有效字节数, 读不到返回-1 'a' -> 1
public void close(); 关闭流, 释放资源的.
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
//1. 创建输入流对象, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.txt");
//2. 读取数据.
//3. 将读取到的数据打印到控制台上.
//一次读取一个字节, 返回的是该字节对应的ASCII码值.
//分解版
/*int len1 = fis.read();
System.out.println(len1);
int len2 = fis.read();
System.out.println(len2);
int len3 = fis.read();
System.out.println(len3);
int len4 = fis.read();
System.out.println(len4);*/ //合并版
int len;
/*
(len = fis.read()) != -1 这行代码做了3件事儿:
1. 执行 fis.read() 采用一次读取一个字节的形式读取数据.
2. 执行 len = fis.read() 把读取到的数据(ASCII码值, 有效字节数)赋值给变量
3. 执行 len != -1 判断是否读取到了数据, 如果不为-1说明有数据.
*/
while((len = fis.read()) != -1) {
System.out.println(len);
} //4. 释放资源.
fis.close();
}
}
package com.it.demo02_Inputstream;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays; /*
案例: 演示字节输入流一次读写一个字节数组. 核心细节:
public int read(byte[] bys); 一次读取一个字节数组, 把读取到的数据存储到字节数组中,
并返回读取到的有效字节数, 读不到返回-1
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
//1. 创建字节输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.txt"); //2. 采用一次读取一个字节数组的形式读取数据.
byte[] bys = new byte[3]; //0, 0, 0
int len; //记录的是有效字节数.
while((len = fis.read(bys)) != -1) {
//输出读取到的数据, 转成字符串, 然后输出.
String s = new String(bys, 0, len);
System.out.println(s);
} //分解版
/*//第一次读取
int len1 = fis.read(bys);
System.out.println(Arrays.toString(bys)); //97, 98, 99
System.out.println(len1); //3 //第二次读取
int len2 = fis.read(bys);
System.out.println(Arrays.toString(bys)); //100, 101, 102
System.out.println(len2); //3 //第三次读取
int len3 = fis.read(bys);
System.out.println(Arrays.toString(bys)); //103, 101, 102
System.out.println(len3); //1 //第四次读取
int len4 = fis.read(bys);
System.out.println(Arrays.toString(bys)); //103, 101, 102
System.out.println(len4); //-1*/ //3. 释放资源.
fis.close();
}
}
package com.it.demo04_bufferedinputstream;

import java.io.*;

/*
案例: 字节缓冲流入门. 需求:
1.通过字节缓冲输出流往文件中写一句话.
2.通过字节缓冲输入流读取文件中的内容. 字节缓冲流简介:
概述:
字节缓冲流也叫: 缓冲字节流, 高效字节流, 字节高效流, 它仅仅是提供了一个缓冲区, 具体的读写操作还是由普通的字节流实现的.
分类:
字节缓冲输入流: BufferedInputStream
构造方法:
public BufferedInputStream(InputStream is); 创建字节缓冲输入流对象,用来给 普通的字节输入流对象提供缓冲区. 字节缓冲输出流: BufferedOutputStream
构造方法:
public BufferedOutputStream(OutputStream os); 创建字节缓冲输出流对象,用来给 普通的字节输出流对象提供缓冲区.
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.通过字节缓冲输出流往文件中写一句话.
//分解版
//1.1 创建普通的字节输出流, 没有默认的缓冲区.
//FileOutputStream fos = new FileOutputStream("day12/data/1.txt"); //化妆之前的妹子.
//1.2 创建字节缓冲输出流, 关联普通的字节输出流, 给他提供缓冲区.
//BufferedOutputStream bos = new BufferedOutputStream(fos); //化妆之后的妹子.. //合并版
//提供缓冲区 关联目的地文件, 写数据.
/* BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day12/data/1.txt")); //1.3 往文件中写数据.
bos.write("abc, 你好, 我是缓冲字节流".getBytes());
//1.4 关流, 释放资源
bos.close(); */ //关联的fos对象, 会自动关闭. //需求2: 通过字节缓冲输入流读取文件中的内容.
//2.1 创建字节缓冲输入流对象, 关联数据源文件.
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day12/data/1.txt"));
//2.2 读取数据中的数据.
byte[] bys = new byte[1024];
int len = bis.read(bys);
String s = new String(bys, 0, len); //把读取到的数据转成字符串.
//2.3 把读取到的数据打印到控制台.
System.out.println(s);
//2.4 释放资源.
bis.close();
}
}
package com.it.demo05_reader;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays; /*
案例: 演示字节流一次读取一个字节的形式, 读取中文数据. 需求:
1.已知项目下的data文件夹下的1.txt文件中包含数据"abc中国".
2.请通过字节流一次读取一个字节的形式, 将上述文件中的内容读取出来.
3.将上述读取到的数据打印到控制台上. 结论:
用字节流虽然也能操作纯文本文件, 但是效率相对比较低, 因为中文在不同的码表中,
占用的字节数也不同.
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.txt"); //2. 读取数据.
int len;
while ((len = fis.read()) != -1) {
//3. 打印读取到的数据.
System.out.println((byte)len);
} //4. 释放资源.
fis.close();
System.out.println("-------------------------"); //演示: 如何将字符串内容转成其对应的字节数组形式
/*
涉及到的String类中的成员方法:
public byte[] getBytes(); 采用默认码表, 将字符串转成其对应的字节数组形式.
public byte[] getBytes(String charsetName); 采用指定码表, , 将字符串转成其对应的字节数组形式.
*/
byte[] bys1 = "你好".getBytes(); //默认: UTF-8
byte[] bys2 = "你好".getBytes("utf-8"); //默认: UTF-8
byte[] bys3 = "你好".getBytes("gbk"); //默认: UTF-8
System.out.println(Arrays.toString(bys1));
System.out.println(Arrays.toString(bys2));
System.out.println(Arrays.toString(bys3));
}
}
package com.it.demo05_reader;

import java.io.UnsupportedEncodingException;
import java.util.Arrays; /*
案例: 编码表简介. 概述:
编码表就是用来描述字符和数字的对应关系的, 因为计算机能直接识别二进制的数据, 所以我们的
代码在存储数据的时候, 如非必要, 一般是把数据转成二进制形式的存, 然后再做操作. 常用的码表:
ASCII: 美国通用信息交互码表, 就是描述char和int范围的.
IOS-8859-1: 主要针对于欧洲的.
GBK: 主要是针对于国内的(字符)
utf-8: 也叫万国码, 主要是针对所有的语言的 细节:
用什么码表编码, 就用指定的码表解码. 大白话举例: 编解码一致. 编码涉及到的方法: 我们看的懂的数据 -> 我们看不懂的数据.
即: String --> byte[] bys 解码涉及到的方法: 我们看不懂的数据 -> 我们看的懂的数据
public String();
public String(String s);
public String(byte[] bys, int start, int len); */
public class Demo02 {
public static void main(String[] args) throws Exception {
//编码: 把我们能看懂的数据, 变成我们看不懂的.
String s1 = "传智播客";
//编码
byte[] bys = s1.getBytes("utf-8"); //字符串s1转成 byte[] bys
//输出
System.out.println(Arrays.toString(bys));
System.out.println("-----------------------------"); //解码: 把我们看不懂的数据, 解析成我们能看懂的数据.
String s = new String(bys); //byte[] bys -> 字符串s
System.out.println(s); }
}
package com.it.demo05_reader;

import java.io.*;

/*
案例: 演示转换流入门. 需求:
1.通过转换流, 将项目下data文件夹中1.txt文件的内容, 拷贝到data文件夹下2.txt文件中.
2.运行, 并查看返回值结果. 概述:
转换流就是用来把字节流封装成字符流的, 转换流只有两个:
InputStreamReader(); 把字节输入流 封装成 字符输入流.
涉及到的构造方法:
public InputStreamReader(字节输入流);
public InputStreamReader(字节输入流, "码表); OutputStreamWriter(): 把字节输出流 封装撤回 字符输出流.
public OutputStreamWriter(字节输出流);
public OutputStreamWriter(字节输出流, "码表"); 细节:
1. 字符流 = 字节流 + 编码表
2. 谁是字节流通向字符流的桥梁, 谁是字符流通向字节流的桥梁?
字节流通向字符流的桥梁: InputStreamReader
字符流通向字节流的桥梁: OutputStreamWriter
*/
public class Demo03 {
public static void main(String[] args) throws IOException {
//1. 创建输入流, 关联数据源文件.
//InputStreamReader isr = new InputStreamReader(new FileInputStream("day12/data/1.txt"),"utf-8");
//上述代码可以简写成
InputStreamReader isr = new InputStreamReader(new FileInputStream("day12/data/1.txt"));
//2. 创建输出流, 关联目的地文件.
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day12/data/2.txt"),"utf-8");
//3. 定义变量, 用来记录读取到的数据(字符).
int len;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = isr.read()) != -1) {
//5. 将读取到的数据写入到目的地文件中.
osw.write(len);
}
//6. 关流, 释放资源.
isr.close();
osw.close();
}
}
package com.it.demo06_bufferedreader;

import java.io.*;

/*
案例: 演示字符缓冲流入门. 需求:
1.通过字符缓冲输出流往文件中写一句话.
2.通过字符缓冲输入流读取文件中的内容. 字符缓冲流涉及到的内容:
概述:
所谓的字符串缓冲流也叫: 缓冲字符流, 高效字符流, 字符高效流, 它仅仅是提供了一个缓冲区, 具体的读写还是普通的字符流来做的.
所以在创建字符缓冲流的时候, 需要关联一个普通的字符流. 字符缓冲流主要有: BufferedReader 和 BufferedWriter.
涉及到构造方法:
BufferedReader类中的构造方法:
public BufferedReader(Reader r); 创建字符缓冲输入流对象, 关联普通的字符输入流
BufferedWriter类中的构造方法:
public BufferedWriter(Writer w); 创建字符缓冲输出流对象, 关联普通的字符输出流.
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.通过字符缓冲输出流往文件中写一句话.
//1.1 创建输出流, 关联目的地文件.
//分解版
/*FileWriter fw = new FileWriter("day12/data/1.txt");
BufferedWriter bw = new BufferedWriter(fw);*/ /* //合并版
BufferedWriter bw = new BufferedWriter( new FileWriter("day12/data/1.txt")); //1.2 往文件中写数据.
bw.write("风和日丽, 晴空万里!"); //1.3 释放资源.
bw.close();*/ //2.通过字符缓冲输入流读取文件中的内容.
//2.1 创建输入流, 关联数据源文件.
BufferedReader br = new BufferedReader(new FileReader("day12/data/1.txt"));
//2.2 读取数据.
char[] chs = new char[1024];
int len = br.read(chs);
//把读取到的数据转成字符串
String s = new String(chs, 0, len); //2.3 打印读取到的数据.
System.out.println(s); //2.4 释放资源.
br.close();
}
}
package com.it.demo06_bufferedreader;

import java.io.*;

/*
案例: 演示字符缓冲流拷贝文件. 需求:
通过字符缓冲流一次读写一个字符的方式复制文件.
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
//方式一: 通过字符缓冲流一次读写一个字符的方式复制文件.
//method01(); //方式二: 通过字符缓冲流一次读写一个字符数组的方式复制文件.
//1. 创建输入流, 关联数据源文件.
BufferedReader br = new BufferedReader(new FileReader("day12/data/1.txt"));
//2. 创建输出流, 关联目的地文件.
BufferedWriter bw = new BufferedWriter(new FileWriter("day12/data/2.txt"));
//3. 定义变量, 用来记录读取到的数据(字节, 字符, 有效字节数, 有效字符数).
int len;
char[] chs = new char[1024];
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = br.read(chs)) != -1) {
//5. 将读取到的数据写入到目的地文件中.
bw.write(chs, 0, len);
}
//6. 关流, 释放资源.
br.close();
bw.close();
} public static void method01() throws IOException {
//1. 创建输入流, 关联数据源文件.
BufferedReader br = new BufferedReader(new FileReader("day12/data/1.txt"));
//2. 创建输出流, 关联目的地文件.
BufferedWriter bw = new BufferedWriter(new FileWriter("day12/data/2.txt"));
//3. 定义变量, 用来记录读取到的数据(字节, 字符, 有效字节数, 有效字符数).
int len;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = br.read()) != -1) {
//5. 将读取到的数据写入到目的地文件中.
bw.write(len);
}
//6. 关流, 释放资源.
br.close();
bw.close();
}
}
package com.it.pojo;

import java.io.Serializable;

//学生类
public class Student implements Serializable {
//为了防止序列化号一直变化, 我们手动给出.
public static final long serialVersionUID = 2L; private String name;
private transient int age; //transient: 瞬态关键字.
private String gender;
private String email; public Student() {
} public Student(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
} package com.it.demo07_serializable; import com.it.pojo.Student; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; /*
案例: 演示对象的序列化 和 反序列化操作. 序列化流和反序列化流简介:
ObjectOutputStream: 对象序列化流
作用: 把对象写入到指定的文件中.
涉及到的成员:
public ObjectOutputStream(OutputStream os); public void writeObject(Object obj); //把对象写入到文件中.
ObjectInputStream: 对象反序列化流
作用: 从文件中读取对象.
涉及到的成员:
public ObjectInputStream(InputStream is); public Object readObject(); Serializable接口简介:
它是一个标记接口, 任何想实现序列化和反序列化操作的类, 必须实现该接口.
该接口只是用来做标记的, 它里边没有任何的成员. 细节:
1. 一个类的对象想实现序列化或者反序列化操作,则该对象所在的类必须实现: Serializable接口.
2. 如果要同时序列化多个对象, 可以尝试把这些对象都放在同一个集合中, 然后把集合对象序列化到文件中,
将来反序列化的时候, 读取到的也是集合对象, 然后遍历集合, 即可获取每个对象. */
public class Demo01 {
public static void main(String[] args) throws IOException {
//需求: 演示序列化操作, 即: 把学生对象写到 1.txt 文件中.
//1. 创建序列化流. 关联目的地文件.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day12/data/1.txt"));
//2. 创建JavaBean对象.
Student s1 = new Student("刘亦菲", 33);
//Student s2 = new Student("赵丽颖", 31);
//3. 把对象写到文件中, 序列化操作.
oos.writeObject(s1);
//oos.writeObject(s2);
//4. 释放资源.
oos.close();
}
}
package com.it.demo07_serializable;

import com.it.pojo.Student;

import java.io.*;

/*
案例: 演示对象的反序列化操作, 涉及到的流是: ObjectInputStream
*/
public class Demo02 {
public static void main(String[] args) throws Exception {
//需求: 演示反序列化操作, 即: 从1.txt文件中读取 Student对象.
//1. 创建反序列化流. 关联数据源文件.
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day12/data/1.txt"));
//2. 从到文件中读取对象, 反序列化操作.
//细节: 需要向下转型.
Student stu = (Student)ois.readObject();
//Student stu2 = (Student)ois.readObject();
//3. 打印读取到的对象.
System.out.println(stu); //刘亦菲, 33
//System.out.println(stu2); //赵丽颖, 31
//4. 释放资源.
ois.close();
}
}

package com.it.demo07_serializable;

/*
案例: 演示序列化操作时候的细节问题. 问题1: 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
会出问题,会抛出InvalidClassException异常 问题2: 如何解决上述的问题?
方式一: 重新序列化.
方式二: 自己给类定义一个成员变量 serialVersionUID, 它是一个long类型的变量.
这样的话, 即使类中的成员变化了, serialVersionUID也不会跟着变化, 必须手动设置(修改). 问题3: 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程 transient关键字解释:
它表示瞬态关键字, 被它标记的成员变量不参与序列化过程.
*/
public class Demo03 {
public static void main(String[] args) { }
}
package com.it.demo07_serializable;

import java.io.FileWriter;
import java.io.IOException; /*
案例: 演示close() 和 flush()方法的区别.
close(): 用来关闭流, 释放资源的, 关闭之前, 会自动刷新一次缓冲区, 关闭之后, 流对象就不能继续使用了.
flush(): 用来刷新缓冲区的, 把缓冲区的数据给刷新出来. 刷新之后, 流对象还可以继续使用.
*/
public class Demo04 {
public static void main(String[] args) throws IOException {
//需求: 往1.txt文件中写数据.
FileWriter fw = new FileWriter("day12/data/1.txt");
fw.write("你好啊\r\n");
fw.write("我是字节缓冲流"); //这些数据在缓冲区. //方式一: flush()方式实现, 刷新缓冲区
fw.flush();
fw.write("看看我写到文件中了吗?"); //方式二: 关流, 释放资源.
fw.close();
}
}
package com.it.demo07_serializable;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 演示IO流的标准异常处理代码. JDK1.7以前的处理方案.
*/
public class Demo05 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//1. 创建输入流, 关联数据源文件.
fis = new FileInputStream("day12/data/1.txt");
//2. 创建输出流, 关联目的地文件.
fos = new FileOutputStream("day12/data/3.txt");
//3. 定义变量, 用来记录读取到的数据(有效字节数).
int len;
byte[] bys = new byte[1024];
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fis.read(bys)) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fos.write(bys, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//6. 关流, 释放资源.
try {
System.out.println(1/0);
if (fis != null) {
fis.close();
fis = null; //GC会优先回收null对象
System.out.println("fis关闭了");
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if (fos != null) {
fos.close();
fos = null; //GC会优先回收null对象
System.out.println("fos关闭了");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.it.demo07_serializable;

import java.io.FileInputStream;
import java.io.FileOutputStream; /*
案例: 演示IO流的标准异常处理代码. JDK1.7及其以后的处理方案: try.with.resources语句 try.with.resources语句简介:
概述:
try(
//这里写对象.
){
//这里写逻辑代码
} catch(异常类型 对象名) {
出现异常后的解决方案
}
特点:
写在try小括号中的对象, 会在大括号中的内容执行完毕后, 自动释放.
前提要求:
写在try小括号中的对象所在的类, 必须实现 AutoCloseable接口.
*/
public class Demo06 {
public static void main(String[] args) {
try(
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.txt");
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/3.txt"); Demo07 d = new Demo07();
) {
//3. 定义变量, 用来记录读取到的数据(有效字节数).
int len;
byte[] bys = new byte[1024];
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fis.read(bys)) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fos.write(bys, 0, len);
}
//6. 关流, 释放资源.
fis.close();
fos.close();
} catch(Exception e) {
e.printStackTrace();
} }
}
package com.it.demo07_serializable;

//为了演示, try.with.resources语句的特点.
public class Demo07 implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("看看我执行了吗? 执行了, 就表示Demo07对象, 被释放资源了.");
}
}
 
package com.it.demo03_exercise;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 演示普通的字节流 拷贝 文本文件. 拷贝方式:
方式一: 一次读写一个字节.
方式二: 一次读写一个字节数组. IO流的核心操作步骤:
1. 创建输入流, 关联数据源文件.
2. 创建输出流, 关联目的地文件.
3. 定义变量, 用来记录读取到的数据(字节, 字符, 有效字节数, 有效字符数).
4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
5. 将读取到的数据写入到目的地文件中.
6. 关流, 释放资源.
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
//方式一: 一次读写一个字节
//method01(); //方式二: 一次读写一个字节数组.
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.txt");
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/3.txt");
//3. 定义变量, 用来记录读取到的数据(有效字节数).
int len;
byte[] bys = new byte[1024];
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fis.read(bys)) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fos.write(bys, 0, len);
}
//6. 关流, 释放资源.
fis.close();
fos.close(); System.out.println("拷贝成功!");
} public static void method01() throws IOException {
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.txt");
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/2.txt");
//3. 定义变量, 用来记录读取到的数据(字节).
int len;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fis.read()) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fos.write(len);
}
//6. 关流, 释放资源.
fis.close();
fos.close();
}
}
package com.it.demo03_exercise;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; /*
案例: 演示图片加密. 需求:
1.对项目下的a.jpg图片进行加密, 获取到一个新的加密图片b.jpg.
2.对加密后的图片b.jpg进行解密, 获取解密后的图片c.jpg. 核心: 通过运算符 ^ 实现.
位异或运算符^的用法: 一个数字被同一个数字位异或两次, 该数字值不变.
例如: 5 ^ 10 ^ 10 = 5 流程:
a.jpg -> b.jgp //加密动作
b.jpg -> c.jpg //解密动作
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
/*System.out.println(5 ^ 10 ^ 10); //5
System.out.println(5 ^ 10 ^ 5); //10*/ //需求: 图片加密, 要求: 你要自己记住密钥
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/b.jpg"); //已经和 56 位异或过的值, 即: len ^ 56
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/c.jpg");
//3. 定义变量, 用来记录读取到的数据(字节).
int len;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fis.read()) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fos.write(len^ 56); //加密: len ^ 56(密钥) //解密: len ^ 56(密钥) ^ 56(密钥)
}
//6. 关流, 释放资源.
fis.close();
fos.close();
}
}
package com.it.demo03_exercise;

import java.io.*;
import java.util.Date; /*
案例: 演示字节流拷贝文件的四种方式的效率问题. 需求:
1.分别通过四种方式拷贝视频文件, 并观察它们的效率.
2.通过普通的字节流一次读写一个字节的形式实现.
3.通过普通的字节流一次读写一个字节数组的形式实现.
4.通过高效的字节流一次读写一个字节的形式实现.
5.通过高效的字节流一次读写一个字节数组的形式实现. 结论(四种拷贝方式效率从高到底分别是):
1. 高效的字节流一次读写一个字节数组. 29毫秒
2. 普通的字节流一次读写一个字节数组. 19毫秒
小细节:
因为字节缓冲流的默认缓冲区的大小是 8192个字节, 所以理论上来讲, 如果自定义的数组(当做缓冲区来用)长度是8192的话,
该拷贝方式效率会比 字节高效流一次一个字节数组的方式 快一点点, 因为如果是采用 字节高效流, 虽然他有内置的缓冲区,
但是创建及初始化缓冲区也需要消耗一定的时间,
3. 高效的字节流一次读写一个字节. 294毫秒
4. 普通的字节流一次读写一个字节. 55062毫秒
*/
public class Demo03 {
public static void main(String[] args) throws IOException {
//long start = new Date().getTime(); //获取当前时间的毫秒值
long start = System.currentTimeMillis(); //获取当前时间的毫秒值 //1. 通过普通的字节流一次读写一个字节的形式实现.
//method01(); //2. 通过普通的字节流一次读写一个字节数组的形式实现.
//method02(); //3. 通过高效的字节流一次读写一个字节的形式实现.
//method03(); //4. 通过高效的字节流一次读写一个字节数组的形式实现.
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.avi");
BufferedInputStream bis = new BufferedInputStream(fis);
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/copy4.avi");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3. 定义变量, 用来记录读取到的数据(字节).
int len;
byte[] bys = new byte[8192];
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = bis.read(bys)) != -1) {
//5. 将读取到的数据写入到目的地文件中.
bos.write(bys, 0, len);
}
//6. 关流, 释放资源.
bis.close();
bos.close(); long end = System.currentTimeMillis(); //获取当前时间的毫秒值
System.out.println("程序执行时间为: " + (end - start) + "毫秒");
} public static void method03() throws IOException {
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.avi");
BufferedInputStream bis = new BufferedInputStream(fis);
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/copy3.avi");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3. 定义变量, 用来记录读取到的数据(字节).
int len;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = bis.read()) != -1) {
//5. 将读取到的数据写入到目的地文件中.
bos.write(len);
}
//6. 关流, 释放资源.
bis.close();
bos.close();
} public static void method02() throws IOException {
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.avi");
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/copy2.avi");
//3. 定义变量, 用来记录读取到的数据(字节).
int len;
byte[] bys = new byte[8192];
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fis.read(bys)) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fos.write(bys, 0, len);
}
//6. 关流, 释放资源.
fis.close();
fos.close();
} public static void method01() throws IOException {
//1. 创建输入流, 关联数据源文件.
FileInputStream fis = new FileInputStream("day12/data/1.avi");
//2. 创建输出流, 关联目的地文件.
FileOutputStream fos = new FileOutputStream("day12/data/copy1.avi");
//3. 定义变量, 用来记录读取到的数据(字节).
int len;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fis.read()) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fos.write(len);
}
//6. 关流, 释放资源.
fis.close();
fos.close();
}
}
package com.it.demo03_exercise;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; /*
案例: 演示普通的字符流拷贝文件. 拷贝方式:
方式一: 一次读写一个字符.
方式二: 一次读写一个字符数组.
*/
public class Demo04 {
public static void main(String[] args) throws IOException {
//演示 方式一: 一次读写一个字符.
//method01(); //演示 方式二: 一次读写一个字符数组.
//method02();
} public static void method02() throws IOException {
//1. 创建输入流, 关联数据源文件.
FileReader fr = new FileReader("day12/data/1.txt");
//2. 创建输出流, 关联目的地文件.
FileWriter fw = new FileWriter("day12/data/2.txt");
//3. 定义变量, 用来记录读取到的数据(字符).
int len;
char[] chs = new char[1024];
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fr.read(chs)) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fw.write(chs, 0, len);
}
//6. 关流, 释放资源.
fr.close();
fw.close();
} public static void method01() throws IOException {
//1. 创建输入流, 关联数据源文件.
FileReader fr = new FileReader("day12/data/1.txt");
//2. 创建输出流, 关联目的地文件.
FileWriter fw = new FileWriter("day12/data/2.txt");
//3. 定义变量, 用来记录读取到的数据(字符).
int len;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((len = fr.read()) != -1) {
//5. 将读取到的数据写入到目的地文件中.
fw.write(len);
}
//6. 关流, 释放资源.
fr.close();
fw.close();
}
}
package com.it.demo03_exercise;

import java.io.*;

/*
案例: 演示字符缓冲流独有的拷贝文件的方式, 一次读写一行. 涉及到的成员方法:
BufferedReader类中的成员方法:
public String readLine(); 一次读取一行数据, 并返回读取到的内容, 读不到返回 null
BufferedWriter类中的成员方法:
public void newLine(); 根据当前操作系统, 给出对应的换行符.
例如; window系统 \r\n, linux系统: \n mac系统: \r 通过IO流拷贝文件的几种方式如下:
需求1: 拷贝纯文本文件.
FileInputStream && FileOutputStream
1. 普通的字节流一次读写一个字节.
2. 普通的字节流一次读写一个字节数组. //掌握 BufferedInputStream && BufferedOutputStream
3. 高效的字节流一次读写一个字节. //掌握
4. 高效的字节流一次读写一个字节数组. InputStreamReader && OutputStreamWriter
5. 转换流一次读写一个字符.
6. 转换流一次读写一个字符数组. FileReader && FileWriter
7. 普通的字符流一次读写一个字符.
8. 普通的字符流一次读写一个字符数组. BufferedReader && BufferedWriter
9. 高效的字符流一次读写一个字符.
10. 高效的字符流一次读写一个字符数组.
11. 高效的字符流一次读写一行. //掌握 需求2: 拷贝任意类型的文件.
1. 普通的字节流一次读写一个字节.
2. 普通的字节流一次读写一个字节数组.
3. 高效的字节流一次读写一个字节.
4. 高效的字节流一次读写一个字节数组.
*/
public class Demo05 {
public static void main(String[] args) throws IOException {
//1. 创建输入流, 关联数据源文件.
BufferedReader br = new BufferedReader(new FileReader("day12/data/1.txt"));
//2. 创建输出流, 关联目的地文件.
BufferedWriter bw = new BufferedWriter(new FileWriter("day12/data/2.txt"));
//3. 定义变量, 用来记录读取到的数据(一行数据).
String line;
//4. 循环读取, 只要条件满足, 就一直读, 并将读取到的数据赋值给变量.
while ((line = br.readLine()) != null) {
//5. 将读取到的数据写入到目的地文件中.
bw.write(line);
//核心细节: 千万别忘记加换行, 因为readLine()方法结束标记是换行符, 但是该方法不获取换行符.
bw.newLine();
}
//6. 关流, 释放资源.
br.close();
bw.close();
}
}

Java 复习整理day08的更多相关文章

  1. java 复习整理(一 java简介和基础语法)

    现在公司用的是封装太多东西的平台开发,觉着之前学的东西很多都忘了,所以想好好总结回顾一下.之前总是想学很多编程语言像python.s6.node.react,但现在越来越体会到编程语言只是一个开发的工 ...

  2. java复习整理(六 异常处理)

    一.异常简介  在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性.        ...

  3. java 复习整理(五 类加载机制与对象初始化)

    类加载机制与对象初始化   一 . 类加载机制 类加载机制是指.class文件加载到jvm并形成Class对象的机制.之后应用可对Class对象进行实例化并调用.类加载机制可在运行时动态加载外部的类, ...

  4. java 复习整理(四 String类详解)

    String 类详解   StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上S ...

  5. java 复习整理(三 修饰符)

    访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为default,在同一包内可见,不使用任何修饰符. 私有的,以pr ...

  6. java 复习整理(二 数据类型和几种变量)

    源文件声明规则 当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则. 一个源文件中只能有一个public类 一个源文件可以有多个非public类 源文件的名 ...

  7. Java 复习整理day10

    package com.it.demo01_quickstart; /* 案例: 讲解网络编程相关概念. 网络编程简介: 概述: 网络编程也叫: 套接字编程, Socket编程, 就是用来实现 网络互 ...

  8. Java 复习整理day09

    package com.it.demo01_thread; /* 案例: 多线程简介. 概述: 指的是进程有多条执行路径, 统称叫: 多线程. 进程: 指的是可执行程序, 文件(例如: .exe) 大 ...

  9. Java 复习整理day07

    package com.it.demo05_innerclass; /* 案例: 演示内部类入门. 概述: 所谓的内部类指的是类里边还有一个类, 里边那个类叫: 内部类, 外边那个类, 叫外部类. 分 ...

随机推荐

  1. spark-streaming-连接kafka的两种方式

    推荐系统的在线部分往往使用spark-streaming实现,这是一个很重要的环节. 在线流程的实时数据一般是从kafka获取消息到spark streaming spark连接kafka两种方式在面 ...

  2. 感谢 Gridea,让我有动力写作

    1. 真的要感谢 Gridea,让我对写作产生热忱.一直有在各大博客平台输出的习惯,但是都没有持续更新.有的平台广告太多,写不下去.有的平台排版复杂,写文章1个小时,排版要2个小时.所以后面换成了静态 ...

  3. Mac安装Go语言

    正文 安装 安装我们使用 HomeBrew ,其使用方法详见我的上一篇博文 brew install go 配置环境变量 Go1.3及以后版本跳过以下步骤 进入变量文件 cd ~ vim .bash_ ...

  4. d3 zoom 抖动问题 事件

    最近在使用d3 zoom得时候   遇到一个小坑 直接对元素添加 zoom事件 会有很大得抖动,查文档 看代码之后发现是 由于元素在不断变化, 所以计算基础值也不不断变化,所以会导致计算出来得值 忽大 ...

  5. 【JDBC核心】操作 BLOB 类型字段

    操作 BLOB 类型字段 MySQL BLOB 类型 MySQL 中,BLOB 是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据. 插入 BLOB 类型的数据必须使用 Pre ...

  6. docker 数据卷的挂载和使用

    容器之间的数据共享技术, Docker容器产生的数据同步到本地 卷技术 --> 目录挂载, 将容器内的目录挂载到服务器上 使用命令来挂载 -v # 可以挂载多个目录 docker run -it ...

  7. 【ORA】Specified value of MEMORY_TARGET is too small, needs to be at least 3072M解决办法

    今天安装EM12C的时候遇到了一个报错: 修改好数据库中的参数大小后,重新启动报错 Specified value of MEMORY_TARGET is too small, needs to be ...

  8. CTFshow萌新赛-web签到

    打开靶机 查看页面信息 可以看到有一个system函数 在Linux中可以使用":"隔离不同的语句 payload如下 https://5105c8b6-83aa-4993-91b ...

  9. 写给 Linux 初学者的一封信

    大家好,我是肖邦. 这篇文章是写给 Linux 初学者的,我会分享一些作为初学者应该知道的一些东西,这些内容都是本人从事 Linux 开发工作多年的心得体会,相信会对初学者有所帮助.如果你是 Linu ...

  10. floating point

    记录浮点数的单精度和双精度(IEEE754) 1.单精度(float) ​ 1.定义:单精度占4字节/32位,其中1号位符号位,其次是8位阶码/指数(阶符+阶数),23位尾数(小数). 2.双精度(d ...