b站黑马程序员java视频学习笔记08

十三、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;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Taverry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值