【JavaEE】File、InputStream和OutputStream的使用

news2025/2/23 1:44:34

1.File

在计算机中目录结构如下:
在这里插入图片描述
File就表示一个目录或者一个普通文件

File表示目录
在这里插入图片描述
File表示普通文件
在这里插入图片描述
我们先来看File的构造方法:

构造器描述
File(File parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(URI uri)通过uri来创建一个File 实例

但是通常都用File(String pathname)这个构造器来创建File对象,其他的构造器比较少用。

创建File实例:

public class CreateFileObject {
    public static void main(String[] args) {
        File file = new File("blog/dir/tmp.txt");
    }
}

File类常用的方法基本都在下面了:

返回类型方法名描述
String getParent()返回 File 对象的父目录文件路径
String getName()返回 FIle 对象的纯文件名称
String getPath()返回 File 对象的文件路径
String getAbsolutePath()返回 File 对象的绝对路径
String getCanonicalPath()返回 File 对象的修饰过的绝对路径
boolean exists()判断 File 对象描述的文件是否真实存在
boolean isDirectory()判断 File 对象代表的文件是否是一个目录
boolean isFile()判断 File 对象代表的文件是否是一个普通文件
boolean createNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 true
boolean delete()根据 File 对象,删除该文件。成功删除后返回 true
void deleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
String[] list()返回 File 对象代表的目录下的所有文件名
File[] listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示
boolean mkdir()创建 File 对象代表的目录
boolean mkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
boolean renameTo(File dest)进行文件改名
boolean canRead()判断用户是否对文件有可读权限
boolean canWrite()判断用户是否对文件有可写权限

补充一个文件路径的小知识:

.表示当前路径
..表示上级目录

mkdirs()、getName()、getParent()、getPath()、getAbsolutePath()、getCanonicalPath()的使用

目录结构:
在这里插入图片描述

代码:

public class MethodTest1 {
    public static void main(String[] args) throws IOException {
        File file = new File("io/src/blog/dir/./tmp");

        //创建dir目录并且会创建tmp这个目录
        file.mkdirs();

        //获取文件的名称
        String filename = file.getName();
        System.out.println("文件名->: " + filename);

        //获取父目录的相对路径
        String parent = file.getParent();
        System.out.println("父目录的相对路径->: " + parent);


        //获取相对路径
        String path = file.getPath();
        System.out.println("相对路径->: " + path);

        //获取绝对路径
        String absPath = file.getAbsolutePath();
        System.out.println("绝对路径->: " + absPath);

        //获取修饰后的绝对路径
        String absPathMod = file.getCanonicalPath();
        System.out.println("修饰后的绝对路径->: " + absPathMod);

    }
}

结果:

文件名->: tmp
父目录的相对路径->: io\src\blog\dir\.
相对路径->: io\src\blog\dir\.\tmp
绝对路径->: H:\gitee\IdeaProgram\JavaEE\io\src\blog\dir\.\tmp
修饰后的绝对路径->: H:\gitee\IdeaProgram\JavaEE\io\src\blog\dir\tmp

exists()、isFile()、isDirectory()、list()、listFiles()的使用

目录结构:
在这里插入图片描述
代码:

public class MethodTest2 {
    public static void main(String[] args) {
        File file = new File("io/src/blog/dir/./tmp");

        //判断文件是否存在
        boolean isExists = file.exists();
        System.out.println("文件是否存在->: " + isExists);

        //判断是否为普通文件,比如xxx.txt
        boolean isFile = file.isFile();
        System.out.println("是否为普通文件->: " + isFile);

        //判断是否是一个目录
        boolean isDirctory = file.isDirectory();
        System.out.println("是否为一个目录->: " + isDirctory);

        //列出这个目录下面所有的文件,以String表示
        String[] list = file.list();
        System.out.println("tmp目录下所有的文件->: " + Arrays.toString(list));


        //列出这个目录下面所有的文件,以File对象表示
        File[] files = file.listFiles();
        System.out.println("tmp目录下所有的文件->: " + Arrays.toString(files));
    }
}

结果:

文件是否存在->: true
是否为普通文件->: false
是否为一个目录->: true
tmp目录下所有的文件->: [a.txt, b.txt]
tmp目录下所有的文件->: [io\src\blog\dir\.\tmp\a.txt, io\src\blog\dir\.\tmp\b.txt]

canRead()、canWrite()、renameTo()、delete()的使用

代码:

public class MethodTest3 {
    public static void main(String[] args) throws IOException {
        File file = new File("io/src/blog/dir/./tmp");

        //判断是否可读
        boolean canRead = file.canRead();
        System.out.println("是否可读->: " + canRead);

        //是否可写
        boolean canWrite = file.canWrite();
        System.out.println("是否可写->: " + canWrite);

        //改名为file_tmp
        file.renameTo(new File("io/src/blog/dir/./file_tmp"));

        //删除下面的一个.txt后缀文件
        File removeFile = new File("io/src/blog/dir/./file_tmp/a.txt");
        boolean ret = removeFile.delete();
        System.out.println("是否删除成功->: " + ret);

    }
}

结果:

是否可读->: true
是否可写->: true
是否删除成功->: true

2.InputStream

InputStream可以认为是输入设备和内存(Memory)之间的一个流,而且数据流向是从输入设备(input device)内存(Memory)的。
在这里插入图片描述

我们创建了一个InputStream,就相当于创建了一个输入流对象,可以从输入设备上读数据到内存中。

InputStream官方声明:

public abstract class InputStream
extends Object
implements Closeable

常用的方法:

方法描述
abstract int read()从输入流读取一个字节(byte)的数据,并返回
int read(byte[] b )从输入流读取一些字节并存到b这个数组中
(读取多少个字节,取决于b数组的大小和文件中数据有多少)
int read(byte[] b, int off, int len)最多读取len个字节到b数组中,从指定数组下标开始
void close()关闭输入流,释放资源

因为InputStream是抽象类,所以我们还得找这个类的子类。
InputStream的子类比较多,这里以FileInputStream举例,即文件流,也是经常使用的一个流。

文件流的输入设备就是磁盘(disk),更具体一点就是文件(File)
在这里插入图片描述

FileInputStream的声明:

public class FileInputStream extends InputStream

FileInputStream常用的构造器:

构造器描述
FileInputStream(File file)根据File对象创建一个输入流
FileInputStream(String name)根据文件名创建一个输入流

下面是文件中的数据:

文件:filetest.txt

abcdefghijk

read()方法使用:

public static void test1() {
    InputStream inputStream = null;
    try {
        //创建FileInputStream输入流对象
        inputStream = new FileInputStream("io/filetest.txt");

        //读取一个字节的数据,返回-1表示到达文件末尾
        int data = inputStream.read();

        //输出
        System.out.println("data->: " + data);

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:

data->: 97

int read(byte[] b)方法使用

public static void test2() {
   InputStream inputStream = null;
   try {
       //创建FileInputStream输入流对象
       inputStream = new FileInputStream("io/filetest.txt");

       //读取数据到bytes数组中,返回读取到的字节数,返回-1表示到文件末尾,
       byte[] bytes = new byte[32];
       int ret = inputStream.read(bytes);

       //输出
       System.out.println(Arrays.toString(bytes));

   } catch (IOException e) {
       e.printStackTrace();
   } finally {
       //关闭资源
       try {
           inputStream.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

}

结果:

[97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

int read(byte[] b, int off, int len)方法使用:

public static void test3() {
    InputStream inputStream = null;
    try {
        //创建FileInputStream输入流对象
        inputStream = new FileInputStream("io/filetest.txt");

        //读取数据写到bytes数组指定的位置
        byte[] b = new byte[32];
        int ret2 = inputStream.read(b, 10, 10);

        //输出
        System.out.println(Arrays.toString(b));

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

结果:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

不知道你有没有觉得上面的try…catch…finally这种写法有点繁琐,说白了就是丑😣。
上面的写法跟下面的等价。

    public static void test() throws IOException {
        try (InputStream inputStream = new FileInputStream("io/filetest.txt")) {
            //读取一个字节的数据,返回-1表示到达文件末尾
            int data = inputStream.read();

            //输出
            System.out.println("data->: " + data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这种写法叫,try-with-resource可以自动帮助我们释放资源,即自动调用close()方法。

  • 当发生异常时,能自动调用close()方法,帮助我们释放资源。
    但是并不是所有类都能这样用,只有实现AutoCloseable或者Closeable接口的类,并且重写close()方法才能用这种语法。

AutoCloseableCloseable的关系:

public interface Closeable
extends AutoCloseable

底层释放资源伪代码如下:

AutoCloseable o = (AutoCloseable)inputStream;
o.close();
  • 这里只是伪代码,帮助我们理解,而底层实现跟这个不一样。

3.OutputStream

OutputStream是从内存(Memory)输出设备(output device)的一个流,且流向从内存到输出设备的。

在这里插入图片描述

官方声明:

public abstract class OutputStream
extends Object
implements Closeable, Flushable

常用的方法:

方法描述
abstract void write(int b)写入低八位的数据,后24位的数据是不会写入的
void write(byte[] b)将b数组中的全部字节写入到文件中
void write(byte[] b, int off, int len)从off这个位置开始,将数组b的字节写到文件中
void close()关闭输出流,释放资源
void flush()刷新内存中的缓冲区,把缓冲区的数据写入文件中

调用输出设备flush()方法执行的过程如下:
在这里插入图片描述

OutputStream也是抽象类,最常用的子类是FileOutputStream(文件输出流)。
在这里插入图片描述

FileOutputStream常用的构造器:

构造器描述
FileOutputStream(File file)根据File对象创建一个输出流
FileOutputStream(String name)根据文件名创建一个输出流
FileOutputStream(File file, boolean append)根据File对象创建一个输出流
并且指定是否可追加
FileOutputStream(String name, boolean append)根据文件名创建一个输出流
并且指定是否可追加

example

public class OutputStreamTest {
    public static void main(String[] args) throws IOException {
        //文件路径
        String path = "./io/filetest.txt";

        //创建文件输出流对象
        try ( FileOutputStream fileOutputStream = new FileOutputStream(path)) {
            //调用wirite(int b)方法, 将
            fileOutputStream.write(1);

            //调用write(byte[] b)方法,将byte数组里的每个字节写入文件
            fileOutputStream.write(new byte[]{2, 3, 4});
        }
    }
}

文件内容:
在这里插入图片描述
在idea中显示的内容:
在这里插入图片描述
ascii码表:
在这里插入图片描述

  • 因为文件是二进制文件,以字节为单位,1对应了中的SOH
    2对应STX,3对应ETX,4对应EOT

  • 记事本是不会显示控制字符的,会用其他的字符代替,所以就出现了乱码。而在idea中打开就可以显示每个字节对应的字符。

追加的方式打开文件并写入byte数组:

public class OutputStreamTest2 {
    public static void main(String[] args) {
        appendConstructorTest();
    }

    public static void appendConstructorTest() {
        //路径
        String path = "io/filetest.txt";

        //以追加的方式打开文件输出流
        try (FileOutputStream fileOutputStream = new FileOutputStream(path, true)) {

            //把byte数组写入文件
            fileOutputStream.write(new byte[]{5, 6, 7});
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:
在这里插入图片描述


寄语
清风拂来头发飞扬,指间跳动理想锋芒。

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

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

相关文章

Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权

Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权 1. 前言1.1. 如何找编译好的EXP 2. 定时任务提权2.1. 查看定时任务2.2. 通配符注入提权2.2.1. 创建执行脚本2.2.2. 创建定时任务2.2.3. 查看效果2.2.4. 提权操作2.2.4.1. 切换普通用户2.2.4.2. 执行命令2.2.4.3…

优先、双端队列-我的基础算法刷题之路(八)

本篇博客旨在整理记录自已对优先队列、双端队列的一些总结,以及刷题的解题思路,同时希望可给小伙伴一些帮助。本人也是算法小白,水平有限,如果文章中有什么错误之处,希望小伙伴们可以在评论区指出来,共勉 &…

Netty 源码解析(下)

接上一篇博客 Netty 源码解析(上)继续分析 上一篇博客中已经分析了绝大部分 ChannelFuture cf bootstrap.bind(9000).sync(); 这一行代码,当这一行代码运行完时,Netty服务端就已经启动好了,接下来就是接收链接&#x…

Spring Security OAuth2.0(二)-----简化模式/密码模式/客户端模式/刷新 token

简化模式 代码示例 修改authorization_server授权服务模块 新增“implicit” 和修改回调地址为本次地址 修改第三方应用项目搭建新页面模拟 新建implicit.jsp <% page contentType"text/html;charsetUTF-8" language"java" isELIgnored"fals…

C++入门篇(二)

目录 一、引用1.1 什么是引用&#xff1f;1.2 引用的特性1.3 常引用1.4 引用的使用场景1.5 传值和传引用效率比较1.5.1 传值和传引用做参数的性能对比1.5.2 传值和传引用做返回值的性能对比 1.6 引用和指针之间的区别 二、内联函数2.1 什么是内联函数&#xff1f;2.2 内联函数的…

知识变现海哥|研究了100个项目,这个才是人生逆袭首选

&#xff08;本文源自公号跟海哥学知识变现&#xff0c;移步公号与100万知识变现/知识付费创业者&#xff0c;一起学知识变现知识付费干货&#xff0c;回‘领书’获取3本电子书&#xff1a;【知识付费秘籍】【知识创业者成长手册】【100个知识付费成功案例】) 经常有人问海哥&a…

什么是中断向量表?作用是什么?为什么需要偏移?

一、定义与特点 定义&#xff1a;中断向量表(interrupt vector table)包含中断服务程序地址的特定内存区域&#xff0c;这些服务程序是处理外部硬件中断请求的代码。 特点&#xff1a;这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的&#xff0c;当某个中断…

ESP32-C2开发板 Homekit烧录教程

准备 1.1硬件ESP32 C2开发板&#xff0c;如图1-1所示 图1-1 ESP32 C2开发板 1.2软件 CozyLife APP可以在各大应用市场搜索下载&#xff0c;也可以扫描二维码下载如图1-2所示 HomeKit flash download tool 烧录工具 esp32c2 homkit演示固件 烧录教程 打开flash_download_to…

以智求治,MapGIS打造公共安全治理新模式

随着我国城市人口和规模日益扩大&#xff0c;城市运行系统日趋复杂&#xff0c;各类风险隐患增多且呈现相互叠加、相互耦合态势&#xff0c;各类风险、事故灾害类事件造成的损失严重&#xff0c;公共安全防范压力不断增大。 党的二十大报告中指出&#xff1a;“建立大安全大应…

【容器化应用程序设计和开发】2.1 容器化基础知识和Docker容器

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 容器化应用程序设计和开发 2.1 容器化基础知识和Docker容器2.1.1 容器的创建2.1.2 容器的管理 容器化应用程序设计和开发是一种基于容器技术的应用程序设计和开发方法论。它将应用程序拆分为多个小型服务&#x…

Centos7安装MySQL-5.7.17详细教程

1、MySQL安装包可以在Oracle官网下载 下载链接:https://dev.mysql.com/downloads/mysql/5.7.html 也可以通过wget命令下载 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 下载完成之后解压tar包 命令&#xff1a;tar -zxvf…

Smith预估控制器

Smith预估器主要针对存在大滞后的系统,作用延迟和反馈延迟环节的控制,Smith预估器的另一篇文章,请参看下面的博客文章: 博途1200/1500PLC Smith预估器(补偿器)算法实现(FB)_RXXW_Dor的博客-CSDN博客在写这篇文章之前写过一篇"大林控制算法",大家可以参看下面这…

一款适合智慧档案馆一体化建设平台的多参数空气质量传感器

智慧档案馆一体化建设平台配件产品/空气质量传感器/空气质量云测仪/空气质量检测仪/空气质量探测器/环境集成传感器 主要检测参数&#xff1a;温度、湿度、粉尘PM2.5/PM10、二氧化碳CO2、甲醛、TVOC等六参数档案库房常用环境参数检测。 安装方式&#xff1a;吸顶式 信号输出&…

Element table组件动态设置expand展开项以及同时只展开一项

场景一&#xff1a;table表格展开项过多&#xff0c;界面数据太繁杂影响查看。 场景二&#xff1a;Element Table加载的数据发生变化时&#xff0c;会重新渲染界面&#xff0c;之前的展开项会自动关闭&#xff0c;用户需要手动去打开展开项&#xff0c;频繁的手动操作会极大的影…

Vue系列:在离线环境下部署,CDN无法访问导致vuex.min.js、axios.min.js和vue-router.min.js的cdn地址无法访问

目录 遇到的问题&#xff1a; 问题分析&#xff1a; 解决方案有以下两种&#xff1a; 遇到的问题&#xff1a; 在客户现场部署程序&#xff0c;是在外网环境的服务器上&#xff0c;部署起来后&#xff0c;发现前端vuex.min.js、axios.min.js和vue-router.min.js无法访问 问题…

【Python_Scrapy学习笔记(十)】基于Scrapy框架的下载器中间件创建代理IP池

基于Scrapy框架的下载器中间件创建代理IP池 前言 本文中介绍 如何基于 Scrapy 框架的下载器中间件创建代理IP池。 正文 1、添加中间件的流程 在 middlewares.py 中新建 代理IP 中间件类在 settings.py 中添加此下载器中间件&#xff0c;设置优先级并开启 2、基于Scrapy框…

Node【初识Express框架】

文章目录 &#x1f31f;前言&#x1f31f;Express框架&#x1f31f;1.什么是框架&#x1f31f;2.express安装&#x1f31f;3.创建web服务基本遵循之前的四个步骤&#xff1a; &#x1f31f;4.路由&#x1f31f; 由 &#xff1a;请求方式请求路径&#xff08;1&#xff09;get发…

从传统管理到智慧水务:数字化转型的挑战与机遇

概念 智慧水务是指利用互联网、物联网、大数据、人工智能等技术手段&#xff0c;将智能化、信息化、互联网等技术与水务领域相结合&#xff0c;通过感知、传输、处理水质、水量、水价等数据信息&#xff0c;对水资源进行全面监测、综合管理、智能调度和优化配置的智能化水务系…

电商平台商品数据爬虫分析(test阶段可对接测试)

1.简单说明 京东&#xff0c;淘宝&#xff0c;天猫&#xff0c;&#xff0c;淘特&#xff0c;拼多多&#xff0c;阿里巴巴&#xff0c;1688&#xff0c;抖音&#xff0c;苏宁&#xff0c;亚马逊中国 &#xff0c;lazada&#xff0c;速卖通等全球50多个知名平台抓取数据&#x…

蓝牙耳机哪个品牌音质好?300到400的蓝牙耳机推荐

不知道从什么时候开始&#xff0c;越来越喜欢安静和独处&#xff0c;去外面闲逛也总是佩戴上蓝牙耳机&#xff0c;享受音乐带来的美妙&#xff01;蓝牙耳机便利性也让很多小伙伴开始选择&#xff0c;出门在外&#xff0c;背包里面永远装着蓝牙耳机&#xff0c;以备不时之需&…