十三、IO流
1、File
1、概述及构造方法
File:它是文件和目录路径名的抽象表示
-
文件和目录可以通过File封装成对象
-
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已,它是可以存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
2、File类创建功能
createNewFile mkdir mkdirs
3、File类判断和获取功能
4、删除功能
5、递归
注意:递归解决问题要找到两个内容
- 递归出口:否则会抽象内存溢出
- 递归规则:与原问题相似的规模较小的问题
6、【案例】递归就阶乘
需求:用递归求5的阶乘,并把结果在控制台输出
【案例】变量目录
2、字节流
import java.io.FileOutputStream;
1、字节流写数据
2、字节流写数据得3种方式
3、字节流写数据的两个小问题
4、字节流写数加异常处理
5、字节流读数据(一次读一个字节数据)
int by;
while(by = fis.read()!=-1){
fos.write(by);
}
【字节流复制文本文件】(一次读一个字节数据)
// 根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("E:\\itcast\\01.txt");
// 根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("myByteStream\\02.txt");
// 读写数据
int by;
while(by = fis.read()!=-1){
fos.write(by);
}
// 释放资源
fos.close();
fis.close();
6、字节流读数据(一次读一个字节数组数据)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZZKh2zBT-1660402513436)(C:\Users\土大夫\AppData\Roaming\Typora\typora-user-images\1649236242316.png)]
btye[] bys = new byte[1024]; // 1024及其整数倍
int len;
while(len=fis.read(bys)!=-1){
System.out.print(new String(bys, 0, len));
}
fis.close();
【字节流复制图片】
// 根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("E:\\itcast\\01.jpg");
// 根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("myByteStream\\02.jpg");
// 读写数据
btye[] bys = new byte[1024]; // 1024及其整数倍
int len;
while(len=fis.read(bys)!=-1){
System.out.print(new String(bys, 0, len));
}
// 释放资源
fos.close();
fis.close();
7、字节缓冲流
【复制视频】
需求:把E:\\itcast\\字节流复制图片.avi 复制到模块目录下的字节流复制图片.avi
public class CopyAviDemo{
public static void main(String[] args){
// 记录开始时间
long startTime = System.currentTimeMillis();
// 复制视频
method1();
// 记录结束时间
long endTime = System.currenTimeMillis();
System.out.println("共耗时:"+(endTime-startTime)+"毫秒");
}
// 1、基本字节流一次读写一个字节————耗时64565毫秒
public static void method1() throws IOException{
FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
FileOutputStream fos = new FileOutputStream("myByteStream\\字节流复制图片.avi");
int by;
while(by=fis.read()!=-1){
fos.write(by);
}
fos.close();
fis.close();
}
// 2、基本字节流一次读写一个字节数组————耗时107毫秒
public static void method1() throws IOException{
FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
FileOutputStream fos = new FileOutputStream("myByteStream\\字节流复制图片.avi");
btye[] bys = new byte[1024]; // 1024及其整数倍
int len;
while(len=fis.read(bys)!=-1){
System.out.print(new String(bys, 0, len));
}
fos.close();
fis.close();
}
// 3、字节缓冲流流一次读写一个字节————耗时405毫秒
public static void method3() throws IOException{
BufferedInputStream bis = new BufferedTimeMillis(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
BufferedInputStream bos = new BufferedTimeMillis(new FileOutputStream("myByteStream\\字节流复制图片.avi"));
int by;
while(by=fis.read()!=-1){
fos.write(by);
}
fos.close();
fis.close();
}
// 4、字节缓冲流流一次读写一个字数组————耗时60毫秒
public static void method3() throws IOException{
BufferedInputStream bis = new BufferedTimeMillis(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
BufferedInputStream bos = new BufferedTimeMillis(new FileOutputStream("myByteStream\\字节流复制图片.avi"));
byte[] bys = new byte[1024];
int len;
while(len=bis.read(bys)!=-1){
bos.write(bys, 0, len);
}
fos.close();
fis.close();
}
}
3、字符流
1、由于字节流操作中文不是特别方便,所有java就提供字符流
- 字符流=字节流+编码表
- 汉字在存储时,无论选择哪种编码存储,第一个字节都是负数
2、编码表
- ASCII字符集
- GBXXX字符集(如:GB2312、GBK、GB18030)
- Unicode(如:UTF-8)
3、编码解码
4、字符流中的编码解码问题
5、字符流写数据的5种方式
flush(); // 刷新后才有数据,不然数据就是在缓冲区
close(); // 关闭流前会自动刷新
6、字符流读数据的2种方式
4、特殊操作流
1、标准输入输出流
输入流:
输出流:
2、打印流
- 字节打印流:PrintStream
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 字符打印流:PrintWriter
- PrintWrite(String fileName):使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新
- PrintWriter(Write out,boolean autoFlush):创建一个新的PrintWriter,out是字符输出流,autoFlush是一个布尔值,如果为真,则println,printf,或format方法将刷新输出缓冲区
3、对象序列化流
5、properties
-
是一个Map体系的集合类
-
properties可以保存到流中或从流中加载
properties方法
properties与IO流相结合的方法
【案例:游戏次数】
请写程序实现草数字小游戏只能试玩3次,如果还想玩,提示:游戏试玩已结束,想玩请充值(www.itcast.cn)
package test;
import java.io.*;
import java.util.Arrays;
import java.util.Properties;
public class test2 {
public static void main(String[] args) throws IOException{
// 从文件中读取数据数据到properties集合,用load()方法实现
Properties prop = new Properties();
FileReader fr = new FileReader("src//test//game.txt");
prop.load(fr);
fr.close();
// 通过Properties集合获取到玩游戏的次数
String count = prop.getProperty("count");
int number = Integer.parseInt(count);
// 判断次数是否到3次了
if (number >= 3){
// 如果到了,给出提示,游戏试玩已结束,想玩请充(www.itcast.cn)
System.out.println("游戏试玩已结束,想玩请充(www.itcast.cn)");
}else {
GuessNumber.start();
// 次数+1,重新写回文件,用Properties的store()方法实现
number++;
prop.setProperty("count", String.valueOf(number));
FileWriter fw = new FileWriter("src//test//game.txt");
prop.store(fw, null);
fw.close();
}
}
}
GuessNumber.java
package test;
import java.util.Random;
import java.util.Scanner;
public class GuessNumber {
private GuessNumber(){
}
public static void start(){
Random r = new Random();
int number = r.nextInt(100) + 1;
while (true){
Scanner sm.out.println("你猜的数字"+guessNumber+"小了");
}else {
System.out.println("恭喜你猜中了");
break;
}
}
}
}