【JavaEE】File、InputStream和OutputStream的使用

news/2024/4/23 18:18:21/

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.txtboolean 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_tmpfile.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.ppmy.cn/news/47216.html

相关文章

玄子Share - 精选三套 JavaScript 练手项目

玄子Share - 精选三套 JavaScript 练手项目 1. 50 Projects in 50 Days - HTML/CSS and JavaScript 50 天 50 个前端练手项目 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dCWO6V2G-1682076972984)(./assets/image-20230421192413713.png)] [外链…

VUE3的使用

文章目录 一、Vue3基础语法1、Vue开发准备2、Vue的模板语法3、条件渲染4、列表渲染5、事件处理6、表单输入绑定 二、Components组件1、组件基础2、组件交互3、自定义事件的组件交互4、组件生命周期5、引入第三方组件 三、网络请求及路由配置1、Axios网络请求2、Axios网络请求封…

【rustdesk】rust入门及 windows尝试编译

rustup 微软建议用vs code开发 下载了64位的版本: vs code 插件 rust-analyer 介绍Better TOML,用于更好的展示.toml文件Error Lens, 更好的获得错误展示 One Dark Pro, 非常好看的Vscode主题 CodeLLDB, debugger程序 安装

vue:生成二维码 qrcode、vue-qr(二维码中间可带logo)

一、方法一 qrcode qrcode - npm 1.1、安装 yarn add qrcode 1.2、页面引入 import QRCode from qrcode; 1.3、方法里边使用 getQRCodeUrl(){ QRCode.toDataURL(hello world,{color: {dark:"#010599FF",light:"#FFBF60FF"}}).then((url) > {// 获…

循环结构化命令小结

shell脚本编程系列 循环是编程不可或缺的一部分。bash shell提供了三种循环命令。 for命令允许遍历一系列的值,无论是在命令行中提供的,还是包含在变量中的,或是通过文件名通配符匹配获得的文件名和目录名。 for var in list docommands do…

MySQL索引数据结构入门

之前松哥写过一个 MySQL 系列,但是当时是基于 MySQL5.7 的,最近有空在看 MySQL8 的文档,发现和 MySQL5.7 相比还是有不少变化,同时 MySQL 又是小伙伴们在面试时一个非常重要的知识点,因此松哥打算最近再抽空和小伙伴们…

在React中使用setState修改数组的值时,为什么不能使用数组的可变方法(push、unshift等)? 但在vue中可以

一、为什么React中修改数组时不能使用数组的可变方法 在React中使用setState修改数组的值时,不推荐使用数组的可变方法(如push、unshift等)。这是因为React会对比新旧状态,在发现状态变化后,更新组件的渲染。但当你调…

TiDB实战篇-TiDB Cluster部署

简介 部署TiDB Cluster部署,熟系集群的基础操作。 集群规划 机器拓扑 3pd,3tikv,1tidb_server.1tiflash,监控。 192.168.66.10192.168.66.20192.168.66.21 pd_servers tikv_servers tidb_servers tiflash_servers pd_servers tikv_servers monitoring_servers…

SSH升级

升级openssh版本 一、安装telnet远程管理主机1、检查是否安装telnet2、安装telnet服务 二、下载所需的安装包1、下载openssl、openssh、zlib安装包2、安装所需的相关软件3、备份原来的数据4、复制文件到/usr/local/bin/下增加执行权限 一、安装telnet远程管理主机 1、检查是否…

用SQL语句操作Oracle数据库--数据查询详解(下篇)

数据查询是数据库的核心操作。上一篇文章我们介绍了单表查询操作,本文将继续介绍另一种重要的查询类型—[ 多表查询 ](涉及多个表的数据查询)。 本文我们将使用以下三个表来进行查询操作: TABLE1: S(学生基本信息表) TABLE2: C(…

设置Pycharm的背景颜色(样式)、图片

目录 一、效果 二、背景图片 三、背景颜色 一、效果 二、背景图片 1.打开Pycharm中的File-Settings 2.点击Appearance & Behavior中的Appearance,然后点击Bcakground Image (图中已标明顺序) 3.找到图片并选中。 (图中已…

需要买apple pencil吗?ipad第三方电容笔了解下

第一款ipad早在诞生于十年前,并被作为一款平板电脑使用,其性能十分出色。随着IPAD的不断更新换代,IPAD已经被越来越多的人接受了。其中,iPad的附属配件起到了很大的作用,就像今天要介绍的电容笔,它是我们进…

ARM rootfs、linuxrc 的简单制作

一、nfs 方式启动自制简易文件夹形式的rootfs 1、什么是nfs (1) nfs 是一种网络通讯协议,由服务器和客户端构成。 (2) nfs 的作用。利用 nfs 协议,可以做出很多直接性的应用,我们这里使用 nfs 主要是做 rootfs 挂载。 开发板中运行 kerne…

【Linux】NanoPi-NEO2外接spi-lcd

这是目录 一、显示接口1.1、LCD接口1.2、核心板接口 二、添加驱动2.1、确认驱动型号2.2、添加驱动 三、测试四、附加4.1、交叉编译器安装4.2、内核和module编译4.3、扩展rootfs大小 本文使用环境: 电脑:Ubuntu 18.04.5 LTS 开发板:NanoPi-NEO…

Microsoft Power Apps部署方案

目录 前言 一、准备条件 二、Power Apps环境部署 三、应用程序部署 四、最佳实践 总结

[异常]java常见异常

Java.io.NullPointerException null 空的,不存在的NullPointer 空指针 空指针异常,该异常出现在我们操作某个对象的属性或方法时,如果该对象是null时引发。 String str null; str.length();//空指针异常 上述代码中引用类型变量str的值为…

DS树--二叉树高度

题目描述 给出一棵二叉树,求它的高度。 注意,二叉树的层数是从1开始 输入 第一行输入一个整数t,表示有t个二叉树 第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行 输出 每行输出一个二叉…

基于 DSP+FPGA+1553B总线的水下信息融合系统的设计

在一个大型水下系统中,针对不同分系统的特 性,通常采用不同的通信协议。串行通信具有抗干扰 能力强,传输距离远等特点,适用于需要远距离通信 的分系统; MIL-STD-1553B 总线在传输方面具有极强 的可靠性和实时性&a…

Linux DHCP服务

DHCP 作用 DHCP动态主机配置协议作为服务端负责集中给客户端分配各种网络地址参数(主要包括IP地址、子网掩码、广播地址、默认网关地址、DNS服务器地址) 传输协议端口 服务端 UDP 67端口 客户端 UDP 68端口 工作原理 1) 客户端广播发送DISCOVER报文寻找服务端 2) 服务端广播发…

OpenAI-ChatGPT最新官方接口《语音智能转文本》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(六)(附源码)

Speech to text 语音智能转文本 Introduction 导言Quickstart 快速开始Transcriptions 转录python代码cURL代码 Translations 翻译python代码cURL代码 Supported languages 支持的语言Longer inputs 长文件输入Prompting 提示其它资料下载 Speech to text 语音转文本 Learn how…