File类/IO流介绍

news2024/11/24 17:56:02

一. File

概要:实现将数据从内存中存储到计算机硬盘中,存储方式以File的形式进行存储
File是Java.io包下的类,File类对象既可表示文件,又可表示文件夹
File类只能对文件本身进行操作,不能读写文件里存储的数据,想要操作文件里的数据需要用到io流

1.1 文件的创建

  • 文件的创建在这里插入图片描述

  • File文件的相对路径在这里插入图片描述 - 遍历文件
    -

相对路径可以方便文件管理,避免存储到其他盘符,找不到文件

遍历文件夹
1.一级文件夹遍历

#修改文件名
#listFiles只能遍历文件夹下一级目录的内容
 public static void main(String[] args)
    {
        File file=new File("D:\\works");
        File[] files = file.listFiles();

        for(File f:files)
        {
            String name = f.getName();
            String end = name.substring(name.lastIndexOf("."));
            UUID uuid = UUID.randomUUID();
            f.renameTo(new File(file,uuid+end));
        }
    }

2.遍历文件夹下的所有内容—方法递归

  • 概念:方法自己调用自己的形式,就叫方法递归。
    直接递归,方法内部调用自己;间接递归,方法调用其他方法,其他方法回调自己方法

  • 方法递归需要控制终止,不然会进入死循环,导致栈中的方法溢出

  • 递归算法的三要素,递归公式:f(n)=f(n-1)*n,递归的终结点:f(1),递归的方向必须走向终结点

    //递归累加
     public static void main(String[] args)
        {
            System.out.println(sum(10));
        }
        public static int sum(int i)
        {
            if (i==1)
            {
                return i;
            }
            else
            {
                return sum(i-1)+i;
            }
        }
    

    经典案例:猴子吃桃

     	/**
          * 猴子吃桃的问题
          * 第一天,吃了一半,又多吃了一个;第二天,吃了一半,又多吃了一个....10天后只剩一个了,求桃子的总数
          */
         public static int test1(int i) {
              # 根据天数建立方程
        		  f(x)-f(x)/2-1=f(x+1)------->f(x)=2f(x+1)+2
               第一天的桃减去吃掉的一半多一个等于第二天的桃子
           
             if(i==10)
             {return 1;}
             else
             {return 2*test1(i+1)+2;}}
     	```
    
    //根据文件名称查找文件位置-----递归的运用
    public class File2 {
    public static void main(String[] args) throws IOException {
     fileSearch(new File("F:\\网易云"),"网易云.exe");
    }
    
    public static void fileSearch(File dir,String name) throws IOException {
        if (!dir.exists()|| dir.isFile()||dir==null)
        {
            return;
        }
        File[] files = dir.listFiles();
        if (files.length>0&&files!=null)
        {
            for (File f:files)
            {
                if (f.isFile())
                {
                    if (f.getName().contains(name))
                    {
                        System.out.println("找到了"+f.getAbsolutePath());
                        Runtime runtime=Runtime.getRuntime();
                        runtime.exec(f.getAbsolutePath());
                    }
                }
                else 
                {
                    fileSearch(f,name);
                }
            }
        }
    }
    

}
```

File类的常见方法,可以参考Java开发文档

二. IO流-字节流

2.1流的基本概念

io流:用于读写数据,可以读写文件,或者网络中的数据

按照流的方向可分为

  • 输入流:将磁盘文件或者网络文件读取到内存中
  • 输出流:将内存中的数据保存到磁盘

按照流中的最小数据单位可分为

  • 字符流 :适合操作纯文本,例如txt、java文件
  • 字节流:适合所有文件,例如音频、视频、图片、文本文件的复制转移等

IO流的分类

在这里插入图片描述1.字节输入流
2.字节输出流
3.字符输入流
4.字节输出流

2.2 InputStream

字节输入流,将文件输入到内存,该类是接口类,实现类是FileInputStream

  • read()无参方法,一次读取一个字节

    #InputStream的创建 InputStream stream=new FileInputStream(new File("具体文件的路径")) int b; while((b=stream.read())!=-1) {
    System.out.print((char)b);//InputStream 存储的是字节流,所以,必须转换为字符集 }
    //read()无参方法只能逐个读取,会占用更大量的系统资源,且使用完毕需要关闭流,close()方法
    //read()方法,当字节流读取完所有的字节后,会返回-1 ```
    
  • read( byte[ ] b)有参方法,一次读取多个字节

    //read(byte[] buffer),一次性读取多个字节,性能高,但是读取汉字会出现乱码
    InputStream stream=new FileInputStream(new File("具体文件的路径"))
    byte[] buffer=new byte[3];
    int len=stream.read(buffer);//将读取到的字节放入buffer数组,返回数为读取到的数值总数,读取到的内容不能超过数组长度。
    String str=new String(buffer,0,len);//buffer数组,从第0位开始,读取len长度的数据转为字符串
    
    int len=stream.read(buffer);//当多次向同一个字节数组添加数据时,且字节数组长度不够用,后者会覆盖前者
    
  • 一次读取所有字节

    //1.定义一个和文件大小一样的字节数组,存放数据
    InputStream is=new FileInputStream("文件地址");
    File f=new File("文件地址");
    long size=f.length();
    byte[] buffer=new byte[(int) size];
    is.read(buffer);
    //2.调用readAllBytes方法直接读取所有的
    InputStream is=new FileInputStream("文件地址");
    byte[] buffer=is.readAllBytes();
    System.out.print(new String(buffer));
    
    

字节输入流的缺点,如果文件过大,会出现内存溢出

2.3 OutputStream

将内存中的数据写到文件中,该类为接口类,实现类为FileOutputStream

//通过io流复制文件
  InputStream inputStream=new FileInputStream("D:\\works\\test3\\1.jpg");//读取文件流
  OutputStream outputStream=new FileOutputStream("D:\\test1\\test2\\2.jpg");//写入文件流,文件名必须自取
  long i = new File("D:\\works\\test3\\1.jpg").length();//获取文件字节数
  byte[] bytes=new byte[(int) i];//创建对应长度的字节数组
  int len;
  inputStream.read(bytes);//读文件,将读取的数据放入字节数组
  outputStream.write(bytes);//写文件,将数组中的文件写道指定的文件夹中
  outputStream.close();
  inputStream.close();

2.4 IO流资源的释放

try
{//执行语句
}
catch(Exception e)
{//语句出现异常捕获异常
}
finally
{//不管语句正确与否,一定会执行
}

需要注意的是,不能在finall方法体内输入return,不然try方法体就不能执行了
try…catch…finally
在这里插入图片描述
try-with-resource
在这里插入图片描述

在这里插入图片描述
将连接的流资源放在try的小括号内,去掉原有的finally,当调用完成,方法会自动释放关闭流
底层原理,输入输出流实现了Closeable接口,只要实现了该接口就能算作资源类,且Closeable中定义了资源关闭方法close(),所以当使用try-catch-resource时,资源使用完毕后会自动释放

3.IO流–字符流

在这里插入图片描述
字符输入流-FileReader,原理和字节输入流一致,只是读取的每个数据都会被当作字符看待
在这里插入图片描述
字符输出流常用的方法
在这里插入图片描述
在这里插入图片描述
注意:字符输出流写出数据后,必须刷新,或者关闭流,写入的数据才能生效
flush()方法进行刷新;close()关闭后等于自动刷新

4.缓冲流

4.1字节缓冲流

原理:字节缓冲输出输入流自带了8KB缓冲池,字节缓冲流每读写一次,就往缓冲池放入8KB的字节,使用缓冲流是为了提高读写的性能,缓冲池在内存中,内存读写的效率比外存高
在这里插入图片描述

// 缓冲字节流拷贝视频,视频、音频等资源文件需要用字节流读写
public static void test2()
    {
        
        try (
              BufferedInputStream bufferedInputStream= new BufferedInputStream(new FileInputStream("D:\\电影直播\\video_230801_192356.mp4"));
              BufferedOutputStream outputStream= new BufferedOutputStream(new FileOutputStream("D:\\电影直播\\1.mp4"));
        )
        {
            long start = System.currentTimeMillis();
            long ln=0;
            byte [] bytes=new byte[1024];
            while ((ln=bufferedInputStream.read(bytes))!=-1)
            {
                outputStream.write((int) ln);
            }
            long end = System.currentTimeMillis();
            System.out.println((end-start)/1000+"s");

        }catch (Exception e)
        {

        }
    }

简单字节流和缓冲字节流,在调用有参字节的读写时,字节数组长度越大,读写性能越好

4.2字符缓冲流

作用:提高字符流的读写效率,自带8KB的缓冲池,缓冲池在内存中,字符缓冲流每读写一次,就往缓冲池放入8KB的字符,内存读写的效率比外存高

字符缓冲输入流

  • 创键字符缓冲输入流List item
  • BufferedReader类提供了一个特有的方法,读取一行字符,readLine(),没有值时就返回null

字符缓冲输出流

  • public BufferedWriter(Writer r),把低级字符输出流包装成一个高级的缓冲字符输出流管道,提高字符流写的效率
  • 字符缓冲输出流新增的功能:换行,public void newLine()
    在这里插入图片描述

5. IO流-转换流

如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取的文本文件会出现乱码
解决方法:字符转换流
在这里插入图片描述

5.1字符输入转换流—InputStreamReader

//解决乱码的思路
1.先将拿到文件的字节流,然后通过字符转换流的构造方法,将字节流的编码格式改成文件对应的编码格式,如GBK
public InputStreamReader(InputStream is,String charset)

例如:
InputStream is=new FileInputStream("文件地址");
Reader isr=new InputStreamReader(is,"GBK");
BufferReader br=new BufferReader(isr);

5.2 字符输出转换流

//实现的思路
1.拿到原始的字节输入流
2.通过字符输出转换流的构造方法,传入字节流,并将字符输出流编码格式改成需要的格式
public OutputStreamWrite(OutputStream os,String charset)

案例
OutputStream os=new FileOutputStream("文件地址");
Writer osw=new OutputStreamWriter(os,"GBK");
BufferWrite bw=new BufferWriter(osw);
bw.write("123你好");
//写入后要生效的话记得关闭流或刷新流

6.打印流

6.1PrintStream,字节打印流

在这里插入图片描述
构造器和方法
在这里插入图片描述

6.2PrintWriter,字符打印流

在这里插入图片描述

6.3 流的重定向

System.out.println()就是采用打印流的放法,将数据输出在控制台

PrintStream ps=new PrintStream("文件路径");
System.setOut(ps);
//输出的内容被重定向到指定的文件路径中

7.IO流-数据流

用于通信,可以存储数据的类型,根据类型读取数据在这里插入图片描述
在这里插入图片描述
需要注意的是,读取数据的时候,需要按照数据类型的排序进行读取
在这里插入图片描述

8.IO流-序列化流

将java对象写入到文件中,即序列化。将java对象读取出来,即反序列化
如果想要一次性序列化多个对象的话,直接对集合进行序列化即可,ArrayList集合已经实现了序列化接口
序列化

  • 需要自定义一个类,并实现序列化接口Serializable
  • 序列化流的创建
    在这里插入图片描述
  • 将序列化文件写入oss.writeObject(new User("张三",23,"男"))

反序列化

在这里插入图片描述
在进行序列化的时候,某个熟悉不想被展示出来,可以用transient修饰属性,这样该属性就不会参与反序列化

9.IO流-io框架(重点)

Commons-io框架,用框架可以直接省略以上的所有内容
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring-SpringBoot-SpringMVC-MyBatis常见面试题

文章目录 Spring篇springbean是安全的的?什么是AOP你们工作中有用过AOP吗spring中的事务是如何实现的spring中事务失效场景Spring的生命周期spring中的循坏依赖springMVC的执行流程springboot的启动原理常用注解MyBatis执行流程Mybatis是否支持延迟加载?Mybatis的一…

Android studio实现圆形进度条

参考博客 效果图 MainActivity import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.widget.TextView;import java.util.Timer; import java.util.TimerTask;public class MainActivity extends App…

【记录】Truenas scale|NFSv4数据集的子目录或文件的ACL完全访问权限继承老是继承不了怎么回事

我遇到了数据集下新建文件夹或文件,新建的文件夹或文件没有和数据集的ACL设置相符合的情况。其根本原因是NFSv4的完全访问权限要想继承的话,它的访问设置权限要设置“用户”和“组”的,就是,一定要选择中文的那个设置。纯owner和g…

计算机竞赛 基于机器视觉的行人口罩佩戴检测

简介 2020新冠爆发以来,疫情牵动着全国人民的心,一线医护工作者在最前线抗击疫情的同时,我们也可以看到很多科技行业和人工智能领域的从业者,也在贡献着他们的力量。近些天来,旷视、商汤、海康、百度都多家科技公司研…

JavaScript数组简介

JavaScript中的数组是一种强大的数据结构,它可以用来存储和处理各种类型的数据。熟练掌握数组的使用可以让编写JavaScript代码更加高效和优雅; ● 例如,现在我十个朋友要存到变量中,传统的话 const friend1 "张三"; c…

mysql 间隙锁原理深度详解

目录 一、前言 二、mysql之mvcc 2.1 什么是mvcc 2.2 mvcc组成 2.2.1 Undo log 多版本链 2.2.2 ReadView 2.2.3 快照读与当前读 三、RR级别下的事务问题 3.1 RR隔离级别解决的问题 3.1.1 幻读问题 3.2 幻读效果演示 3.2.1 准备测试表和数据 3.2.2 修改事务级别 3.…

2017. 网格游戏;2397. 被列覆盖的最多行数;2202. K 次操作后最大化顶端元素

2017. 网格游戏 核心思想:前缀和枚举。读完题后可以发现,第一个机器人走的路线就像一条分割线,第二个机器人只能获得上面白色部分或者下面白色部分的最大值。这个最大值怎么求,我们可以通过前缀和来求,然后通过枚举转…

【探索C++】输入输出

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

【模拟】算法实战

文章目录 一、算法原理二、算法实战1. leetcode1576 替换所有的问号2. leetcode495 提莫攻击3. leetcode6 N字形变换4. leetcode38 外观数列5. leetcode1419 数青蛙 三、总结 一、算法原理 模拟就是用计算机来模拟题目中要求的操作,模拟题目通常具有代码量大、操作…

网络编程套接字(4):日志和守护进程

文章目录 网络编程套接字(4): 日志和守护进程5. 增加日志功能6. 守护进程6.1 进程知识补充(1) 进程组(2) 任务(3) 会话 6.2 守护进程(1) 概念(2) 创建守护进程 网络编程套接字(4): 日志和守护进程 5. 增加日志功能 接着上篇的内容,增加日志功能可以更好地&#xf…

16.WebSocket聊天室

基于SpringBoot 2.6.11 1.WebSocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,可以在html页面直接使用。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket A…

2021年12月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:书架 John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。 John共有N头奶牛(1 ≤ N ≤ 20,000),每头奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000),N头奶牛的总高度为S。书架高度为B(1 ≤…

亚马逊云科技 云技能孵化营——我的云技能之旅

文章目录 每日一句正能量前言活动流程后记 每日一句正能量 不能在已经获得足够多的成功时,还对自己的能力保持怀疑,露出自信的微笑,走出自信的步伐,做一个自信的人! 前言 亚马逊云科技 (Amazon Web Services) 是全球云…

Kao框架学习

中间件:洋葱模型 这是官网上给出的示例,从logger依次往下执行,执行到最底层的response往回退,结构很像同心圆的洋葱从外层向内层再由内层向外层。 next表示暂停当前层的代码进入下一层, 当最后一层执行完毕开始回溯&a…

学习完毕JavaSE的感想

今天,把Java复习完毕了,之前学习的时候,学校里学的总是有限的 ,自己上手操作之后才发觉差的很多,部署服务器发现要学操作系统,学完了web基础 ,又发现还得学前后端分离vue react这些,…

基于ensp的中大型企业网络安全解决方案的设计与实施

一、需求背景 公司部门具体背景:公司共设有人事部、财务部、销售部、市场部四个部门以及一个员工宿舍楼,公司有对外互联网业务需要提供。公司内存在重要部门需要保护数据安全以及访问控制。 (1)根据客户需求、部门、拓扑&#xf…

代码搜索技巧

在IDE中搜索代码时,经常会被相近的无关代码干扰,如筛选所有使用协程的代码段, 可见有大量“噪音”。 可使用IDE提供的正则表达式功能 如 使用 \bgo ,即匹配go开头的,且之后为空格的所有选项 使用 \bgo func,即匹配到了所有使用协程…

C++学习vector

1,把list的相关函数都实现出来(未完) 2, 运行结果:

等保测评各个级别的详细内容

等保测评是指信息系统安全等级保护测评,是我国信息安全领域中的一项重要工作。根据国家标准《信息系统安全等级保护基本要求》(GB/T 22239-2008)和《信息系统安全等级保护测评技术要求》(GB/T 25070-2010)。 等保测评分为五个级别,分别是:一级…