【小白学Java】D29》》》IO流 之 过滤器 字节流

news/2025/2/5 22:01:05/

在这里插入图片描述


【友情链接】➡➡▶IO流 之 File类 & 递归
【友情链接】➡➡▶IO流 之 过滤器 & 字节流
【友情链接】➡➡▶IO流 之字符流 & 属性集(Properties集合)
【友情链接】➡➡▶IO流 之 缓冲流 & 转换流
【友情链接】➡➡▶IO流 之 序列化流 & 打印流


一、过滤器

FiLe类中有两个ListFiles( ) 重载的方法,这两个重载的方法的参数,传递的就是过滤器 而在java中,有两种过滤器分别是FileFilter接口和FileNameFilter接口。

FileFilter接口

        在java.io包下的FileFilter接口,顾名思义,FiLeFilter接口的作用就是用于抽象路径名(FiLe对象)的过滤器,它是File的一个过滤器。该接口的对象可以传递给File类的File[] listFiLes(FiLeFilter filter)作为参数,接口中只有一个方法:
boolean accept(File pathname)用于测试pathname(抽象路径)是否包含在当前File目录中,如果在,返回true,不在,则返回false…

FiLeNameFilter接口

        在java.io包下的FiLeNameFilter接口,它也是File的过滤器。顾名思义,FiLeNameFilter接口的主要做用是用于过滤文件名称,而且实现了此接口的类的实例可以用作过滤器文件名。 该接口的对象可以传递给File类的FiLe[] ListFiLes(FiLeNameFilter filter)作为参数,接口中只有一个抽象方法:
boolean accept(File dir,String name)该方法是用来测试指定的文件是否包含在某一文件列表中,其中的 File dir为构造方法中传递的被遍历的目录;而String name为使用ListFiles方法遍历目录获取到的每一个文件或者文件夹的名称。

注意:上面的两个过滤器接口都是没有实现类的,要使用时,需要自己写它们的实现类,并且要重写接口中的accept()方法,用于定义过滤的规则。

二、IO流

(1)概述

        IO指的就是输入(input)和输出(output),而流是一个抽象的概念,是对数据传输的一个总称;IO流指的就是数据的输入刘和输出流,是用来处理设备之间数据传输问题,例如:文件的上传、下载、复制、剪切。。。。
在计算机中:输入流(也就是读取数据)从硬盘传输到内存中;同样的,输出流(也就是写入数据)从内存传输到硬盘中。

(2)分类

1.根据数据的流向可以分为:输入流 和 输出流

  • 输入流︰把数据从其他设备上读取到内存中的流。
  • 输出流︰把数据从内存中写出到其他设备上的流

2.根据传输的数据的类型分为:字节流 和 字符流。

  • 字节流:还包括字节输入流(InputStream),字节输出流(OutputStream)
  • 字符流:也包括字符输入流(Rader),字符输出流(Writer)

1.字节输出流

(1)OutputStream字节输出流

        这个抽象类表示字节输出流的所有类的父类

该类中定义了一些共性的成员方法:

public void close():关闭此输出流并释放与此流相关联的任何系统资源。
public void flush()﹔刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[ ] b):b.Length字节从指定的字节数组写入此输出流。
public void write(byte[ ] b, int off, int len):从指定的字节数组写入Len字节,从偏移量off开始输出到此输出流。
public abstract void write(int b):将指定的字节输出流。

(2)FileOutputStream文件字节输出流

        FileOutputStream extends OutputStream
FileOutputStream类的作用就是把内存中的数据写入到硬盘的文件中

FileOutputStream 类 常用的构造方法:

  • FiLeOutputStream( String name):
    创建一个向具有指定名称的文件中写入数据的输出文件流。
    String name:参数表示目的地是一个文件的路径
  • FiLeOutputStream(File fiLe):
    创建一个向指定 file 对象表示的文件中写入数据的文件输出流。
    File file:参数表示目的地是一个文件

构造方法的功能;

  • 1.创建一个FileOutputStream类的对象
  • 2.根据构造方法中传递的文件或者文件的路径,创建一个空的文件
  • 3.将FileOutputStream类的对象指向已经创建好的文件

(3)字节输出流的使用步骤

  • 1.创建一个FileOutputStream类的对象,在构造方法中传逸要写入数据的目的地(文件路径)
  • 2.调用FileOutputStream类的对象中的write()方法 来把数据写入到文件中
  • 3.释放资源,因为使用流时会占用一部分内存,使用完流后需要释放该内存资源,提高程序的使用效率。

注意:我们调用write方法写入十进制的整数,在执行程序时,会将其转换为二进制的整数,也就是说我们向磁盘中写入的数据是二进制的数据,但是我们打开文件的时候看见的是字符串,那因为我们使用的文本编辑器(记事本,notpad++, sublime等),它自带了将二进制字节码转换为字符的逻辑,根据查询到的编码表,将字节转换为字符。

我们来看个实例演示代码;
在这里插入图片描述

//1.创建一个FiLeOutputStream对象,构造方法中传逸写入数据的目的地
FileOutputStream fos = new FileOutputStream("D:\\BigData\\java\\javalearn\\src\\com\\data\\test_fos.txt");//2.调用FiLeOutputStream对象中的方法write ,把数据写入到文件中//public abstract void write(int b):将指定的字节输出流。
fos.write(97);
fos.write('\n');//换行//public void write(byte[ ] b):将b.Length字节从指定的字节数组写入此输出流。
byte[] bytes={98,99,100,101,102,122};
fos.write(bytes);
fos.write('\n');//public void write(byte[ ] b, int off, int len):从指定的字节数组写入Len字节,从偏移量off开始输出到此输出流。
fos.write(bytes,1,3);//若是写入一个字符串,那么我们要使用到getBytes()方法
fos.write('\n');
String str ="你好,大佬!欢迎来到北慕辰的博客!给个三连鼓励鼓励!";
byte[] strBytes = str.getBytes();
//打印字节码
System.out.println(Arrays.toString(strBytes));
fos.write(strBytes);//3.释放资源,因为使用流时会占用一部分内存,使用完流后需要释放该内存资源,提高程序的使用效率。
fos.close();

在这里插入图片描述
上面的代码我们在测试时会发现,每次运行代码时,文件内容都会被覆盖掉,详细演示一下:
第一次执行:
在这里插入图片描述

第二次执行:
在这里插入图片描述为了解决这种问题,FiLeOutputStream类中提供了两种构造方法;

一、在文件末尾追加
1. FileOutputStream(String name,boolean append )创建一个向具有指定name的文件中写入数据的输出文件流
2. FileOutputStream(File file,boolean append)创建一个向指定的File对象表示的文件中写入数据的文件输出流简单说明下各参数:String name , File fiLe:要写入数据的文件路径boolean append;给定true:每次执行代码不会匿羞源文件,在文件追末尾追加给定false:每次执行代码,在文件末尾无法追加,会覆盖源文件
二、每写入一次数据,换一次行Windows下是 "\r\n"Linux下是  "/n"

看个实例;

//1.创建一个FiLeOutputStream对象,构造方法中传逸写入数据的目的地
FileOutputStream fos = new FileOutputStream("D:\\BigData\\java\\javalearn\\src\\com\\data\\test_fos.txt",true);File file = new File("D:\\BigData\\java\\javalearn\\src\\com\\data\\test1_fos.txt");
FileOutputStream fos1 = new FileOutputStream(file, true);
//2.调用FiLeOutputStream对象中的方法write ,把数据写入到文件中
fos.write(97);//执行一次写入一次,不会覆盖了
fos1.write("北慕辰".getBytes());//实现换行写
String str ="北慕辰";
for (int i = 0; i < 5; i++) {String s =str + Integer.toString(i);//小小的拼接fos1.write("\r\n".getBytes());//换行fos1.write(s.getBytes());
}
//3.释放资源,因为使用流时会占用一部分内存,使用完流后需要释放该内存资源,提高程序的使用效率。
fos.close();
fos1.close();

在这里插入图片描述

2.字节输入流

(1)InputStream字节输入流

         InputStream抽象类,是表示字节输入流的所有类的根类。

该类中定义了一些共性的成员方法:

int read() 从输入流中读取数据的下一个字节。
int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
void close()关闭此输入流,并释放与该流关联的所有的系统资源。

(2)FileInputStream文件字节输入流

        FileInputStream extends InputStream
FileInputStream类的作用就是把硬盘文件中的数据读取到内存中

构造方法;

FileInputStream(String name)
FileInputStream( File file)String name:文件的路径
File file;文件

构造方法的作用:
1.创建一个FileInputStream类的对象
2.给FileInputStream类的对象,指定构造方法中要读取的文件

(3)字节输入流的使用步骤

  • 1.创建FileInputStream类的对象,并在构造方法中指定要读取的数据源
  • 2.使用FileInputStream对象中的read()方法读取文件
  • 3.调用close方法释放资源

看个实例代码演示:

//1.创建FileInputStream类的对象,并在构造方法中指定要读取的数据源
FileInputStream fis = new FileInputStream("D:\\BigData\\java\\javalearn\\src\\com\\data\\test_fis.txt");//2.使用FileInputStream对象中的read()方法读取文件
//read()方法读取一个字节,当读到文件末尾返回-1
/*int read = fis.read();
System.out.println(read);//97--a
int read1 = fis.read();
System.out.println(read1);//98--b
int read2 = fis.read();
System.out.println(read2);//99-c
int read3 = fis.read();
System.out.println(read3);//100-d
int read4 = fis.read();
System.out.println(read4);//-1
int read5 = fis.read();
System.out.println(read5);//-1  */
//使用循环读取
/*   int r= 0;//接收每次读取的字节while ( (r=fis.read()) != -1){System.out.println(r);//System.out.println((char)r);//转换成字符}*///使用数组来接收
int r = 0;//接收每次读取的字节
byte[] bytes= new byte[4];
while ( (r=fis.read(bytes)) != -1){}
System.out.println(Arrays.toString(bytes));
//3.调用close方法释放资源
fis.close();

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

3.字节流案例

案例一、使用文件输入流,统计代码行数

public class demo_countlines {
static int countline=0 ;//静态全局变量,接收行数
public static void main(String[] args) throws Exception {File file = new File("D:\\BigData\\java\\javalearn\\src");countLines(file);System.out.println(countline);
}
public static  void  countLines(File file)throws Exception{File[] files = file.listFiles();for (File file1 : files) {if (file1.isFile() && file1.getName().endsWith(".java")){//创建file1字节流FileInputStream fileInputStream = new FileInputStream(file1);//统计代码行数int f;while ((f=fileInputStream.read())!= -1){if (f =='\n'){countline++;}}fileInputStream.close();}else if (file1.isDirectory()){countLines(file1);}}
}

在这里插入图片描述

。。。。。请忽略代码行数。。。小北学了这么多天了,才敲了这么点代码 。有愧于自己啊,啊啊啊啊。。。还要继续努力,嗯,加油,我可以的。

在这里插入图片描述

案例二、使用字节流,实现文件复制

public static void main(String[] args) throws IOException {File oldfile = new File("D:\\BigData\\java\\javalearn\\src\\com\\data");File newwfile = new File("D:\\BigData\\java\\javalearn\\src\\com\\data_copy");fileCopy(oldfile,newwfile);
}
public  static void fileCopy(File oldFile, File newFile)throws IOException {//1.判断目标目录是否实际存在,不存在则创建目标目录newFile.mkdirs();//2.返回oldFile中的文件/文件夹集合File[] files = oldFile.listFiles();//3.遍历files,判断是文件还是目录for (File file : files) {if(file.isFile()){//3.1 file为文件,那么就复制到newFile//3.1.1 读取文件中的数据,//  创建指向file的文件字节输入流FileInputStream fis = new FileInputStream(file);//3.1.2 向文件中写入数据,//   创建指向匿名对象new File(newFile,file.getName()) 的文件字节输出流//   new File(newFile,file.getName()) 文件类的构造方法FileOutputStream fos = new FileOutputStream(new File(newFile,file.getName()));//3.1.3 开始复制文件int sum;//记录每次读取的字节数据while ((sum=fis.read())!=-1){//while循环复制读写数据fos.write(sum);}//3.1.4 释放内存资源fos.close();fis.close();// file.delete(); //删除oldFile中源文件,实现剪切功能}else {//如果file为文件夹//根据file文件夹的名称,在newFile中创建一个一样的文件夹File newfile = new File(newFile, file.getName());newfile.mkdirs();//若file文件夹中还有文件/文件夹,递归调用本身方法继续复制fileCopy(file,newfile);}}//oldFile.delete();  //删除oldFile源文件,实现剪切功能}
}

测试结果截图;
在这里插入图片描述



制作不易,各位友友们,大佬们给点鼓励!

点赞👍 👍 👍 收藏+关注 一键三连走起!
在这里插入图片描述


http://www.ppmy.cn/news/876078.html

相关文章

Verilog设计交通信号灯

目录 一、设计要求 二、模块总和 三、模块设计 1.顶层模块 2.分频模块 3.计数模块 4.状态机模块 5.倒计时模块 6.数码显示模块 7.约束代码 四、引脚分配 五、板上测试 总结 一、设计要求 1.利用 NEXYS4 DDR 开发板设计一款交通灯控制系统&#xff0c;能够显示红、黄、绿灯&…

全国大学生软件测试大赛指南

《大学生软件测试大赛》辅导-- 开发者测试&#xff1a;第二讲 如何在 WebIDE 测试一个Java项目&#xff1f; &#xff08;以 nextday 为例&#xff09; 1. 第一部分&#xff1a;基本流程 &#xff08;4步&#xff09; 在项目文件夹 mootest 新建一个测试类&#xff08;文件&…

Excel公式:index + match多条件匹配,以当前行多个单元值去另一文档匹配,返回指定单元值

index函数 解析&#xff1a; 在一个范围内&#xff08;如下图A2:C3&#xff09;&#xff0c;根据行列坐标&#xff08;如下图第一行&#xff0c;第一列&#xff09;&#xff0c;返回单元格的值 match函数 解析&#xff1a; 参数列表如下&#xff0c;第一个参数即需要查找的…

基于FPGA的EEPROM读写测试项目(IIC驱动)

EEPROM (E2PROM&#xff0c;Electrically Erasable Progammable Read Only Memory)电可擦除可编程只读存储器。非易失性&#xff08;断电保持&#xff09;。 以AT24C64为例阅读datasheet可了解EEPROM的特性&#xff0c;AT24C64存储器容量为64Kbit&#xff08;8192 byte256页*32…

【FPGA】I2C协议

1.I2C简介 I2C 即 Inter-Integrated Circuit(集成电路总线&#xff09;&#xff0c;是由 Philips 半导体公司&#xff08;现在的 NXP 半导体公司&#xff09;在八十年代初设计出来的一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大且传输距离短的场合下的主从通…

D29:Post Office(邮局,翻译)

原题&#xff1a;OpenJudge - 162:Post Office 翻译&#xff1a; 描述&#xff1a;有一条笔直的公路&#xff0c;公路旁边有村庄。公路表示为一个整数轴&#xff0c;每个村庄的位置用一个单一的整数坐标来标识。村庄处于不同位置。两个位置之间的距离是它们的整数坐标之差的绝…

D29第七章 回溯算法part05* 491.递增子序列* 46.全排列* 47.全排列 II

第七章 回溯算法part05 * 491.递增子序列 class Solution {private List<Integer> path new ArrayList<>();private List<List<Integer>> res new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backt…

%.9d\n = %09d\n

#include <stdio.h> int main(void) { int year 05; printf("%09d\n",year); printf("%9d\n",year); printf("%.9d\n",year); return 0; } 输出结果&#xff1a; 000000005 ________5 000000005 测试环境&#xff1a;操作系统&#xff1a…