Java学习day20-21-IO流

2024-02-28 14:20
文章标签 java 学习 21 io day20

本文主要是介绍Java学习day20-21-IO流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IO流

  • 今日目标
    • 一.File类
    • 二.字节流
        • 1.字节输入流
        • 2.字节输出流
    • 三.字符流(day21)
        • 1.字符输入流
        • 2.字符输出流
    • 四.其它流--扩展
        • 1.缓冲流
        • 2.转换流
        • 3.数据流
        • 4.对象流
    • 作业

今日目标

  • File类
  • 字节流
    • 字节输入流
    • 字节输出流
  • 字符流
    • 字符输入流
    • 字符输出流
  • 缓冲区流
  • 对象流

一.File类

​ File类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。

File对象代表磁盘中实际存在的文件和目录。通过以下构造方法创建一个File对象。

  • 常用构造方法
new File(File parent,String child );
new File(String parent,String child);
new File(String pathName);
 @Test//File可以表示文件,或文件夹public void test1(){//方式1:文件完整的路径File file1 = new File("C:\\Users\\Public\\Pictures\\Sample Pictures/妲己.jpg");//方式2:拆分为文件夹路径和文件路径File file2 = new File("C:\\Users\\Public\\Pictures\\Sample Pictures/","妲己.jpg");//表示一个文件夹File f = new File("C:\\Users\\Public\\Pictures\\Sample Pictures/");//方式3:文件夹对象和文件路径File file3 = new File(f, "妲己.jpg");}
  • 常用方法
方法名描述
String getName()获取文件(夹)名
String getPath()获取文件(夹)路径
boolean exists()文件(夹)是否存在
boolean isFile()是否是一个文件
boolean isDirectory()是否是一个目录(文件夹)
boolean createNewFile()创建一个文件
boolean mkdir()创建一个具体的文件夹
boolean mkdirs()创建多级文件夹
boolean delete()删除某个文件(夹)
String [] list()返回某个文件夹下的所有文件(夹)名
File [] listFiles()获取某个文件夹下所有的文件(夹)
 File filex = new File("D:\\imgs\\a.jpg");File file = new File("D:\\imgs/a.jpg");File file1 = new File("D:\\imgs/","a.jpg");File f = new File("D:\\imgs/");File file2=new File(f,"a.jpg");System.out.println(f.getName());System.out.println(filex.getName());System.out.println(file.getName());System.out.println("------获取文件(夹)路径");System.out.println(file.getPath());System.out.println("------文件(夹)是否存在");System.out.println(file.exists());System.out.println("-------是否是一个文件");System.out.println(filex.isFile());System.out.println(f.isFile());System.out.println("---------是否是一个目录(文件夹)");System.out.println(f.isDirectory());System.out.println(filex.isDirectory());

在这里插入图片描述

在这里插入图片描述

System.out.println("---------创建一个文件");File f1 = new File("D:\\imgs/a1.txt");f1.createNewFile();System.out.println("---------创建一个具体的文件夹");File f2 = new File("D:\\imgs/a2");f2.mkdir();System.out.println("---------创建多级文件夹");File f3 = new File("D:\\imgs/a3/b3");f3.mkdirs();

在这里插入图片描述

  System.out.println("删除某个文件(夹)");f2.delete();System.out.println("返回某个文件夹下的所有文件(夹)名");System.out.println(Arrays.toString(f.list()));//Arrays.stream(f.list()).forEach(System.out::println);System.out.println("----------获取某个文件夹下所有的文件(夹)");File[] files = f.listFiles();for (File file3 : files) {System.out.println(file3);}System.out.println("---------");

在这里插入图片描述
在这里插入图片描述

案例:

1.输出jdk安装目录下,所有的文件(夹)名称,并说明该文件是一个文件或文件夹。
(遍历文件夹)

public static void show(File f){File[] files = f.listFiles();for (File file : files) {if (file.isDirectory()){System.out.println(file.getName()+"是一个文件夹");show(file);}else {System.out.println(file.getName()+"是一个文件");}}}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.cmd黑窗口切换到某个目录下,输入以下命令,查看效果:

dir *.* >a.txt
dir *.* /b >b.txt
dir *.* /s >c.txt
dir *.* /b /s >d.txt

​ 以上命令还可以写在记事本中,然后改后缀名为bat,双击运行即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.使用递归,输出某个文件夹下所有的文件,以及子文件夹中所以的文件。

public void showFile(File f){if(f.isDirectory()){//文件夹System.out.println(f.getName()+":是一个文件夹:");File[] files = f.listFiles();for (File file : files) {showFile(file);//递归:调用自己}}else {//文件System.err.println(f.getName()+":是一个文件");}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJvIL7v4-1608894894873)(imgs/image-20201104163012878.png)]

二.字节流

1.字节输入流
  • 构造方法
new FileInputStream(String文件路径);
new FileInputStream(File文件对象);
  • 使用步骤
1.创建输入流流对象
2.调用read方法//具有记忆功能,读出边界会返回-1
3.关闭流对象
  • read方法:从字节输入流中读取数据
//无参,返回一个字节,表示读取一个字节数据int read() 
//传入一个字节数组,表示将读到的字节存入数组中,返回存入的字节个数int read(byte[] bytes) 
//传入一个字节数组,数组下标,存放个数,表示将读到的字节存入数组,从数组的第off+1个元素开始存放,共存放len个。返回实际存入的字节个数。int read(byte[] b,int off,int len)
  • 常用方法
//返回字节输入流中还有多少个可以读取的字节个数
int available();
 public void test5() throws IOException {File f1 = new File("D:\\imgs\\a3.txt");//a3只有五个字符长度System.out.println(f1.exists());FileInputStream fis = new FileInputStream(f1);for (int i=0;i<6;i++){int r=fis.read();//一个一个读取System.out.println(r);}}

在这里插入图片描述

 @Test//测试字节输入流--一次读一个字节public void test1() throws  IOException {//绝对路径File f1 = new File("D:\\imgs\\a3.txt");System.out.println(f1.exists());FileInputStream fiss = new FileInputStream(f1);fiss.read();int a1=fiss.available();System.out.println("还有"+a1+"个没有读完");fiss.read();int a2=fiss.available();System.out.println("还有"+a2+"个没有读完");System.out.println("------");File f2 = new File("D:\\imgs\\a3.txt");System.out.println(f2.exists());//1.构建一条通向文件f2的管道--流对象FileInputStream fis = new FileInputStream(f2);//2.调用方法int l=fis.available();for (int i = 0; i <l ; i++) {System.out.println(fis.read());}//关闭资源fis.close();}

在这里插入图片描述

 @Test//测试字节输入流--一次读多个字节public void test2() throws  IOException {//相对路径File f1 = new File("D:\\imgs\\a3.txt");System.out.println(f1.length());//5//1.构建一条通向文件f1的管道--流对象FileInputStream fis = new FileInputStream(f1);//2.调用方法 --根据文件的字节长度,去构建一个相同长度的数组byte[] bs = new byte[fis.available()];//读取到文件中的字节数据,存入数组中,返回读到的实际字节个数int r = fis.read(bs);int r2 = fis.read(bs);System.out.println(Arrays.toString(bs));System.out.println(r);//5System.out.println(r2);//-1//关闭资源fis.close();}

在这里插入图片描述

@Test//测试字节输入流--在第2个方法基础上截取public void test3() throws Exception {//直接构建流对象FileInputStream fis = new FileInputStream("D:\\imgs\\a3.txt");//调用read方法byte[] bs = new byte[fis.available()];System.out.println(Arrays.toString(bs));int r = fis.read(bs,1,3);//都是从第一个开始读,读3个,放到bs下标为1的位置//输出字节数组System.out.println(Arrays.toString(bs));}

在这里插入图片描述

 @Test//案例public void test4()throws Exception{FileInputStream fis = new FileInputStream("D:\\imgs\\a3.txt");//调用read方法byte[] bs = new byte[fis.available()];int r = fis.read(bs);//输出字节数组System.out.println(Arrays.toString(bs));System.out.println(new String(bs));}

在这里插入图片描述

案例:

创建一个文本文件,写入:
i am a good boy,so nothing is gonna change my love for you ,making love out of nothing at all   
使用字节输入流读取该文件内容,并输出。
 @Testpublic void tests() throws IOException {FileInputStream fis = new FileInputStream("D:\\imgs\\a4.txt");byte[] bs = new byte[fis.available()];fis.read(bs);System.out.println(Arrays.toString(bs));System.out.println(new String(bs));}

在这里插入图片描述
找到文件,将其另存为,格式改为UTF-8即可
在这里插入图片描述
再次运行
在这里插入图片描述

2.字节输出流
  • 构造方法
new FileOutputStream(String);
new FileOutputStream(String,Boolean);
new FileOutputStream(File);
new FileOutputStream(File,Boolean);
  • 使用步骤
1.创建输出流对象
2.调用write方法
3.关闭流对象
  • write方法:向字节输出流中写入数据
	//写入一个字节数据b
void write(int b); //将字节数组b写入输出流中
void write(byte[] b);//从字节数组b的第off+1个元素开始,向输出流中写入len个字节
void write(byte[] b,int off,int len);
 FileOutputStream fos = new FileOutputStream("src/b.txt");//相对路径//写一个字节int a=996,a1=97;byte b=(byte)a;byte b1=(byte)a1;System.out.println(b);System.out.println(b1);fos.write(b);fos.write(b1);

在这里插入图片描述
在这里插入图片描述

  //写一个字节数组os.write(("I know,I'm not good enough, but I'm the only one in the world. " +"Please cherish it.我知道,我不是最好的," +"但我是这个世界上独一无二的,请珍惜!").getBytes());

在这里插入图片描述

 //写一个字节数组 的 部分数据os.write(("I know,I'm not good enough, but I'm the only one in the world. " +"Please cherish it.我知道,我不是最好的," +"但我是这个世界上独一无二的,请珍惜!").getBytes(),2,4);

在这里插入图片描述

案例

将下面的语句写入一个文本文件中:
I know,I'm not good enough, but I'm the only one in the world. Please cherish it.
 FileOutputStream os = new FileOutputStream("src/b.txt");//写一个字节数组os.write(("I know,I'm not good enough, but I'm the only one in the world. " +"Please cherish it.我知道,我不是最好的," +"但我是这个世界上独一无二的,请珍惜!").getBytes());

扩充:带缓冲区字节输入流和输出流

BufferedInputStream
BufferedOutputStream    
//对比FileInputStream和FileOutputStream,测试读或写10000次的耗时    
 @Test//对比测试带缓冲区的字节流和文件字节流的读写效率public void test3() throws Exception {FileInputStream fis = new FileInputStream("src/a.txt");FileInputStream fis2 = new FileInputStream("src/c.txt");FileOutputStream fos = new FileOutputStream("src/b.txt");FileOutputStream fos2 = new FileOutputStream("src/d.txt");BufferedInputStream bis = new BufferedInputStream(fis2);BufferedOutputStream bos = new BufferedOutputStream(fos2);BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream("src/c.txt"));BufferedOutputStream bos1 = new BufferedOutputStream(new FileOutputStream("src/d.txt"));long l1 = System.currentTimeMillis();while (fis.available()>0){fos.write(fis.read());}long l2 = System.currentTimeMillis();while (bis.available()>0){bos.write(bis.read());}bos.close();//刷新缓冲区long l3 = System.currentTimeMillis();System.out.println(l2-l1);System.out.println(l3-l2);}

案例2–复制文件

​ 结合字节输入流和输出流,边读边写,将某个文件复制到磁盘另一个位置。

2种方式:

  • 创建一个比较大的数组,将输入流中所有的数据读取到数组中,再将数组中所有的数据一次写入输出流
  • 结合while循环,一次读一个字节,写一个字节,边读边写。
//将a3.txt的数据传入到b.txt中File f1 = new File("D:\\imgs\\a3.txt");FileInputStream fis = new FileInputStream(f1);byte[] bs = new byte[fis.available()];fis.read(bs);FileOutputStream fos1 = new FileOutputStream("src/b.txt");fos1.write(bs);

在这里插入图片描述

@Testpublic void test2() throws Exception {//需要两个流FileInputStream is = new FileInputStream("src/a.txt");//第二个参数:true表示在原来的后面追加,而不是覆盖FileOutputStream os = new FileOutputStream("src/b.txt",true);//方式一:/*while (is.available()>0){os.write(is.read());}*///方式2:/*int l=is.available();for (int i = 0; i <l ; i++) {os.write(is.read());}*///方式3int r=-1;while ((r=is.read())!=-1){os.write(r);}}

回顾
在这里插入图片描述

三.字符流(day21)

读写字符数据文件:txt文件

1.字符输入流
  • 构造方法
new FileReader(String);
new FileReader(File);
 		File file = new File("D:\\imgs\\a3.txt");FileReader fr1 = new FileReader(file);FileReader fr = new FileReader("day21-java21\\src/a1.txt");
  • 使用步骤
1.构建流对象
2.调用read方法
3.关闭流对象
  • read方法:从字符输入流中读取字符数据
	//读取一个字符,并返回读到的字符,如果没有读到,返回-1
int read();//读取到的字符存入字符数组c
read(char[] c);//读取到的字符存入字符数组c,从下标offset开始,个数为len
read(char[] c,int offset,int len);

在这里插入图片描述
在这里插入图片描述

 FileReader fr = new FileReader("day21-java21\\src/a1.txt");System.out.println(fr.read());System.out.println(fr.read());System.out.println(fr.read());System.out.println("------");FileReader fr2 = new FileReader("day21-java21\\src/a.txt");char[] cs = new char[6];fr2.read(cs);//这里如果换成System.out.println(fr2.read(cs));结果会是6,表示读取的长度System.out.println(cs);System.out.println("------");FileReader fr3 = new FileReader("day21-java21\\src/a.txt");char[] cs1 = new char[24];fr3.read(cs1,10,5);System.out.println(cs1);

在这里插入图片描述

案例

创建一个文本文件,写入:空山不见人,但闻人语响。返景入深林,复照青苔上。
使用字符输入流读取文本内容,输出在控制台。
输出效果如下:
空山不见人,
但闻人语响。
返景入深林,
复照青苔上。
 FileReader fr4 = new FileReader("day21-java21\\src/a.txt");char[] cs2 = new char[6];while (fr4.read(cs2)!=-1){System.out.println(cs2);}

在这里插入图片描述

2.字符输出流

对于字符流 一般写入的时候想要马上看到一般需要flush(),
close()和flush()的区别?
A:close()关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续再使用了。
B:flush()仅仅是刷新缓冲区(一般写字符时要用,因为字符是先进入的缓冲区),流对象还可以继续使用

  • 构造方法
new FileWriter(String);
new FileWriter(String,boolean);//boolean不填,默认是false,true表示在原来的后面追加,而不是覆盖
new FileWriter(File);
new FileWriter(File,boolean);
 FileWriter fw = new FileWriter("day21-java21\\src/a1.txt");File file = new File("day21-java21\\src/a1.txt");FileWriter fw1 = new FileWriter(file);
  • write方法:向字符输出流中写入字符数据
//写入一个字符void write(int c) 
//写入一个字符串void write(String str)
//写入一个字符数组void write(char[] c)
//写入一个字符串,从off开始,写len个void write(String str,int off,int len)
//写入一个字符数组,从off开始,写len个void write(char[] c,int off,int len)
FileWriter fw = new FileWriter("day21-java21\\src/a1.txt",true);fw.write(97);//afw.write("Hello,你好");char[] cs = new char[10];fw.write(cs);fw.write("123456",2,4);//3456char[] cs1 = {'1', '2', '3', '4', '5', '6', '7', '8'};fw.write(cs1,3,4);//4567fw.close();//关闭,不关闭将看不到数据的写入

在这里插入图片描述

案例

请把下面的话写入一个文本文件中:昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否,知否?应是绿肥红瘦。
 FileWriter fw2 = new FileWriter("day21-java21\\src/a1.txt");fw2.write("昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否,知否?应是绿肥红瘦。");fw2.close();

四.其它流–扩展

1.缓冲流
  • BufferedInputStream

  • BufferedOutputStream

  • BufferedReader

  • BufferedWriter
    在这里插入图片描述

 @Testpublic void test2() throws IOException {FileWriter fw = new FileWriter("src/a1.txt");BufferedWriter bw = new BufferedWriter(fw);bw.write("昨夜雨疏风骤,浓睡不消残酒。");bw.newLine();//换行bw.write("试问卷帘人,却道海棠依旧。知否,知否?应是绿肥红瘦。");bw.close();// bw.flush();也可以BufferedReader br = new BufferedReader(new FileReader("src/a1.txt"));String s=br.readLine();//读一行System.out.println(s);}

在这里插入图片描述
在这里插入图片描述

2.转换流
  • InputStreamReader
  • OutputStreamWriter
3.数据流
  • DataInputStream
  • DataOutputStream
4.对象流
  • ObjectInputStream
  • ObjectOutputStream

作业

测试其它流的用法

在这里插入图片描述
在这里插入图片描述

转换流:

 @Testpublic void test1() throws IOException {InputStreamReader isr = new InputStreamReader(new FileInputStream("src/a.txt"));//helloBufferedReader br = new BufferedReader(isr);System.out.println( br.read());//104System.out.println(br.readLine());//elloOutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("src/a.txt"));BufferedWriter bw = new BufferedWriter(osw);bw.write("132");bw.close();}

对象流

 @Testpublic void test2() throws IOException, ClassNotFoundException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src/a.txt"));oos.writeObject(new Monkey("菲菲"));ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/a.txt"));Monkey m=(Monkey) ois.readObject();System.out.println(m);}
public class Monkey implements Serializable {private String name;@Overridepublic String toString() {return "Monkey{" +"name='" + name + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Monkey() {}public Monkey(String name) {this.name = name;}
}

这篇关于Java学习day20-21-IO流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755746

相关文章

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python