Java文件的读写

2023-11-13

文件与流

在实际生活中,我们总要对文件进行操作,Java提供了流可以帮助我们读写文件;
下面是常用的流类型结构图:
字节与流
在对文件的读写操作中,字节流可用于读写二进制文件,字符流用于读写文本文件。所谓二进制文件,指文件无字符编码格式,均由字节(Byte)组成,图片文件、word文档等均为二进制文件。文本文件是一种特殊的二进制文件,也由字节组成,但需要通过特定的字符编码格式读取或写入,否则会出现乱码,后缀名为txt的文件就是典型的文本文件。

File类

File类的对象表示磁盘、目录、文件。其对象的属性包含了文件或目录的相关信息,如名称、长度、所含文件个数等,其方法可以完成对文件或目录的常用管理操作,如创建、删除等。
下面是File类的常用方法:

方法名称 参数 作用 返回值
构造方法 String 传入文件或目录名,获取对应的文件或目录对象
canRead 文件是否可读 boolean:是否可读
canWrite 文件是否可写 boolean:是否可写
delete 删除文件或目录 boolean:操作结果
exists 文件或目录是否存在 boolean:是否存在
getAbsolutePath 获取绝对路径 String:绝对路径
getFreeSpace 获取分区的剩余空间 long:字节数量
getTotalSpace 获取分区的总空间 long:字节数量
getUsableSpace 获取分区的已用空间 long:字节数量
getName 获取文件或目录的名称 String:文件或目录名称
isDirectory 是否为目录 boolean:是否为目录
isFile 是否为文件 boolean:是否为文件
isHidden 是否为隐藏文件或目录 boolean:是否隐藏
lastModified 获取文件最后修改时间 long:最后修改时间
length 获取文件长度 long:字节数量
listFiles 获取目录的子目录、文件 File[]:子目录和子文件
listRoots 获取所有磁盘分区 File[]:磁盘分区
mkdir 创建目录 boolean:是否创建成功
mkdirs 创建多级目录 boolean:是否创建成功

File类的常用方法

列出磁盘分区和D盘目录

package io;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author Una
 * @date 2022/7/20 11:17
 * @description:
 */


public class FileTest {
    public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    public static void main(String[] args) {
        /**
         *public static File[] listRoots() {
         *         return fs.listRoots();
         * }
         */
        // 获取当前文件系统的所有磁盘分区
        File[] disks=File.listRoots();
        for (int i = 0; i < disks.length; i++) {
            File disk = disks[i];
            System.out.println(disk.getAbsolutePath() + "盘\t总空间:"
                    + disk.getTotalSpace() / 1024 / 1024 / 1024 + "G\t剩余空间"
                    + disk.getFreeSpace() / 1024 / 1024 / 1024 + "G");
        }
        //获取D盘根目录
        File c = new File("D:");
        if (!c.exists()) {
            System.out.println("D盘不存在");
            return ;
        }
        System.out.println("D盘根目录结构:");
        File[] files = c.listFiles();
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            if (file.isDirectory()) {
                System.out.print("[目录]" + file.getName());
            }
            if (file.isFile()) {
                System.out.print("[文件]" + file.getName());
                System.out.print("\t大小:" + file.length() / 1024 + "K");
                Date date = new Date(file.lastModified());
                System.out.print("\t修改日期:" + sdf.format(date) + "\t");
                //isHidden()返回值为Boolean
                if (file.isHidden()){
                    System.out.print("[隐藏]");
                }
                //放法canWrite()判断是否可写
                if (!file.canWrite()){
                    System.out.print("[只读]");
                }
            }
            System.out.println();
        }
    }
}

运行结果
运行结果

FileInputStream

FileInputStream;顾名思义,输入流。
使用字节输入流(FileInputStream)读取文件分为以下三个步骤:

  1. 打开文件。
  2. 按字节读取文件。
  3. 关闭文件。
package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author Una
 * @date 2022/7/20 10:56
 * @description:输入流,读操作
 */


public class FileInput {
    public static void main(String[] args) {
        File file=new File("E:\\java学习\\day20-IO流\\课件\\111111.txt");
        try {
            //打开文件
            FileInputStream fileInputStream=new FileInputStream(file);
            /**
             *  public int read() throws IOException {
             *         return read0();
             *  }
             *  read()一次读一个字节,读取出来的是字节的ASCII码,转换为char型输出,也就是使用一次read读一次,所以使用i接着
             */
            int i=0;
            while ((i=fileInputStream.read())!=-1){//如果i的值为-1说明读到了文件尾,退出循环
                System.out.print((char) i);
            }
            //关闭文件
            fileInputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果对比:
结果

结果

BufferedInputStream(文件缓存输入流)

FileInputStream提供的read方法每执行一次均会发出一次IO读取操作,一次读一个字节,效率很低。因此Java提供了缓存输入流(BufferedInputStream),能够在一次IO读取操作中读取多个字节,降低了IO读取的频率,提高了代码效率。

package io;
import java.io.*;
/**
 * @author Una
 * @date 2022/7/20 11:40
 * @description:
 */


public class FileInputBuffer {
    public static void main(String[] args) {
        File file=new File("E:\\java学习\\day20-IO流\\课件\\111111.txt");
        try {
            //打开文件
            FileInputStream fileInputStream=new FileInputStream(file);
            //BufferedInputStream 需要传入的是FileInputStream对象
            BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
            int i=0;
            while ((i= bufferedInputStream.read())!=-1){
                System.out.print((char)i);
            }
            //关闭BufferInputStream
            bufferedInputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

需要注意的是:
① 缓存输入流不能独立使用,需要通过文件输入流进行构建。

② 应使用缓存输入流实例读取文件,如继续使用fis(文件输入流实例),则绕过了缓存,性能不会得到提升。

③ 关闭文件时只需要关闭缓存输入流实例即可。

FileOutputStream(字节输出流)

字节输出流(FileOutputStream)的使用也分为开发文件、输出、关闭文件三部分。

package io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author Una
 * @date 2022/7/20 12:02
 * @description:
 */


public class FileOutput {
    public static void main(String[] args) {
        File file=new File("E:\\java学习\\day20-IO流\\课件\\111111.txt");
        try {
            //打开文件
            //FileOutputStream fos = new FileOutputStream(file, true);
            FileOutputStream fileOutputStream=new FileOutputStream(file);
            //写入,数字代表ASCII码
            fileOutputStream.write(65);
            fileOutputStream.write(66);
            fileOutputStream.write(67);
            //关闭文件
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:
结果

BufferedOutputStream(缓存输出流)

单独使用文件输出流也存在效率问题,同样可以使用缓存输出流(BufferedOutputStream)进行改善。

package io;
import java.io.*;
/**
 * @author Una
 * @date 2022/7/20 12:13
 * @description:
 */
public class FileOutputBuffer {
    public static void main(String[] args) {
        File file=new File("E:\\java学习\\day20-IO流\\课件\\111111.txt");
        try {
            FileOutputStream fileOutputStream=new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);
            bufferedOutputStream.write(65);
            bufferedOutputStream.write(66);
            bufferedOutputStream.write(67);
            //flush方法用于强制将缓存中内容输出
            bufferedOutputStream.flush();
            bufferedOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

flush()方法:

  1. 缓存输出流会将输出的内容缓存在内存中,如果缓存区已满,那么缓存会自动将数据输出到目的地。如果缓存区数据未满,则需要调用flush方法,将缓存区数据输出到目的地。如果忘记调用flush方法,则不会将内容输出到目的地。
  2. 调用缓存输出流的close方法时会自动执行flush方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java文件的读写 的相关文章

随机推荐

  • el-data-picker时间选择器最多选择7天,且只能选当前之前时间

  • nginx控制脚本

    说明 源码编译的nginx服务 状态管理很不方便 使用此脚本可以很好的进行服务管理 系统 centos 7 shell语句 bin bash netstat ntulp grep nginx gt dev null 判断nginx的运行状态
  • 【ChatGPT案例】10大ChatGPT谷歌插件神器

    ChatGPT相信大家都用过 但是如何高效使用 并真正挖掘出ChatGPT的强大能力呢 关键之处就在于Prompts 可是 编写prompts是一门熟能生巧的技术活 我们能不能一键拥有那些惊艳的prompts呢 答案就是Chrome插件 本
  • 西南石油大学第三届信息安全大赛之QR码

    这几天在玩这个 发一下关于QR码的程序吧 题目如下 题目标题说明是QR码 看来是需要用程序来把上面的数字来生成QR码 代码如下 基于OPENCV来实现的 由于图片太小 这里把图片放大了十倍 include
  • 实力总结四类Bean注入Spring的方式

    源码 实战 一提到 Spring 大家最先想到的是啥 是 AOP 和 IOC 的两大特性 是 Spring 中 Bean 的初始化流程 还是基于 Spring 的 Spring Cloud 全家桶呢 今天我们就从 Spring 的 IOC
  • php密码复杂,PHP判断密码强度的方法详解

    本文实例讲述了PHP判断密码强度的方法 分享给大家供大家参考 具体如下 一 php页面 score 0 if empty GET value 接收的值 str GET value else str if preg match 0 9 str
  • 【Twinkle】2019面试总结

    人生第一次找工作 因为没把自己培养成大神直接导致找工作累成了狗 秋招已经过了一大半 虽然还没有定目标企业 但是现在也简单的谢谢自己的经历和经验 留作纪念或者分享给大家 找工作前期说实话我还是准备了一段时间的 剑指offer 牛客之类的书籍或
  • arcgis图层 GraphicsLayer与FeatureLayer

    什么是图层 图层是用来在 ArcGIS 产品套件中显示地理数据集的机制 每个图层代表一种数据集 可以是地图服务 图形或是矢量数据 并指定该数据集是如何描绘使用一组属性的 包含一个地图控件的每个应用程序是通过添加一系列图层组装的 图层以特定的
  • 输出 100~999 之间的所有素数-Python

    Python 每日一题 需求 输出 100 999 之间的所有素数 所谓素数是一个大于 1 的正整数 除了 1 和它本身 该数不能被其它的正整数整除 过程 代码 用循环语句判断质数 for i in range 100 1000 range
  • 04别人能用的代码,在vscode或cmd下运行缺少模块的解决方法

    都是踩过的坑 总结一下解决方法就是 运行npm install进行修复 修复遇到问题可以删除 node modules 文件夹再试 具体方式如下 当运行 npm run serve 命令时遇到缺少模块 Module 的错误时 可以尝试以下几
  • CrowdSourcing-众包分析

    众包指的是一个公司或机构把过去由员工执行的工作任务 以自由自愿的形式外包给非特定的 而且通常是大型的 大众网络的做法 就是原来是公司做的事情 处于资金或者工作质量的考虑 通过游戏 ImageLabeler 社区 知乎 或者维基百科 竞赛 k
  • java.math.BigDecimal用法----Add、Subtract、Multiply、Divide

    引用自 url http www cnblogs com linjiqin p 3413894 html url 一 简介 Java在java math包中提供的API类BigDecimal 用来对超过16位有效位的数进行精确的运算 双精度
  • python基础01元组 函数

    1 可变类型的数值变化 是通过方法来实现的 2 如果给一个可变类型的变量 赋值一个新的数据 引用 id 会修改 3 不可变类型数据可以作为字典的键值对key 可变类型不能 元组 小括号 只可增删不可修改 函数 def print menu
  • QT 多层视图(视图叠加显示)

    之前做Mac应用开发 视图层是可以上下叠加显示的 然后回到QT这边开发 发现QT的布局上不能叠加显示 于是写了个简单的可以叠加QWidget的小Demo 这是调用的代码 include mainform h include multilay
  • 玉柴spn码故障对照表_卡车处理故障后不烧尿素也头疼!

    之前说到车辆烧尿素太多 让很多车主头疼 但是如果车辆不烧尿素了也会让车主头疼 若长期不使用SCR系统拆掉 系统里的化学物质会很快被氧化 尿素喷嘴也会堵塞 致使整套系统报废 更换一套SCR系统的成本比消耗尿素的成本要贵得多 化学物质发生氧化
  • 常用中间件控制台默认登陆

    以下用本地127 0 0 1作为ip前缀方便本地直接点击跳转使用 实际部署时替换该ip即可 中间件名称 访问地址端口 默认账号密码 rabbitmq http 127 0 0 1 15672 guest guest activemq htt
  • 有各组方差怎么算组间平方和_组内离差平方和,组间离差平方和与总离差平方和各反映了什么?...

    展开全部 组内离差平方和反映了试验过程中各种随机因素所引起32313133353236313431303231363533e59b9ee7ad9431333431353331的试验误差 组间离差平方和反映了各组样本之间的差异程度 即由变异因
  • TortoiseGit密钥配置图文教程

    1 在 开始菜单 中找到 TortoiseGit 下的 PuTTYgen 建议直接搜索PuTTYgen 单机运行 2 点击 Generate按钮 鼠标需要在 Key区域 活动直至绿色进度条完成 切记 鼠标一定要动哦 鼠标不动的时候 绿色进度
  • 华为HCS之私有云工具FCD搭建

    华为HCS之私有云工具FCD搭建 一 FCD虚拟机创建 1 选择Vmware版本 2 选择虚拟机操作系统版本 3 虚拟机cpu配置 4 虚拟机分配内存 5 选择磁盘大小 6 指定镜像目录 7 开机安装系统 二 系统的初始配置 1 IP配置
  • Java文件的读写

    文件与流 在实际生活中 我们总要对文件进行操作 Java提供了流可以帮助我们读写文件 下面是常用的流类型结构图 在对文件的读写操作中 字节流可用于读写二进制文件 字符流用于读写文本文件 所谓二进制文件 指文件无字符编码格式 均由字节 Byt