【JavaEE】File、InputStream和OutputStream的使用

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();
        }
    }
}

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS学习第九节——服务通信

1.基本介绍 服务通信较之于话题通信更简单些,理论模型如下图所示,该模型中涉及到三个角色: ROS master(管理者)Server(服务端)Client(客户端) ROS Master 负责保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client &#…

如何在不丢失数据的情况下重装Windows 10?

为什么需要重新安装Windows 10? 随着时间的推移,Windows可能会变慢。这可能是由多种原因引起的,例如您安装了许多额外的启动程序,这些程序会延长启动过程等。如果您的Windows系统速度变慢并且无论您卸载多少程序都没有加速&…

Pixhawk基础—认识Pixhawk

Pixhawk简介 pixhawk是由3DR联合APM小组与PX4小组于2014年推出的飞控PX4的升级版,它同时拥有PX4和APM两套固件和相应的地面站软件。该飞控是目前全世界飞控产品中硬件规格最高的产品。 Pixhawk基础 端口介绍 1、Spektrum DSM receiver(Spektrum DSM信号转换为PWM…

PXE+Kickstart自动化安装操作系统

文章目录 PXEKickstart 完美自动化部署系统理论知识:1、PXE2、DHCP 实践实验:1、DHCP服务器配置2、TFTP服务器配置3、HTTP服务器安装4、PXE配置5、Kickstart实践配置 PXEKickstart 完美自动化部署系统 理论知识: 无人值守原理:K…

思科实验 EIGRP

1.1.1 实验目的 通过对 CCNA 课程中的 EIGRP 实验部分进行回顾,从而更加准确掌握 EIGRP 路由协议的 配置方法,以及对 network 命令的正确理解。并且学会对 EIGRP 路由协议查看排错的相关命 令。 1.1.2 实验拓扑 拓扑说明:本实验由两台思科路…

第七章 法律行为与法律意识

目录 第一节 法律行为 一、 法律行为的含义与特征二、 法律行为的结构 (一)法律行为的内在方面 动机目的认知能力 (二)法律行为的外在方面 行动(行为)手段结果 三、法律行为的分类 第二节 法律意识 一、法…

Qt Quick - PageIndicator

Q 理论使用总结 一、概述二、简单使用例子1. SwipeView 和 PageIndicator2. StackLayout 和 PageIndicator 三、常用属性四、定制化 一、概述 PageIndicator用于指示含有多个页面的容器中,当前处理活动的页。记住,这个只是指示当前的活动页,…

4个Python库来美化你的Matplotlib图表

Matplotlib是一个被广泛使用的Python数据可视化库,相信很多人都使用过。 但是有时候总会觉得,Matplotlib做出来的图表不是很好看、不美观。 今天就给大家分享四个美化Matplotlib图表的Python库,它们可以轻松让你的Matplotlib图表变得好看&…

【进阶C语言】有关动态内存管理的经典笔试题(详细图文讲解)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于C语言进阶系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数…

ActiveMQ使用

一、什么是消息中间件 消息中间件顾名思义实现的就是在两个系统或两个客户端之间进行消息传送 二、什么是ActiveMQ ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的&#xff0c…

4.23、TCP状态转换(为什么四次挥手)

4.23、TCP状态转换 1.TCP状态转换图2.为什么需要四次挥手,状态转换 1.TCP状态转换图 2.为什么需要四次挥手,状态转换 2MSL(Maximum Segment Lifetime) 主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl ms…

ABAP:自定义搜索帮助:可参考标准函数F4IF_SHLP_EXIT_EXAMPLE

当我们在自定义选择屏幕中, 需要写入我们自定义的搜索帮助的时候,可以通过预定义函数来实现: 实例说明: 第一步:创建搜索帮助SE11分销渠道(Z_VTWEG) 1.选择基本索引帮助: 2.选择参考表,因为这…

今天面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今天上班开早会就是新人见面仪式,听说来了个很厉害的大佬,年纪还不大,是上家公司离职过来的,薪资已经达到中高等水平,很多人都好奇不已,能拿到这个薪资应该人不简单,果然,自我介绍的…

【数据结构】堆的应用(堆排序的实现 + (向上/向下)建堆时间复杂度证明 + TopK问题(笔记总结))

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&…

Android---性能优化之图片压缩

质量压缩 质量压缩会用到 Bitmap.compress()。 public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream); 这个方法有三个参数: Bitmap.CompressFormat format:图像的压缩格式(jpeg ,png, webp&#xf…

PS封装格式:GB28181协议RTP传输

在安防行业,有个协议是无论如何都要适配的,因为公安监控网络用的就是它,它就是:GB28181。而这份协议主要由海康制定,所以除了海康其他厂商想要适配都会少许有点儿麻烦。 1. GB28181要求的RTP流格式     首先&…

C++ 类之间的纵向关系-继承

目录 继承的基本概念 定义 使用方法 内存空间 继承下构造析构执行的顺序 构造函数 析构函数 继承的优点 继承方式 public protected private 隐藏 回顾函数重载 隐藏 父类指针指向子类对象 优点 出现的问题 类成员函数指针 普通的函数指针 类成员函数指针 类…

RK3568平台开发系列讲解(调试篇)debugfs 分析手段

🚀返回专栏总目录 文章目录 一、enable debugfs二、debugfs API三、使用示例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 上有一些典型的问题分析手段,从这些基本的分析方法入手,你可以一步步判断出问题根因。这些分析手段,可以简单地归纳为下图: 从这…

6、索引的数据结构

3.3 常见的索引概念 索引按照物理实现方式,索引可以分为 2 种:聚簇和非聚簇索引 1、聚簇索引 5、索引的代价 空间上的代价 每建立一个索引都要为它建立一棵B树,每一棵B树的每一个节点都是一个数据页,一个页默认会占用 16KB 的存…

(排序11)排序的时间复杂度,空间复杂度,稳定性总结

图片总结 内排序时间复杂度总结 内部排序:数据元素全部放在内存中的排序。. 在内排序当中比较快的有希尔排序,堆排序,快速排序,归并排序,这四个排序的时间复杂度都是O(n*logn)。其中希尔排序的时间复杂度更加准确的来…