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;
            }
        }
    }
}

### 黑马程序员 Java 并发编程 笔记 Java并发编程是一个复杂而重要的主题,涵盖了多线程、同步机制以及高级并发工具等内容。对于希望深入理解这一领域的人来说,找到合适的资源至关重要。 #### 多线程基础概念 在Java中,创建新线程可以通过继承`Thread`类或实现`Runnable`接口来完成。每种方法都有其特点和适用场景[^1]。例如: ```java // 继承 Thread 类的方式 class MyThread extends Thread { @Override public void run() { System.out.println("子线程运行"); } } // 实现 Runnable 接口的方式 class MyRunnable implements Runnable { @Override public void run() { System.out.println("通过 Runnable 创建的子线程"); } } ``` #### 同步控制与锁机制 为了防止多个线程同时访问共享数据而导致的数据不一致问题,可以采用内置锁(`synchronized`)或者显式的锁对象如`ReentrantLock`来进行同步控制[^2]。下面展示了一个简单的自定义锁的例子: ```java public class SpinLock { private final AtomicReference<Thread> atomicReference = new AtomicReference<>(); public void lock() { Thread current = Thread.currentThread(); while (!atomicReference.compareAndSet(null, current)) {} } public void unlock() { Thread current = Thread.currentThread(); atomicReference.compareAndSet(current, null); } } ``` #### 高级并发特性 除了基本的线程管理和同步外,Java还提供了诸如`ExecutorService`框架用于管理线程池;`CountDownLatch`, `CyclicBarrier`等协调器帮助不同线程之间协作;还有像`CompletableFuture`这样的异步处理API。 #### 学习建议 针对想要系统化掌握Java并发编程的学习者来说,《黑马程序员》系列教程是非常好的起点之一。该套教材不仅覆盖了上述提到的基础知识点,还包括了许多实际项目案例分析,有助于加深理解和应用能力。此外,在线平台上的相关视频课程也值得推荐给初学者作为辅助材料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Taverry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值