文件操作和IO流(Java版)

news2024/10/2 14:22:04

前言

我们无时无刻不在操作文件。可以说,我们在电脑上能看到的图片、视频、音频、文档都是一个又一个的文件,我们需要从文件中读取我们需要的数据,将数据运算后也需要将结果写入文件中长期保存。可见文件的重要性,今天我们就来简单介绍一下Java中关于文件的操作和读写。

什么是文件

我们日常生活中也有关于文件的概念,它们一般是这样的:

计算机中文件的概念完全可以从日常生活中的文件类比出来。我们知道计算机可以存储多种多样的数据类型,可以是图片,可以是音频……但不同形式的数据如何更加高效的管理呢,我们就抽象出文件的概念,上面提及到的类型都可以从属于文件这个大的体系下,我们不在关注我们操作的具体是什么,因为我们操作的都是文件。这大大降低了学习和使用的成本。当然文件存储的除了数据以外也存储了维护文件的信息,被称为文件源信息。

随着文件的越积越多,文件的管理和组织方式成为一个让人头疼的东西。最终我们从日常的文件管理中获得灵感,选取文件夹/目录的形式管理文件,其中的数据结构使用的是多叉树的树形结构

路径(Path)

如何定位到唯一的文件,这就是路径的概念。路径可以分为绝对路径和相对路径。

绝对路径指的是从系统根目录出发到达目标文件的完整路径,它是唯一的

相对路径指的是从源位置到目标文件的路径,选取不同的源位置路径也是不同的

就好比学校的位置,如果是绝地路径指的是它的经纬度,相对路径指的是从家到学校的路径,所有人的家在不一样的位置这个相对路径也不同,但这个经纬度对于任何位置都是唯一的

文件的分类

文件可以分为二进制文件和文本文件。常见的二进制文件有图片,视频……文本文件有txt文件。两者的本质区别就在于,文本文件中存储的字符,二进制文件存储的是01。但文本文件在硬盘上本质上存储的依然是二进制01,只不过在逻辑上文本文件会将字符转换成对应的二进制进行存储。

快速区分这两者的办法就是用记事本打开,看得懂的是文本文件,看不懂的是二进制文件。

其他

Windows系统用文件的后缀标识文件的类型和默认的打开方式。Windows系统可以为文件设置权限。Windows还有一类特殊的文件,就是快捷方式,本质上就是文件引用。为了操作方便,很多操作系统将所有I/O设备都抽象成文件

文件操作(File类)

文件操作我们只需要介绍一个类——File

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不
代表真实存在该文件,File不涉及文件的读写

属性

pathSeparatorChar(char)和 pathSeparator(String) 代表文件的路径分隔符,自动获取

构造方法

其中,如果需要使用相对路径,一般用 . 表示本目录 用 .. 表示上级目录。

 方法

package www.Zheng;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/**
 * @Title: Demo1
 * @Author zyh
 * @Package www.Zheng
 * @Date 2024/7/7 16:41
 * @description: 文件操作方法
 */
public class Demo1 {
    public static void main7(String[] args) {
        File file = new File("./test.txt");
        System.out.println(file.canRead());//boolean canRead()判断是否有读取权限
        System.out.println(file.canWrite());//boolean canWrite()判断是否有写入权限
    }
    public static void main(String[] args) {
        File file = new File("./test.txt");
        File file2 = new File("./test/ttt.txt");
        System.out.println(file.renameTo(file2));//  boolean renameTo文件改名,逻辑是将源文件剪切,在目标位置粘贴在重命名
    }
    public static void main5(String[] args) {
        File f = new File("./test");
        System.out.println(f.mkdir());// boolean mkdir() 创建一级目录
        File file = new File("./test/test1");
        System.out.println(file.mkdirs());//boolean mkdirs() 创建多级目录
    }
    public static void main4(String[] args) throws IOException {
        File parent = new File("./");
        for (String s: parent.list()) {// String[] list()得到本目录下所有的文件名
            System.out.println(s);
        }
        System.out.println(Arrays.toString(parent.list()));
        for (File file : parent.listFiles()) {//File[] listFiles()得到本目录下所有的文件
            System.out.println(file.getCanonicalPath());
        }


    }
    public static void main3(String[] args) throws InterruptedException {
        File parent = new File("./");
        File file = new File(parent,"/test.txt");
        file.delete();// boolean delete()将文件立即删除
        file.deleteOnExit();// void deleteOnExit()将文件标记未删除,JVM运行结束后删除
        Thread.sleep(2000);
        System.out.println("程序结束");
    }
    public static void main2(String[] args) throws IOException {
        File parent = new File("./");
        File file = new File(parent,"/test.txt");
        System.out.println(file.exists());
        System.out.println(file.isDirectory());//boolean isDirectory() 判断文件是否未文件夹/目录
        System.out.println(file.isFile());//  boolean isFile()判断文件是否未普通文件

        file.createNewFile();//boolean createNewFile()新建file指定路径的文件

        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }
    public static void main1(String[] args) throws IOException {
        File parent = new File("./");
        File file = new File(parent,"/test.txt");
        System.out.println(file.exists());//  boolean exists() 判断File文件是否真是存在
        System.out.println(file.getParent()); //String getParent() 返回 File 对象的父目录文件路径
        System.out.println(file.getName());  //String getName()返回 File 对象的文件名称
        System.out.println(file.getPath()); //  String getPath() 获得文件的路径,如果初始化使用的是相对路径得到的是相对路径,如果初始化使用的是绝对路径得到的是绝对路径
        System.out.println(file.getAbsolutePath());//String getAbsolutePath() 获得绝对路径,未修饰
        System.out.println(file.getCanonicalPath());//  String getCanonicalPath()获得绝对路径,修饰
        //修饰和未修饰在初始化传入绝对路径时没有区别,在传入相对路径时修饰会将 ./ 删除
    }
}

什么是流

流是什么?流其实就是对IO设备的封装。我们可能会向不同的IO设备上读写数据,这显然是件很麻烦的事情,意味着我们需要为不同的IO设备都设计一种代码。这时候我们就引入了流的概念,将所有的IO设备都封装在流里面,这时候我们只需要向流内读写数据即可

文件的读写操作(流操作)

我们根据操作文件的类型可以分为字节流和字符流,再根据读写可分为字节输入流,字节输出流,字符输入流,字符输出流。主要对应的是四个抽象类,分别是

InputStream//字节输入流
OutputStream//字节输出流
Reader//字符输入流
Writer//字符输出流

上面四个都是抽象类,使用我们需要使用它们的实现类。这里我们只关心文件,用的都是File相关的实现类,理论上不同的IO设备都会有具体的实现类。

        InputStream inputStream = new FileInputStream();
        OutputStream outputStream = new FileOutputStream();
        Reader reader = new FileReader();
        Writer writer = new FileWriter();

上面四个实现类均需要传入File或者文件路径以定位到操作文件

下面我们来简单的认识一下这四个实现类

FileInputStream

读取

public int read() throws IOException 读取一个字节,返回值-1则代表读完否则代表读到的内容
public int read(byte b[]) throws IOException 将读取的内容尽量填满数组,返回值代表读到的有效数,-1则代表读完
public int read(byte b[], int off, int len) throws IOException 将读取的内容尽量填满数组从off后len个元素,返回值代表读到的有效数,-1则代表读完

关闭

public void close() throws IOException 资源回收

FileOutputStream()

写入

public void write(int b) throws IOException 写入一个字节的数据
public void write(byte b[]) throws IOException 将数组内的数据写入
public void write(byte b[], int off, int len) throws IOException 将数组从off往后len个元素的数据写入
public void close() throws IOException 资源回收
public void flush() throws IOException 刷新缓存区。因为IO操作的速度很慢,为了提高效率,一般将数据填满一块区域或者触发其他机制会将数据刷新到硬盘上。这块区域就叫缓冲区,机制之一就是flash

FileReader 和 FileWriter

这两个字符流的使用和字节流的使用极为类似,只不过就是字节流的操作单位是字节和字节数组,字符流的操作单位是字符和字符串,甚至方法名和使用都是相同的不过传入的参数类型不同。这里就不在展开

字节流转字符流

我们在这里再介绍两个方法,分别是字节输入流转字符输入流,字节输出流转字符输出流

package www.Zheng;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

/**
 * @Title: Demo6
 * @Author zyh
 * @Package www.Zheng
 * @Date 2024/7/7 23:29
 * @description: 字节输入转换为字符输入的简单实现
 */
public class Demo6 {
    public static void main(String[] args) {
        try (InputStream stream = new FileInputStream()){
            Scanner scanner = new Scanner(stream);
            System.out.println(scanner.nextLine());
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
package www.Zheng;

import java.io.*;
import java.util.Scanner;

/**
 * @Title: Demo7
 * @Author zyh
 * @Package www.Zheng
 * @Date 2024/7/7 23:39
 * @description: 字节输出流转字符输出流
 */
public class Demo7 {
    public static void main(String[] args) throws IOException {
        try (OutputStream stream = new FileOutputStream()){
            PrintWriter writer = new PrintWriter(stream);
            writer.printf("哈哈");
            writer.flush();
        }
    }
}
//PrintWriter 类中提供了我们熟悉的 print/println/printf 方法
//同样也有flash方法

结语

以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。

因为这对我很重要。

编程世界的小比特,希望与大家一起无限进步。

感谢阅读!

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

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

相关文章

泛微E-Cology getFileViewUrl SSRF漏洞复现

0x01 产品简介 泛微协同管理应用平台e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 0x02 漏洞概述 泛微E-Cology getFileViewUrl 接口处存在…

[安洵杯 2019]easy_serialize_php

源码&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user"] guest; …

0010基于免疫遗传算法的配送中心选址

免疫优化算法&#xff08;Immune Optimization Algorithm, IOA&#xff09;在物流配送中心选址中的应用是通过模拟免疫系统的进化过程来解决选址优化问题。物流配送中心选址问题涉及到如何在给定区域内选择最优的位置&#xff0c;以最大化服务覆盖并最小化运输成本。 免疫优化…

神经网络设计过程

1.可根据Iris特征直接判断 2.神经网络方法&#xff0c;采集大量的Iris特征&#xff0c;分类对应标签&#xff0c;构成数据集。 将数据集喂入搭好的神经网络结构&#xff0c;网络通过反向传播优化参数得到模型。 有新的网络送入到模型里&#xff0c;模型会给出识别结果。 3.…

PHP7.4安装使用rabbitMQ教程(windows)

&#xff08;1&#xff09;&#xff0c;安装rabbitMQ客户端erlang语言 一&#xff0c;erlang语言安装 下载地址1—— 下载地址2——https://www.erlang.org/patches/otp-27.0 二&#xff0c;rabbitMQ客户端安装 https://www.rabbitmq.com/docs/install-windows &#xff08…

【JavaEE】 简单认识CPU

&#x1f435;本篇文章将对cpu的相关知识进行讲解 一、认识CPU 下图是简略的冯诺依曼体系结构图 上图中&#xff0c;存储器用来存储数据&#xff0c;注意在存储器中都是以二进制的形式存储数据的&#xff0c;CPU就是中央处理器&#xff0c;其功能主要是进行各种算术运算和各种…

【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程

一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …

基于 sftp 的 NAS (局域网文件存储服务器)

局域网 NAS (文件存储服务器) 的基本功能有: 能够存储文件, 同时能够通过多个设备访问 (上传/下载) 文件. 这些功能通过 sftp 可以实现. sftp 是基于 SSH 的文件传输协议, SSH 全程加密传输, 使用 公钥 认证 (不使用密码/口令), 能够提供很高的安全性. 上文说到, 在 LVM 和 bt…

存储产品选型策略 OSS生命周期管理与运维

最近在看阿里云的 云存储通关实践认证训练营这个课程还是不错的。 存储产品选型策略、对象存储OSS入门、基于对象存储OSS快速搭建网盘、 如何做好权限控制、如何做好数据安全、如何做好数据管理、涉及对象存储OSS的权限控制、使用OSS完成静态网站托管、对OSS中存储的数据进行分…

《植物大战僵尸杂交版》2.2版本:全新内容与下载指南

《植物大战僵尸杂交版》2.2版本已经火热更新&#xff0c;带来了一系列令人兴奋的新玩法和调整&#xff0c;为这款经典的塔防游戏注入了新的活力。如果你是《植物大战僵尸》系列的忠实粉丝&#xff0c;那么这个版本绝对值得你一探究竟。 2.2版本更新亮点 新增看星星玩法 这个新…

QT学习日记一

创建QT文件步骤 这是创建之后widget.cpp和widget.h文件的具体代码解释&#xff0c;也是主要操作的文件&#xff0c;其中main.cpp不用操作&#xff0c;ui则是图形化操作界面&#xff0c;综合使用时&#xff0c;添加一个元件要注意重编名和编译一下&#xff0c;才能在widget这类…

tomcat 项目迁移,无法将项目作为服务service启动

背景 测试服务器需要迁移到正式服务器上&#xff0c;为了方便省事&#xff0c;将测试服务器上的一些文件直接复制到正式服务器 问题 使用startup启动项目之后&#xff0c;可以直接使用使用tomcat9w启动&#xff0c;或者作为服务service启动的时候&#xff0c;显示无法访问到资源…

STM32 GPIO的工作原理

STM32的GPIO管脚有下面8种可能的配置:&#xff08;4输入 2 输出 2 复用输出) &#xff08;1&#xff09;浮空输入_IN_FLOATING 在上图上&#xff0c;阴影的部分处于不工作状态&#xff0c;尤其是下半部分的输出电路&#xff0c;实际上是与端口处于隔离状态。黄色的高亮部分显示…

程序中的log4j、stderr、stdout日志区别

使用 databricks 的过程中&#xff0c;发现他将日志分为 log4j、stderr、stdout日志。了解日志是调试程序关键技能。顺着这个思路&#xff0c;我认真学习了一下这几个日志的区别。 目录 Java 中的日志目录结构使用log4j记录日志向标准输出和标准错误输出写信息运行结果 以pytho…

前端八股文 闭包的理解

什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数 ——《JavaScript高级程序设计》 &#xff08;闭包 内层函数 引用的外层函数的变量&#xff09; 下面就是一个简单的闭包 闭包不一定必须有 return 闭包不一定有内存泄漏 闭包 什么时候用到 return 就是 外部…

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果,可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面,主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前,请确保在pubspec.yaml文件中添加senso…

中职网络安全Server2216

任务环境说明&#xff1a;✓ 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09;✓ 用户名:root密码&#xff1a;1234561.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程找出启动异常进程的脚本&#xff0c;并将其绝对路径作为Flag值提交…

2.17分一区文献精读:机器学习:乳腺癌预后预测的统计和机器学习模型的开发及内外部验证:队列研究-摘要

#精医求精&#xff0c;文献阅读 大家好&#xff0c;我是蔡老师&#xff0c;一个立志学会所有医学大数据分析模型的女子 今天我们从文献阅读开始 这篇文章的影响因子为17分&#xff0c;全文名称为《Development and internal-external validation of statistical and machine l…

Tensorflow之损失函数与交叉熵

损失函数&#xff1a;预测值与已知答案之间的差距 NN优化目标&#xff1a;loss最小{mse&#xff0c; 自定义&#xff0c; ce) 均方误差tensorflow实现&#xff0c;loss_mse tf.reduce_mean(tf.sqrue(y_-y) 预测酸奶日销量&#xff0c;y&#xff0c;x1, x2是影响日销量的因素…

什么是RPC?有哪些RPC框架?

定义 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节&#xff0c;使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分…