Java - File、IO流

news2024/9/24 1:15:39

File类

File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、文件夹)

File类只能对文件本身进行操作,不能读写文件里面存储的数据。

创建File类的对象:

//创建file对象
        //1.具体某个文件
        File f1 = new File("D:\\DeskTop\\Desktop\\Java\\java.xlsx");
//        File f1 = new File("D:"+File.separator+"DeskTop"+File.separator+"Desktop"+File.separator+"Java"+File.separator+"java.xlsx");//一样,路径分隔符
//        File f1 = new File("D:/DeskTop/Desktop/Java/java.xlsx");//一样
        System.out.println(f1.length());//文件大小

        //2.某个文件夹
        File f2 = new File("D:\\DeskTop\\Desktop\\Java");
        System.out.println(f2.length());

        //3.可以指代一个不存在的文件路径
        System.out.println(f2.exists());//判断文件是否存在

        //文件定位
        //绝对路径
        File f4 = new File("E:\\java\\practice-wzz\\helloWorld-app\\src\\CollectionTest\\item.txt");
        //相对路径
        File f5 = new File("helloWorld-app\\src\\CollectionTest\\item.txt");
        System.out.println(f5.length());

常用方法:

f1.exists():判断文件是否存在

f1.isFile():判断当前文件是否是文件

f1.isDirectory():判断当前文件是否是文件夹

f1.getName():获取文件的名字

f1.length():获取文件的大小(字节个数)

f1.lastModified():获取文件最后修改时间       

格式化时间格式:

long time = f1.lastModified();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

System.out.println(sdf.format(time));

f1.getPath():获取创建对象时使用的路径

f1.getAbsolutePath():获取绝对路径

f1.createNewFile():创建文件,成功返回true

f1.mkdir():创建文件夹,成功返回true(注意只能创建一级文件夹)

f1.mkdirs():创建文件夹(可以创建多级文件夹)

f1.delete():删除文件或空文件夹(不能删除非空文件)

遍历文件夹

        //1.获取当前目录下所有”一级文件名称“到一个字符串
        File f1 = new File("D:\\DeskTop\\Desktop");
        String[] names = f1.list();
        for (String name : names) {
            System.out.println(name);
        }
        
        //2.获取当前目录下所有”一级文件对象“到一个File[]
        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
//目标:改变文件夹下视频的序号,要求从19开始
    File dir  = new File("E:\\Java00");

    //1.获取文件夹下所有一级文件对象
    File[] files = dir.listFiles();

    //2.一个一个找
    for (File file : files) {
        //3.判断是否是视频
        if(file.getName().endsWith(".mp4")){
            //4.获取视频名称
            String name = file.getName();
            //5.截取视频名称
            String newName = name.substring(0,name.lastIndexOf("."));
            //获取文件尾部
            String endName = name.substring(name.lastIndexOf("."));
            //6.拼接新视频名称
            String newFileName = "19"+newName+".mp4";
            //7.修改视频名称
            file.renameTo(new File(file.getParent(),newFileName));
//            file.renameTo(new File(dir,newFileName));
        }

方法递归

方法调用自身的形式成为方法递归

字符集

IO流

用于读写数据的(可以读写文件,或网络中的数据……)

字节流

文件字节输入流: 

每次读取一个字节: 

is.read();

        //1.创建一个文件字节输入流管道,与源文件接通
        //InputStream is = new FileInputStream(new File("helloWorld-app\\src\\CollectionTest\\item.txt"));
        //简化写法
        InputStream is = new FileInputStream(("helloWorld-app\\src\\CollectionTest\\item.txt"));

        //2.开始读取文件的字节数据
        int b =is.read();
        System.out.println(b);//97
        System.out.println((char)b);//a

        int b1 =is.read();
        System.out.println((char) b1);//b

        int b2 =is.read();
        System.out.println(b2);//-1
        //每次读取一个字节返回,如果没有数据了,返回-1.

使用循环改造:

        //使用循环改造
        int b;//用于记住读取的字节
        while ((b = is.read())!= -1) {
            System.out.print((char) b);
        }

 缺点:

  • 读取数据性能差
  • 读取汉字乱码,无法避免
  • 流使用完毕之后,必须关闭,释放系统资源is.close();

每次读取多个字节:

is.read(buffer);

        byte[] buffer = new byte[3];
        int len = is.read(buffer);
        String rs = new String(buffer);
        System.out.println(rs);
        System.out.println("当次读取的字节数量"+len);

//        int len2 = is.read(buffer);
//        String rs2 = new String(buffer);
//        System.out.println(rs2);
//        System.out.println("当次读取的字节数量"+len2);
        //abqwu
        //输出
        // abq
        //当次读取的字节数量3
        //wuq
        //当次读取的字节数量2
        //因为第一次buffer = [abq],第二次读的wq只占前两个字节,最后一个还是第一次读的

        //读多少,倒多少
        int len2 = is.read(buffer);
        String rs2 = new String(buffer,0,len2);
        System.out.println(rs2);
        System.out.println("当次读取的字节数量"+len2);
        //abq
        //当次读取的字节数量3
        //wu
        //当次读取的字节数量2

循环改造:

        //循环改造
        byte[] buffer = new byte[3];
        int len;
        while ((len = is.read(buffer))!= -1) {
            String rs = new String(buffer, 0, len);
            System.out.println(rs);
            System.out.println("当次读取的字节数量"+len);
        }
        is.close();//关闭流

缺点:

  • 无法避免汉字乱码

一次读取完全部字节:

        //1.一次性全部读完全部字节
        InputStream is = new FileInputStream("helloWorld-app\\src\\CollectionTest\\item.txt");

        //2.准备一个字节数组,大小与文件的大小正好一致
        File f = new File("helloWorld-app\\src\\CollectionTest\\item.txt");
        long size = f.length();
        byte[] b = new byte[(int)size];

        int len = is.read(b);
        System.out.println(new String(b));
        System.out.println(size);
        System.out.println(len);
        is.close();
        byte[] b = is.readAllBytes();
        System.out.println(new String(b));

文件字节输出流:

        //1.创建一个字节输出流管道与目标文件接通
        //覆盖管道,覆盖之前的数据
//        OutputStream os = new FileOutputStream("helloWorld-app\\src\\CollectionTest\\item22.txt");

        //追加管道,追加数据
        OutputStream os = new FileOutputStream("helloWorld-app\\src\\CollectionTest\\item22.txt",true);

        //2.开始写字节数据出去
        os.write(97);//97就是一个字节,代表a
        os.write('b');//'b'也是一个字节
//        os.write('蕾');//汉字是3个字节,但write每次只能写一个字节,所以输入的是乱码

        byte[] bytes = "我爱你中国爱按~~~~~~~~~~".getBytes();//字节数组
        os.write(bytes);

        os.write(bytes,0,15);//写入我爱你中国

        //换行符号
        os.write("\r\n".getBytes());

        //3.关闭输出流
        os.flush(); //刷新缓冲区,保证数据全部写出去

        os.close();

换行: os.write("\r\n".getBytes());

练习:

package FileIOStream;

import java.io.*;

public class CopyFile {
    public static void main(String[] args) throws Exception {
        InputStream is = null;
        OutputStream os = null;
        try {
            //需求:复制照片
            //1.创建一个字节输入流管道与源文件接通
            is = new FileInputStream("D:\\DeskTop\\Desktop\\Java\\QQ.jpg");
            //2.创建一个字节输出流管道与目标文件接通
            os = new FileOutputStream("D:\\DeskTop\\Desktop\\Java\\test\\QQ_copy.jpg");
            //3.定义一个字节数组转移数据
            byte[] buffer = new byte[1024];//1KB
            //4.从字节输入流中读取字节数据,写出去到字节输出流中,读多书写出去多少
            int len;
            while((len = is.read(buffer)) != -1){
                os.write(buffer, 0, len);
            }
//            os.close();
//            is.close();
            System.out.println("复制完成");
        } catch (IOException e) {
//            throw new RuntimeException(e);
            e.printStackTrace();
        } finally {
            //释放资源操作
            try {
                if(os != null) os.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if(is != null) is.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

释放资源的方式:

try-catch-finally:

虚拟机终止:System.exit(0); 

try-with-resource:

更好更优雅

package FileIOStream;

import java.io.*;

public class CopyFile {
    public static void main(String[] args) throws Exception {
        try(
              //需求:复制照片
             //1.创建一个字节输入流管道与源文件接通
            InputStream  is = new FileInputStream("D:\\DeskTop\\Desktop\\Java\\QQ.jpg");
            //2.创建一个字节输出流管道与目标文件接通
            OutputStream os = new FileOutputStream("D:\\DeskTop\\Desktop\\Java\\test\\QQ_copy.jpg");
            ) {
            //3.定义一个字节数组转移数据
            byte[] buffer = new byte[1024];//1KB
            //4.从字节输入流中读取字节数据,写出去到字节输出流中,读多书写出去多少
            int len;
            while((len = is.read(buffer)) != -1){
                os.write(buffer, 0, len);
            }
//            os.close();
//            is.close();
            System.out.println("复制完成");
        } catch (IOException e) {
//            throw new RuntimeException(e);
            e.printStackTrace();
        }
    }
}

注意:try()内只能放资源对象,资源都是会实现AutoCloseable接口

字符流

FileReader:

Reader fr = new FileReade("");

 FileWriter:

 Writer fw = new FileWriter("");

换行直接:fw.write("\r\n");

字符输出流使用时注意:

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

字符流,字节流的使用场景小结:

  • 字节流适合做一切文件数据的拷贝(音视频、文本);字节流不适合读取中文内容输出。
  • 字符流适合做文本文件的操作(读,写)。

缓冲流

字节缓冲流:

             //1.创建一个字节输入流管道与源文件接通
            InputStream  is = new FileInputStream("D:\\DeskTop\\Desktop\\Java\\QQ.jpg");
            //定义一个字节缓冲输入流包装原始的字节输入流
              InputStream bis = new BufferedInputStream(is,8192*2);
            
            //2.创建一个字节输出流管道与目标文件接通
            OutputStream os = new FileOutputStream("D:\\DeskTop\\Desktop\\Java\\test\\QQ_copy.jpg");
            //定义一个字节缓冲输出流包装原始的字节输出流
            OutputStream bos = new BufferedOutputStream(os);

字符缓冲流:

字符缓存输入流:

字符缓存输出流:

转换流

InputStreamReader:

不同编码读取时会乱码

InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");

默认UTF-8

OutputStreamWriter:

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

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

相关文章

House of Roman / malloc_printerr间接调用malloc函数执行malloc_hook

文章目录 House of Roman介绍:原理:例子:思路:分析:利用: House of Roman 介绍: House of Roman 这个技巧说简单点其实就是 fastbin attack 和 Unsortbin attack 结合的一个小 trick。该技术用…

python-字符串操作(赛氪OJ)

[题目描述] 给定长度为 n 的只有小写字母的字符串 s ,进行 m 次操作,每次将 [l,r] 范围内所有 c1 字符改成 c2 ,输出操作完的字符串。输入格式: 第一行两个数 n , m , 第二行一个字符串 s , 之后 m 行&…

Ubuntu修改命令提示符格式PS1

命令提示符组成 通过Xshell进入Ubuntu的默认提示符是这样的 rootDESKTOP:~# root: 当前登录用户DESKTOP:主机名~: 当前目录名(即用户主目录)#:超级用户权限(root用户显示)$: 普通用户权限(非root用户显示) 修改命令提示符 step1…

linux 环境下 配置jenkins前端服务

前期准备 如果没有&#xff0c;需要安装插件 <b>HH:mm:ss</b> <b>HH:mm:ss.S</b> $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! 连接服务器的密码 测试 前端部署 需要安装nodejs的插件 执行脚本 node -v npm install rm -rf ./dist…

未解决:不同类型的数据用memcpy然后打印(printf)出问题

引子&#xff1a; 本来是搜memcpy在拷贝两个数组时两数组下标类型不同的问题&#xff0c;即&#xff0c;若一个数组是很长&#xff0c;其下标用long型&#xff0c;要将此数组的一小段拷贝到另一个数组中&#xff0c;这另一个数组的下标只需要用int型&#xff0c;不确定会不会出…

C++高性能编程:ZeroMQ vs Fast-DDS发布-订阅模式下性能对比与分析

文章目录 0. 引言1. 目标&#xff1a;ZeroMQ与Fast-DDS性能对比2. ZeroMQ vs Fast-DDS - 延迟基准测试2.1 一对一发布-订阅延迟2.2 一对多发布-订阅延迟 3. ZeroMQ vs Fast-DDS - 吞吐量基准测试4. 方法论5. 结论6. 参考 0. 引言 高要求的分布式系统催生了对轻量级且高性能中间…

MATLAB口罩检测系统

一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分&#xff0c;利用摄像机对图像进行采集&#xff0c;从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情&#xff0c;人们生活秩序被严重打乱。跟普通流感…

前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态

1.问题描述 当我们进入页面时的菜单导航栏是默认选中的状态如图 点击博客园效果如图 问题1&#xff1a; 但是当我们点击页面上方返回按钮时&#xff0c;导航栏选中状态没有改变 分析问题1&#xff1a; 这个问题是因为页面改变后页面里面存储的菜单导航栏的is-active属性没有改…

WIFI 密码

要破解 WIFI 密码&#xff0c;首先要抓到 WIFI 的握手包&#xff0c;要想得到 WIFI 的握手包&#xff0c;就需要在监听时刚好有设备连接了该 WIFI&#xff0c;但这就需要运气加成&#xff0c;因此可以我们可以主动将该 WIFI 的设备踢下去&#xff0c;一般设备就会自动连接该 WI…

机器学习:逻辑回归算法实现鸢尾花预测和银行数据处理

1、鸢尾花预测 1、特征选择 2、对特征处理 trainpd.read_excel("鸢尾花训练数据.xlsx") testpd.read_excel("鸢尾花测试数据.xlsx") x_traintrain[["萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]] y_tr…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

C2M商业模式分析与运营平台建设解决方案(一)

C2M&#xff08;Customer to Manufacturer&#xff09;商业模式通过直接将消费者需求与生产商对接&#xff0c;极大提升了生产效率和市场响应速度&#xff0c;本文将探讨如何通过构建高效的运营平台&#xff0c;利用大数据分析、人工智能算法及灵活的供应链管理&#xff0c;优化…

四川汇昌联信做拼多多电商怎么样?

近年来&#xff0c;拼多多凭借其独特的社交电商模式迅速崛起&#xff0c;成为国内领先的电商平台之一。四川汇昌联信作为一家专注于电商领域的企业&#xff0c;涉足拼多多平台无疑是顺应市场趋势的明智之举。那么&#xff0c;四川汇昌联信在拼多多平台上的表现如何呢? 一、产品…

推荐国产跨平台、轻量级的文本编辑器 Notepad-- v2.18

Notepad-- 是使用C编写的轻量级文本编辑器, 简称ndd, 可以支持Window/Mac/Linux操作系统平台。 我们的目标&#xff1a;完成文本编辑类软件的国产可替代&#xff0c;重点在国产Uos/Linux系统、Mac 系统上发展。 对比其它竞品Notepad类软件而言&#xff0c;我们的优势是可以跨…

【unix高级编程系列】信号

引言 以前对信号的理解&#xff0c;仅仅停留在main函数入口注册几个异常信号&#xff08;SIGPIPE、SIGSEGV、SIGFPE&#xff09;处理函数。当捕获到异常时&#xff0c;将进程的堆栈进行打印&#xff0c;方便排查、定位问题。这一类问题我认为是利用linux系统的异常信号机制&am…

系统架构师选择题知识点笔记

系统架构师复习笔记 选择题知识点 分布数据库特性 分片透明性&#xff1a;指用户或应用程序不需要知道逻辑上访问的表具体是怎么分块存储的&#xff1b;复制透明性&#xff1a;指采用复制技术的分布方法&#xff0c;用户不需要知道数据是复制到哪些节点上&#xff1b;逻辑透…

AI绘画网站爆款推荐,人人都是艺术家!

嗨&#xff0c;小伙伴们&#xff0c;最近AI 绘画简直是火出了新高度&#xff01;网上那么多 AI 绘图站&#xff0c;你或许已经眼花缭乱。但悄悄告诉你&#xff0c;有些站点只能照搬照片&#xff0c;却不让你天马行空地改造&#xff0c;想找一个既聪明又有创意的 AI 画家&#x…

Nginx详解配置实例及企业高性能web服务器

目录 企业高性能web服务器 一.Web 服务基础介绍 1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache 经典的 Web 服务端 1.2.1.1 Apache prefork 模型 1.2.1.2 Apache worker 模型 1.2.1.3 Apache event模型 1.2.2 Nginx-高性能的 Web 服务端 1.2.3服务端 I/O 流…

循环图神经网络教程2——循环图神经网络

介绍 循环图神经网络&#xff08;Recurrent Graph Neural Network&#xff0c;RGNN&#xff09;。在标准神经网络中&#xff0c;连续的学习权重层用于从输入张量中逐步提取更高级别的特征。在用于计算机视觉的神经网络中&#xff0c;低级特征(如短直线和曲线)的存在是由较早的…

Java类的卸载

类、类的加载器、类的实例之间的引用关系 类的生命周期 类的加载器如下&#xff1a;