文件操作--IO

目录

♫什么是文件

♫文件路径

♫文件类型

♫文件的管理

♪File的构造方法

♪File的常用方法

♫文件的内容操作

♪InputStream

♪OutputStream

♪字符流读写文件

♫Scanner与流对象


♫什么是文件

文件在计算机里可以指“狭义”的文件(指硬盘上的文件和目录),也可以值“广义”的文件(操作系统将很多硬件设备和软件资源也抽象成文件来统一管理),这里要介绍的文件就是指“狭义”的文件。

♫文件路径

变量存储数据是在内存中,而文件存储数据则是在硬盘上,每个文件在硬盘上都有一个独有的文件路径,文件路径有绝对路径和相对路径之分,下面这个图片的绝对文件路径就是D:/picture/tree.png:

其中D:为盘符,是通过硬盘分区来的,每个盘符可以对应一个硬盘,也可以多个盘符对应一个硬盘;/用于分割目录,windows也可以用\分割目录,如果在代码中用\需要注意转义字符的问题。

它的相对路径根据当前工作目录的不同而变化:

♩.如果工作目录是D:/,相对路径写作./picyure/tree.png

♩.如果工作目录是D:/picture,相对路径写作./tree.png

♩.如果工作目录是D:/picture./a,相对路径写作../tree.png(..表示当前目录的上一级)

♩.如果工作目录是D:/picture/a/b,相对路径写作../../tree.png

♫文件类型

我们平常使用的文件有音频文件,视频文件,图片文件,word文件等等,这些不同的文件都可以归纳为文本文件和二进制文件两种。

♩.文本文件:是一种用于存储文本数据的文件类型,其中包含 ASCII 或 Unicode 编码的字符。文本文件往往包括人类可读的字符和行结尾符号。常见的文本文件格式包括.txt、.html、.xml 等。

♩.二进制文件:是使用二进制代码编写的文件类型,它们可以包含任何类型的数据,包括图像、音频、视频、可执行文件和其他应用程序数据。二进制文件由计算机使用特定的二进制编码表示,无法直接阅读或修改。

♫文件的管理

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述,但是有  File 对象并不代表真实存在该文件,通过File类可以查询、创建、删除文件。
File的属性
修饰符及返回类型属性描述
static String pathSeparator
依赖于系统的路径分隔符, String 类型的表示
static charpathSeparator
依赖于系统的路径分隔符, char  类型的表示
注:pathSeparator 是File的一个静态变量,相当于 / 或 \ 

♪File的构造方法

方法描述
File(File parent, String child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)
根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, String child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示
File file = new File("d:/");
File file1 = new File(file,"test");
File file2 = new File("d:/test");
File file3 = new File("d:/","test");
System.out.println(file1);
System.out.println(file2);
System.out.println(file3);

运行结果:

♪File的常用方法

返回值类型
方法名描述
StringgetParent()
返回 File 对象的父目录文件路径
StringgetName()
返回 FIle 对象的纯文件名称
StringgetPath()
返回 File 对象的文件路径
StringgetAbsoultePath()
返回 File 对象的绝对路径
String
getCanonicalPath()
返回 File 对象的修饰过的绝对路径
booleanexists()
判断 File 对象描述的文件是否真实存在
booleanisDirectory()
判断 File 对象代表的文件是否是一个目录
booleanisFile()
判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()
根据 File 对象,自动创建一个空文件。成功创建后返回 true
booleandelete()
根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()
根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
Stringlist()
返回 File 对象代表的目录下的所有文件名
File[]listFiles()
返回 File 对象代表的目录下的所有文件,以 File 对象表示
booleanmkdir()
创建 File 对象代表的目录
booleanmkdirs()
创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()
判断用户是否对文件有可读权限
booleancanWrite()
判断用户是否对文件有可写权限

♫文件的内容操作

Java中使用流对象对文件内容进行操作,从类型上分为以字节为单位读写数据的字节流对象(InputStream、OutputStream)和以字符为单位读写数据的字符流对象(Reader、Writer),流对象的四个核心操作是:①.打开文件(构造方法)(8)②.关闭文件(close())③.读文件(read() 对应 InputStream 和 Reader)④.写文件(write() 对应 OutPutStream 和 Writer)。

♪InputStream

InputStream 用于以字节为单位读取文件内容,它是抽象类,可以借助它的实现类(如:FileInputStream)来创建实例对象:

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("d:/test");
        InputStream inputStream1 = new FileInputStream(file);
        InputStream inputStream2 = new FileInputStream("d:/test");
    }
}

创建好实例对象后可以通过read()方法读取该文件的内容:

返回类型方法名描述
intread()
读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)
最多读取 b.length 字节的数据到 b 中,返回实际读到的数
量, -1 代表以及读完了
intread(byte[] b, int off, int len)
off 开始读,最多读取 len - off 个 字节的数据到 b 中,返
回实际读到的数量, -1 代表以及读完了
public class Test {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("d:/test");
        byte[] buffer1 = new byte[1024];
        byte[] buffer2 = new byte[1024];
        int a = inputStream.read();
        inputStream.read(buffer1);
        inputStream.read(buffer2,2,4);
    }
}

注:访问硬盘/IO设备是比较耗时的,故一次读取一个字节,总共读取1024次比一次读取1024个字节更耗时

读取完文件内容后就可以关闭该流对象:

inputStream.close();

注:一个线程对应一个PCB,一个进程对应一个或多个PCB,每个进程里PCB所对应的文件描述符表是共用的,每次打开一个文件都会在文件描述符表上申请一个位置,如果打开的文件不及时释放就可能导致文件描述符表被占满了,这样子下次再申请打开文件就会打开失败

虽然JC会在回收OutputStream对象的时候释放文件描述符表,但一般还是我们手动释放比较及时,为了保证能执行到close操作可以这样处理:

try(InputStream inputStream = new FileInputStream("d:/test")) {
    byte[] buffer1 = new byte[1024];
    byte[] buffer2 = new byte[1024];
    int a = inputStream.read();
    inputStream.read(buffer1);
    inputStream.read(buffer2,2,4);
}

这个语法在Java中叫作try with resources,需要实现Closeable接口的类才被使用:

♪OutputStream

OutputStream 用于以字节为单位写入文件内容,它也是抽象类,可以借助它的实现类(如:FileOutputStream)来创建实例对象

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("d:/text");
        OutputStream outputStream1 = new FileOutputStream(file);
        OutputStream outputStream2 = new FileOutputStream("d:/test");
    }
}

创建好实例对象后可以通过write()方法向该文件写入内容:

返回类型方法名描述
voidwrite(int b)
写入要给字节的数据
voidwrite(byte[] b)
b 这个字节数组中的数据全部写入os中
intwrite(byte[] b, int off, int len)
b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len
public class Test {
    public static void main(String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("d:/text");
        byte[] b = new byte[1024];
        outputStream.write(97);
        outputStream.write(b);
        outputStream.write(b,3,5);
    }
}

注:OutputStream打开一个文件会清空文件的原有内容

OutputStream也继承了closeable接口:

同样可以使用try with resources的方式关闭字节流:

try(OutputStream outputStream = new FileOutputStream("d:/text")) {
    byte[] b = new byte[1024];
    outputStream.write(97);
    outputStream.write(b);
    outputStream.write(b,3,5);
}

由于 I/O 的速度是很慢的,所以 OutputStream 为 了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定缓冲区里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,close()会在关闭流对象的同时刷新缓冲区,通过 flush() 也可以对缓冲区进行刷新:

outputStream.flush();

♪字符流读写文件

字符流读写文件和字节流差不多,都是通过 read() 和 write() 方法实现读写操作:

public class Test {
    public static void main(String[] args) {
        try(Reader reader = new FileReader("d:/text")) {
           while (true) {
               int ch = reader.read();
               if (ch == -1) {
                   break;
               }
               System.out.print("" + (char)ch);
           }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

public  class Test {
    public static void main(String[] args) {
        try(Writer writer = new FileWriter("d:/text")) {
            writer.write("hello");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

♫Scanner与流对象

Scanner 是搭配流对象来使用的,我们常用的 Scanner scanner = new Scanner(System.in); 中 System.in 就是一个标准输入输出流对象(从键盘读取数据),当将该该流对象替换成文件流对象时就会从文件里读取数据:

public class Test {
    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("d;/test")) {
            Scanner scanner = new Scanner(inputStream);
            //从文件读取数据
            scanner.next();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

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

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

相关文章

第一百八十七回 DropdownButton组件

文章目录 1. 概念介绍2. 使用方法2.1 DropdownButton2.2 DropdownMenuItem 3. 示例代码4. 内容总结5. 经验分享 我们在 上一章回中介绍了"DropdownMenu组件"相关的内容,本章回中将介绍 DropdownButton组件.闲话休提,让我们一起Talk Flutter吧…

基于SpringBoot学生宿舍管理系统的设计与开发

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对学生宿舍信息管理混乱,出错率高,信息安全性差…

javaee实验:MVC 框架技术应用——URL 映射及方法参数的使用

目录 urlmvc框架mvc框架的设计mvc流程 实验目的实验内容实验过程创建项目创建项目结构编写代码简单测试一下 url 和 Hypertext 以及 HTTP 一样,URL 是 Web 中的一个核心概念。它是浏览器用来检索 web 上公布的任何资源的机制 URL 代表着是统一资源定位符&#xff…

OpenCV技术应用(6)— 暖色滤镜和冷色滤镜

前言:Hello大家好,我是小哥谈。本节课就手把手教大家如何将一幅图像转化成暖色滤镜和冷色滤镜,希望大家学习之后能够有所收获~!🌈 目录 🚀1.技术介绍 🚀2.暖色滤镜 🚀3.冷色滤…

每日一练:阿姆斯特朗数

1. 概述 阿姆斯特朗数(Armstrong number),也称为自恋数、自幂数(narcissistic number)、水仙花数,是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。换句话…

AVFormatContext协议层:理论与实战

文章目录 前言一、协议操作对象结构二、初始化 AVIOContext 函数调用关系三、avio 实战 1:打开本地文件或网络直播流1、示例源码2、运行结果①、解决方法 1②、解决方法 2 四、avio 实战 2:自定义 AVIO1、示例源码2、运行结果 五、avio 实战 3&#xff1…

Vivado版本控制

Vivado版本控制 如果您有幸进入FPGA领域,那么会遇到版本控制问题,本文讲解的是如何用git进行Vivado进行版本控制。 搭建Git环境 一 首先需要一个git环境,并选择一个托管平台(github,gitlab,gitee) Git下载地址&…

【广州华锐视点】广东3D展厅开发服务找广州华锐视点,打造未来展览新体验!

随着科技的不断发展,人们对于信息获取和传播的方式也在不断创新。传统的实体展览馆在空间、时间、地域等方面存在诸多限制,而3D数字展厅则为我们提供了一个全新的解决方案。广州华锐互动致力于为客户提供专业的3D数字展厅定制开发服务,让您的…

滑动平均窗口的定义,优点,缺点,以及目前的应用!!

文章目录 前言一、滑动平均窗口的优点二、滑动平均窗口的缺点三、滑动平均窗口的应用 前言 滑动平均窗口是一种数据处理方法,它以固定的窗口大小对数据进行移动,并在每个窗口内计算数据的平均值。这种方法主要用于平滑数据,减小数据波动的影…

鸿蒙开发学习笔记

快速入门 配置网络权限 1.打开项目的 module.json5 文件 2.在module 里面写下面代码 3.这样就可以使用网络图片了 4.模拟器上就可以正常显示网络图片了 5.官方文档有相吸说明 6. 华为官方编辑工具使用技巧(内置文档),鼠标移动到标签上&…

计算机网络扫盲(1)——因特网

一、概述 因特网是一个世界范围的计算机网络,即它是一个互联了遍及全世界数十亿计算设备的网络。大家对此应该并不陌生,我们身边有着不计其数的计算机设备被接入了因特网,如今计算机网络这个术语似乎已经有点过时了,用因特网的术语…

STM32-GPIO

一、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下:可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输…

159.库存管理(TOPk问题!)

思路&#xff1a;也是tok的问题&#xff0c;与上篇博客思路一样&#xff0c;只不过是求前k个小的元素&#xff01; 基于快排分块思路的代码如下&#xff1a; class Solution { public:int getkey(vector<int>&nums,int left,int right){int rrand();return nums[r%…

多项式拟合求解

目录 简介 基本原理 例1 例2 例3 参考资料 简介 多项式拟合可以用最小二乘求解&#xff0c;不管是一元高阶函数&#xff0c;还是多元多项式函数&#xff0c;还是二者的混合&#xff0c;都可以通过统一的方法求解。当然除了最小二乘法&#xff0c;还是其他方法可以求解&…

Centos7.9搭建zabbix6.4.0过程及报错注意点

搭建参考此链接即可&#xff1a;https://blog.csdn.net/PerDrix/article/details/129624091 报错整理&#xff1a; 一、zabbix6.0以上版本默认必须安装mysql 8.0.30以上版本数据库&#xff0c;否则服务起不来 二、编译安装zabbix时&#xff0c;必须执行如下操作&#xff0c;…

【STM32】STM32学习笔记-课程简介(1)

00. 目录 文章目录 00. 目录01. 课程简介02. 硬件设备03. 软件工具04. 硬件套件4.1 面包板和跳线/飞线4.2 杜邦线和STM32最小系统板4.3 STLINK和OLED显示屏4.4 LED和按键4.5 电位器和蜂鸣器4.6 传感器和旋转编码器4.7 USB转串口和MPU60504.8 Flash闪存和电机模块4.9 SG90舵机 0…

人工智能中的模型评估

1 概述 1.1 定义 人工智能&#xff08;AI&#xff09;模型评估是一个关键的过程&#xff0c;用于确定模型在特定任务上的性能和有效性。这个过程涉及使用各种技术和指标来衡量模型的准确度、可靠性、泛化能力以及其他重要特性。在不同的应用场景中&#xff0c;模型评估的具体…

深入解析JVM内存结构:Metaspace、堆与垃圾收集器

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Overflow Aware Quantization

Overflow Aware Quantization Framework N o _o o​是 amount of arithmetic overflow 辅助信息 作者未提供代码

前端开发环境与真实环境的接口联通的那些最佳实践

1. 背景 前端开发的产物通常是 app.js 、app.css &#xff0c;然后将这些资源放在真实环境域名下进行工作的。 但前端的开发环境通常是本地的 http://localhost:xxx&#xff0c;业务域名可能是 https://xxx.abc.com&#xff0c;两者不在一个域名下在调用接口或者调试时会非常不…