当前位置: 首页 > news >正文

Javase 基础加强 —— 08 IO流

本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。

01 概述

在这里插入图片描述

内存和磁盘有啥区别呀?

  • 内存(RAM,随机访问存储器):是计算机中运行程序时临时存储数据的地方。程序运行时,代码和数据会从硬盘加载到内存里,然后CPU直接从内存读写数据,速度非常快。
  • 磁盘(硬盘,HDD或固态硬盘SSD):是计算机长期存储数据的地方,保存操作系统、程序、图片、视频等文件。断电后数据依然保留,容量通常比内存大很多。

02 IO 流的体系

在这里插入图片描述

  • 字节输入流InputStream(读字节数据的)
  • 字节输出流OutputStream(写字节数据出去的)
  • 字符输入流Reader(读字符数据的)
  • 字符输出流Writer(写字符数据出去的)

03 文件字节输入流

在这里插入图片描述

FileInputstream(文件字节输入流) 是以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。

在这里插入图片描述

package FileDemo;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;public class InputStreamDemo1 {public static void main(String[] args) throws Exception {//目标:文件字节输入流//1.创建文件字节输入流管道,接通源文件//a.绝对路径//InputStream is = new FileInputStream(new File("E:\\JAVA\\javase0331\\0416-oop\\src\\FileDemo\\name.txt"));//b.相对路径InputStream is = new FileInputStream(new File("0416-oop\\src\\FileDemo\\name.txt"));//2.读取文件字节,输出//a.一个一个读int b;while((b = is.read()) != -1){System.out.print((char) b);}//b.一批一批读byte[] buffer = new byte[3];int len;while((len = is.read(buffer)) != -1){String str = new String(buffer, 0, len);System.out.print(str);}//注:存在截断文字3字节的隐患!可以一次性读完所有字节以避免该问题。//3.关闭文件字节输出流is.close();}
}

04 文件字节输出流

在这里插入图片描述

在这里插入图片描述

package FileDemo;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;public class OutputStreamDemo1 {public static void main(String[] args) throws Exception {//目标:文件字节输出流//1.创建文件字节输出流管道,接通目标文件//OutputStream os = new FileOutputStream(new File("0416-oop\\src\\FileDemo\\name2.txt"));//true代表数据追加OutputStream os = new FileOutputStream(new File("0416-oop\\src\\FileDemo\\name2.txt"), true);//2.写入数据,输出os.write(97);os.write('a');os.write("\r\n".getBytes());byte[] bytes = "我爱你中国666".getBytes();os.write(bytes);os.write("\r\n".getBytes());os.write(bytes, 0, 3);os.write("\r\n".getBytes());//3.关闭文件字节输出流os.close();}
}

os.write("\r\n".getBytes());啥意思?

  • "\r\n" 是回车换行符,也就是 Windows 系统的换行表示(Carriage Return + Line Feed)
  • "".getBytes() 是把这个字符串转换成字节数组(byte[]),因为 os.write() 方法需要的是字节数组。
  • os 是一个输出流(OutputStream),通过 write(byte[] b) 方法向流中写入数据。

05 案例:文件复制

在这里插入图片描述

package FileDemo;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;public class CopyDemo {public static void main(String[] args) {//目标:文件复制//源文件:E:\JAVA\IMG_4623.jpg//目标文件:D:\IMG_4623.jpgtry{copyFile("E:\\JAVA\\IMG_4623.jpg","D:\\IMG_4623.jpg");}catch (Exception e){e.printStackTrace();}}public static void copyFile(String srcPath, String destPath) throws Exception {//1.创建文件字节输入输出流管道FileInputStream fis = new FileInputStream(srcPath);FileOutputStream fos = new FileOutputStream(destPath);//2.读取一个字节数组,写入一个字节数组byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer)) != -1){fos.write(buffer, 0, len); //读多少,倒多少}System.out.println("复制成功!");//3.非专业关闭fos.close();fis.close();}
}

任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字节,只要复制后的文件格式一致就没问题!

06 资源释放

Ctrl + Alt + T召唤try/catch

package FileDemo;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class CopyDemo {public static void main(String[] args) {//目标:文件复制//源文件:E:\JAVA\IMG_4623.jpg//目标文件:D:\IMG_4623.jpgcopyFile("E:\\JAVA\\IMG_4623.jpg","D:\\IMG_4623.jpg");}public static void copyFile(String srcPath, String destPath){FileInputStream fis = null;FileOutputStream fos = null;try {//1.创建文件字节输入输出流管道fis = new FileInputStream(srcPath);fos = new FileOutputStream(destPath);//2.读取一个字节数组,写入一个字节数组byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer)) != -1){fos.write(buffer, 0, len); //读多少,倒多少}System.out.println("复制成功!");} catch (IOException e) {e.printStackTrace();} finally {//3.专业关闭(臃肿)try {if(fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}try {if(fis != null) fis.close();} catch (IOException e) {e.printStackTrace();}}}
}

finally代码区的特点为,无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止,其一般用于在程序执行完成后进行资源的释放操作(专业级做法)。

public static void copyFile(String srcPath, String destPath){try (//1.创建文件字节输入输出流管道FileInputStream fis = new FileInputStream(srcPath);FileOutputStream fos = new FileOutputStream(destPath);){//2.读取一个字节数组,写入一个字节数组byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer)) != -1){fos.write(buffer, 0, len); //读多少,倒多少}System.out.println("复制成功!");} catch (IOException e) {e.printStackTrace();}
}

注:()中只能放资源,否则报错,而资源一般是指最终实现了AutoCloseable接口。

在这里插入图片描述

07 文件字符输入流

FileReader文件字符输入流是以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。

在这里插入图片描述

package FileDemo;import java.io.FileReader;
import java.io.Reader;public class FileReaderDemo1 {public static void main(String[] args) {//目标:文件字符输入流//1.创建文件字符输入流管道try (Reader f1 = new FileReader("0416-oop\\src\\FileDemo\\name.txt")) {//2.定义一个字符数组,一次读取多个字符char[] chars = new char[3];int len;while((len = f1.read(chars)) != -1){String str = new String(chars, 0, len);System.out.print(str); //不要换行!}}catch (Exception e){e.printStackTrace();}}
}

注:文件字符输入流一次读取多个字符,按照字符读取中文,性能好,速度高。

08 文件字符输出流

FileWriter文件字符输出流是以内存为基准,把内存中的数据以字符的形式写出到文件中去。

在这里插入图片描述

在这里插入图片描述

package FileDemo;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class FileWriterDemo1 {public static void main(String[] args) {try {//1.创建文件字符输出流管道Writer w1 = new FileWriter("0416-oop\\src\\FileDemo\\name2.txt");//2.写一个字符w1.write(98);w1.write('c');w1.write('戈');//3.写一个字符串w1.write("java");w1.write("亲爱的你躲在哪里发呆");//4.写一个字符数组char[] chars = "javaWeb".toCharArray();w1.write(chars);w1.write(chars, 0, 3);//5.刷新内存缓冲区//w1.flush(); //嘿嘿,上面()自动关闭流} catch (IOException e) {e.printStackTrace();}}
}

注:字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效。

在这里插入图片描述

注:刷新后,流可以继续使用,关闭后,流不能继续使用。

http://www.xdnf.cn/news/646057.html

相关文章:

  • 林曦词典|创造力
  • 第3章 Java的基本成设计结构
  • Python 程序如何高效地调试
  • 使用Python从GHCN-Daily数据库下载和处理历史天气数据:完整指南
  • 单调栈(c++)
  • 布谷鸟过滤器 (Cuckoo Filter)
  • 健康密码:解锁现代养生新法则
  • 嵌入式学习 D27:系统编程--进程
  • 代码中数据类型如何去理解并正确
  • 150MB/3s传输+2K画质:这款远程桌面工具重新定义开源性能
  • 历年华东师范大学保研上机真题
  • Selenium 测试框架 - C#
  • Thread类的基本用法
  • DOM事件的传播机制
  • 贪心算法应用:最大匹配问题详解
  • Ollama学习1:安装、命令、API
  • C++语言入门————高精度计算
  • 基于RK3568处理器实现8路CAN总线PLC解决方案
  • numpy执行无缘无故崩溃 没有报错
  • Autodl训练Faster-RCNN网络--自己的数据集(二)
  • PCB文件从 Allegro 24.1 降级保存为 Allegro 17.4版本格式
  • 李沐《动手学深度学习》| 4.4 模型的选择、过拟合和欠拟合
  • Mujoco 学习系列(六)官方教程 The introductory tutorial teaches MuJoCo basics
  • 53页 @《人工智能生命体 新启点》中國龍 原创连载
  • Learning Transferable Visual Models From Natural Language Supervision
  • 国内云平台RTX 5090租赁及LLM微调推荐
  • 系统编程day04
  • 分库分表深度解析
  • Go语言Map的底层原理
  • springboot 控制层调用业务逻辑层,注入报错,无法自动装配 解决办法