文件操作--IO

news2025/3/1 18:57:49

目录

♫什么是文件

♫文件路径

♫文件类型

♫文件的管理

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

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

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

相关文章

深层神经网络(第四周)

这里省略了深层神经网络的前向传播和反向传播,内容和之前相似,不做过多描述。若今后需要,可以再补习。 一、为什么使用深层表示 解决问题时其实并不需要很大的神经网络,但是得有深度,得有比较多的隐藏层。这是为什么…

LeetCode(49)用最少数量的箭引爆气球【区间】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 用最少数量的箭引爆气球 1.题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [x_start, x_end] 表示水平直径在 x_start 和 x_end之间的气球。你不知道气…

基于OpenAPI工具包以及LSTM的CDN网络流量预测

基于LSTM的CDN网络流量预测 本案例是基于英特尔CDN以及英特尔 OpenAPI Intel Extension for TensorFlow* Intel oneAPIDPC Library 的网络流量预测,CDN是构建在现有网络基础之上的智能虚拟网络,目的是将源站内容分发至最接近用户的节点,使用…

【JVM】一篇通关JVM类加载与字节码技术

目录 1. 类文件结构1-1. 魔数 版本 常量池 2. 字节码指令3. 编译期处理4. 类加载阶段5. 类加载器6. 运行期优化 类加载与字节码技术 1. 类文件结构 案例 // HelloWorld 示例 public class HelloWorld {public static void main(String[] args) {System.out.println("h…

淘宝商家店铺注册流程

如果本身已经有淘宝账号了,直接从第三步骤:创建店铺开始就可以了。一、注册淘宝账号、支付宝账号 首先,如果你有买家账号,是可以直接拿来开店的,不用单独在注册淘宝账号开店。 注意事项: 1:淘宝账号注册后,不能修改,如果会员名有写错情况&a…

创意项目开源,文生图、排序/优选等...,持续开源更新!!

热烈欢迎大家在git上star!!!冲鸭!!! 1.dalle1在厨房家具中文场景上训练。 GitHub - leeguandong/DALLE1: dalle1在中文家具场景的微调,效果并不好dalle1在中文家具场景的微调,效果…

Centos7安装GItLab(在线版)

基础环境准备 1.配置清华大学镜像仓库 新建仓库配置文件使用 vim /etc/yum.repos.d/gitlab-ce.repo 命令,输入以下内容,保存 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabl…

拥抱变化,良心AI工具推荐

文章目录 💥 简介🍄 工具介绍🍓 功能特点🥗 使用场景🎉 用户体验🧩 下载地址🍭 总结 💥 简介 我是一名资深程序员,但薪资缺对不起资深两个字,为了生存&#x…

Golang 原生Rpc Server实现

Golang 原生Rpc Server实现 引言源码解析服务端数据结构服务注册请求处理 客户端数据结构建立连接请求调用 延伸异步调用定制服务名采用TPC协议建立连接自定义编码格式自定义服务器 参考 引言 本文我们来看看golang原生rpc库的实现 , 首先来看一下golang rpc库的demo案例: 服…

百度收录批量查询工具,免费SEO优化排名工具

拥有一个在搜索引擎中得到良好收录的网站对于个人和企业都至关重要。而百度,作为中国最大的搜索引擎,其收录情况直接影响着网站的曝光度和流量。 百度搜索引擎是中文用户获取信息的重要途径之一。而在这个竞争激烈的网络环境中,了解自己网站…

Rust国内sparse镜像源配置

文章目录 1. 遇到问题1.1 问题现象1.2 解决办法 2. 重新设置最新 sparse源3. 更多参考资料3.1 字节源3.2 ustc 源3.3 清华源3.4 其他人的总结 1. 遇到问题 有好一阵子没有更新源和安装软件了, 使用ustc的源, 更新了好一阵子, 最后安装居然还出…

微机原理——定时器8253(8254)学习2应用与设计

目录 简要说明 用户扩展的定时计数器应用举例 1 8254作测量脉冲宽度 2 8254作定时 3 8254作分频 4 8254同时用作计数与定时 硬件设计 ​编辑软件设计 微机系统中定时计数器应用举例 5 计时器设计 硬件设计 软件设计 6 发生器设计 硬件设计 软件设计 简要说明 定…

Python模块与Linux stat 命令:双剑合璧的文件系统探索

简介:在Linux和Unix-like系统中,stat命令用于获取文件或目录的详细属性信息,包括但不限于大小、所有权、权限和时间戳。同样,在Python编程中,我们也有多个模块(例如os、pathlib等)提供了与stat类…

个人成长|实现财务自由的秘诀,在这8句话里

哈喽啊,我是雷工! 有人说,当今社会阶层跃迁的通道已经被堵死了,要想从普通人跨越阶级发家致富根本不可能。 也有人认为,只要踩住时代的风口,吃到时代的红利,成为百万富翁的速度会非常快。 我觉…

韵达速递查询,韵达速递单号查询,对需要的单号进行备注

批量查询韵达速递单号的物流信息,对需要的单号进行备注。 所需工具: 一个【快递批量查询高手】软件 韵达速递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上角的“…

C++函数模板,类模板

C函数模板,类模板 1.函数模板1.1函数模板的概念1.2函数模板的格式1.3函数模板的原理1.4函数模板的实例化1.5模板参数的匹配原则 2.类模板2.1类模板的定义格式2.2类模板的实例化 1.函数模板 1.1函数模板的概念 在C中,函数模板是一种通用的函数定义&…

深入理解网络非阻塞 I/O:NIO

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

qt-C++笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解

qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解 文章目录 qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解1.示例运行2.event->pos();详解3.event->pos()的坐标系原点4.Qt中的坐标系详解5.QMainWindow::mousePressEvent(event);详解 1.示例运行 截图时鼠…

MySQL数据库从小白到入门(一)

MySQL概述: MySQL连接: 打开cmd窗口 window r 输入 cmd输入mysql -u用户名 -p密码; 示例:mysql -uroot -p1234; 这种方式登录mysql,会出现警告,建议使用下面这种。mysql -uroot -p 然后回车…

卫星影像数据查询网址(WORLDVIEW1/2/3/4、PLEIADES、SPOT系列、高景、高分1-7、资源系列、吉林一号等)

商业卫星影像数据查询网址(WORLDVIEW1/2/3/4、PLEIADES、SPOT系列、高景、高分1-7、资源系列、吉林一号等) 1、资源卫星应用中心 网址:http://www.cresda.com/CN/ 可查询国产高分1、2、3、4、5、6、7号卫星,资源三号、资源三号…