当前位置: 首页 > news >正文

文件操作 IO

文件(File)

狭义的文件: 指的是硬盘上的文件和目录
广义的文件: 泛指计算机中很多软硬件资源(操作系统中把很多硬件和软件资源抽象成了文件, 按照文件的方式同意管理)

本章内容只讨论狭义的文件

路径

  1. 绝对路径: 以c: , d: 盘符开头的路径
  2. 相对路径: 以当前所在的目录为基准(工作目录), 以. 或 … 开头(有时 . 可以省略), 找到指定的路径

那么我们的IDEA的工作路径在哪呢?
IDEA 的工作路径默认就是在当前的项目所在目录
在这里插入图片描述

Java 对于文件的操作

  1. 针对文件系统操作(文件的创建, 删除, 重命名)
  2. 针对文件内容的操作(文件的读和写)

Java 标准库中提供了File这个类

在这里插入图片描述
parent 表示当前文件所在目录
child 表示自身的文件名

        File file = new File("d:/text.txt");

构建一个File 对象

import java.io.File;
import java.io.IOException;public class IODemo1 {public static void main(String[] args) throws IOException {File file = new File("./test1.txt");// 获取文件名System.out.println(file.getName());// 获取父级路径System.out.println(file.getParent());// 获取完整路径System.out.println(file.getPath());// 获取绝对路径System.out.println(file.getAbsoluteFile());// 获取绝对路径的简化路径System.out.println(file.getCanonicalPath());}
}

判断文件

import java.io.File;public class IODemo2 {public static void main(String[] args) {File file = new File("d:/f1/f2/test1.txt");// 这个文件是否存在System.out.println(file.exists());// 这是不是一个文件System.out.println(file.isFile());// 这是一个目录吗System.out.println(file.isDirectory());}
}

创建文件

import java.io.File;
import java.io.IOException;public class ThreadDemo3 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");//创建这个文件file.createNewFile();}
}

在这里插入图片描述
删除文件

import java.io.File;public class IODemo4 {public static void main(String[] args) {File file = new File("./test.txt");// 删除文件file.delete();}
}

deleteOnExit


import java.io.File;
import java.io.IOException;public class IODemo5 {public static void main(String[] args) throws IOException {File file = new File("test.txt");System.out.println(file.exists());System.out.println(file.createNewFile());System.out.println(file.exists());//程序运行结束后删除file.deleteOnExit();System.out.println(file.exists());}
}

目录的创建

import java.io.File;public class IODemo6 {public static void main(String[] args) {File dir = new File("d:/f1/f2/f3/f3");dir.mkdir();   // 只能创建一级目录dir.mkdirs();  // 创建多级目录}
}

文件的重命名

import java.io.File;public class IODemo7 {public static void main(String[] args) {File file = new File("./aaa/bbb/test.txt");File file1 = new File("./aaa/bbb/test2.txt");file.renameTo(file1);}
}

Java 标准库的流对象

从类型上分成两个大类

  1. 字节流: 操作二进制数据的
  2. 字符流: 操作文本数据

在这里插入图片描述
read 无参数版本:一次只读一个字节
read 有一个参数版本: 把读到的内容填充到参数的这个字节数组中, (此处的参数是一个输出型参数), 返回值是实际读取的字节数
read 有三个参数的版本: 和一个参数的差不多. 只不过是往数组的一部分区间里尽可能填充

思考:

read 读取的是一个字节, 按理说应该返回一个 byte , 但是实际上是返回int, 这是为什么呢?
这里除了表示byte里的0~255 (-128 ~ 127) 这样的情况外, 还需要表示一个特殊情况, -1,这个标记表示读取文件结束了(读到末尾了).

UTF-8 每个汉字三个字节

字节流读取:

import java.io.*;public class IODemo8 {// 使用字节流读取文件public static void main(String[] args) throws IOException {// 创建InputStream 对象的时候, 使用绝对路径或者相对路径都行, 也可以使用File对象InputStream inputStream = new FileInputStream("d:/test.txt");//        //进行读操作
//        while (true) {
//            int b = inputStream.read();
//            if(b == -1) {
//                // 读取完毕
//                break;
//            }
//            //System.out.println(""+ (byte)b);
//            System.out.printf("%x",(byte)b);
//        }while (true) {byte[] buffer = new byte[1024];int len = inputStream.read(buffer);System.out.println("len: "+ len);if (len == -1) {break;}// 此时读取的字符就被放到了byte[] 中了.for (int i = 0; i < len; i++) {System.out.printf("%x\n", (byte)buffer[i]);}}inputStream.close();}
}

buffer 存在的意义,是为了提高 IO 操作的效率,
单次 IO 操作, 是要访问硬盘的, 所以就会比较耗费时间,
缩短了 IO 操作的次数, 所以效率也就提高了

字节流写文件
在这里插入图片描述
也是类似的三个方法

public class IODemo9 {// 进行写文件public static void main(String[] args) throws IOException {OutputStream outputStream = new FileOutputStream("d:/test.txt");outputStream.write(97);outputStream.write(98);outputStream.write(99);outputStream.write(100);outputStream.close();}
}

在这里插入图片描述
更推荐的写法
这个写法虽然没有显示的写 close , 但是在 try 语句执行完的时候, 会自动执行到 close

public class IODemo {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {outputStream.write(97);outputStream.write(97);outputStream.write(97);outputStream.write(97);outputStream.write(97);outputStream.write(97);}}
}

字符流读文件

package io;import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class IODemo10 {// 字符流的操作public static void main(String[] args) {try (Reader reader = new FileReader("d:/test.txt")) {while (true) {int ch = reader.read();if (ch == -1) {break;}System.out.println("" + (char)ch);}} catch (IOException e) {throw new RuntimeException(e);}}
}

字符流写文件

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class IODemo11 {// 字符流写文件public static void main(String[] args) {try (Writer writer = new FileWriter("d:/test.txt")) {writer.write("hello world");} catch (IOException e) {throw new RuntimeException(e);}}
}

下面我们实现一个删除文件的小程序

import java.io.File;
import java.util.Scanner;public class IODemo12 {private static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {// 让用户输入一个指定搜索的目录System.out.println("请输入一个要搜索的路径: ");String basePath = scanner.next();// 针对用户输入进行简单判定,File root = new File(basePath);if (!root.isDirectory()) {// 路径不存在, 或者是一个普通文件, 此时无法进行搜索System.out.println("输入的路径有误");return;}System.out.println("请输入要删除的文件名: ");// 此处使用 next, 不用 next.LineString nameToDelete = scanner.next();// 针对指定路径进行扫描, 递归操作// 先从根目录出发(root)// 先看看这个目录是否有我们要删除的文件, 如果有就删除, 否则下一个// 如果是包含了一些目录, 那就进行递归scanDir(root,nameToDelete);}private static void scanDir(File root, String nameToDelete) {// 1. 先列出当前路径下包含和目录File[] files = root.listFiles();if (files == null) {// 当前目录没东西, 进行下一步递归return;}// 遍历当前列出的结果for (File f: files) {if (f.isDirectory()) {// 如果是目录就进一步递归scanDir(f,nameToDelete);} else {// 如果是文件就判断if (f.getName().contains(nameToDelete)) {System.out.println("确认要删除 " + f.getName() + "吗?");String choice = scanner.next();if (choice.equals("Y") || choice.equals("y")) {f.delete();System.out.println("删除成功");} else {System.out.println("删除取消");}}}}}
}

文件的复制
就是把一个文件按照字节一次读取, 把结果写入另一个文件中

import java.io.*;
import java.util.Scanner;// 文件的拷贝
public class IODemo13 {public static void main(String[] args) throws RuntimeException {// 输入两个路径 一个源 一个目标路径 (从哪里拷贝到哪)Scanner scanner = new Scanner(System.in);System.out.println("请输入要拷贝哪个文件: ");String srePath = scanner.next();System.out.println("请输入要拷贝到哪个地方: ");String destPath = scanner.next();File srcFile = new File(srePath);if (!srcFile.isFile()) {System.out.println("您输入的源路径有误!");return;}File destFile = new File(destPath);if (destFile.isFile()) {// 如果已经存在不能拷贝System.out.println("您输入的目标路径有误: ");return;}// 进行拷贝操作try (InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {// 进行读文件操作while (true) {int b = inputStream.read();if (b == -1) {break;}outputStream.write(b);}} catch (IOException e) {e.printStackTrace();}}
}

相关文章:

文件操作 IO

文件(File) 狭义的文件: 指的是硬盘上的文件和目录 广义的文件: 泛指计算机中很多软硬件资源(操作系统中把很多硬件和软件资源抽象成了文件, 按照文件的方式同意管理) 本章内容只讨论狭义的文件 路径 绝对路径: 以c: , d: 盘符开头的路径相对路径: 以当前所在的目录为基准(…...

ARouter - 组件化通信方案

官网 https://github.com/alibaba/ARouter/blob/master/README_CN.md 项目简介 一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 功能介绍 支持直接解析标准URL进行跳转&#xff0c;并自动注入参数到目标页面中支持多模块工程使用支持添…...

Linux中常见的权限问题

目录 前言1. 目录权限2. umask3. 粘滞位结语 前言 在了解完上一篇文章 Linux权限的理解与操作 之后&#xff0c;还有一些比较常见的权限问题需要我们去了解。其中包括目录的权限&#xff0c;umask 以及 粘滞位的使用。 1. 目录权限 问题一&#xff1a;进入一个目录&#xff0…...

【技术分享】RK356X Ubuntu 推流USB摄像头

本文适用与触觉智能所有RK356X ubuntu系统的主板。 IDO-SBC3566基于瑞芯微RK3566研发的一款高性能低功耗的智能主板&#xff0c;采用四核A55,主频高达1.8GHz&#xff0c;专为个人移动互联网设备和AIOT设备而设计&#xff0c;内置了多种功能强大的嵌入式硬件引擎&#xff0c;为…...

介绍一下rabbitMq应用场景

任务队列&#xff1a;RabbitMQ可以将待处理的任务放入队列中&#xff0c;再由多个工作进程异步地执行这些任务。 日志处理&#xff1a;RabbitMQ可以通过发布-订阅模式将日志消息分发到多个消费者&#xff0c;并可以灵活地控制消息的优先级和过滤条件。 实时消息处理&#xff…...

IoT 物联网共享充电桩场景中设备资产定位和地理围栏开发实践

基于经纬度的设备资产定位和地理围栏在物联网场景中应用广泛 01 物联网 GEO 场景架构方案 首先&#xff0c;IoT 终端设备通过卫星定位模块获取当前经纬度&#xff1b;然后&#xff0c;将坐标信息实时上报到物联网平台&#xff1b;最后&#xff0c;存储到 Redis GEO 数据库中。 …...

【Qt进阶之自定义控件】使用QListWidget实现自定义Item效果

目的 Q&#xff1a;如何在Qt库的基础上&#xff0c;实现自定义控件呢&#xff1f; A&#xff1a;根据官方文档回答&#xff0c;就是继承需实现的控件&#xff0c;然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何&#xff1a; listItem 主…...

【iOS】UITableView总结(Cell的复用原理、自定义Cell、UITableViewCell协议方法)

UITableView 列表的特点&#xff1a; 数据量大样式较为统一通常需要分组垂直滚动通常可视区只有一个 -> 视图的复用 UITableViewDataSource UITableView作为视图&#xff0c;只负责展示&#xff0c;协助管理&#xff0c;不管理数据 需要开发者为UITableView提供展示所需…...

shell之常见网络命令介绍

shell之常见网络命令介绍 1&#xff09;ifconfig 用于配置网络接口。可以用于开启、关闭和设置网络接口的参数&#xff0c;如IP地址、子网掩码、MAC地址等。 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up上述命令将设置eth0网络接口的IP地址为192.168.1.1&#xff0c;子…...

Android屏幕刷新机制

基础知识 CPU运行在Android设备上的中央处理器&#xff08;Central Processing Unit&#xff09;是Android设备的核心组件之一&#xff0c;负责执行计算和控制设备的各种操作。 Android设备上的CPU通常采用ARM架构&#xff0c;如ARM Cortex-A系列处理器。这些处理器具有高性能…...

Python学习第3天-第一个Python程序

文章目录 前言一、创建项目二、创建程序总结 前言 下面给大家展示下经典的Hello World! 一、创建项目 二、创建程序 print("Hello World!")总结 回到顶部 学习网站 欢迎来到Python的世界&#xff01;...

Golang网络

golang游戏服务器框架 在Go语言中,有许多优秀的游戏服务器框架,以下是一些比较流行的框架: Leaf:一个轻量级的游戏服务器框架,支持多进程、分布式、热更新等特性。它提供了一些常用的组件,如网络层、定时器、数据库等等,可以帮助开发者快速构建游戏服务器。go-ethereum…...

[swift刷题模板] 树状数组(BIT/FenwickTree)

[TOC]([swift刷题模板] 树状数组(BIT/FenwickTree) ) 一、 算法&数据结构 1. 描述 [python刷题模板] 树状数组 二、 模板代码 1. 单点赋值(增加)&#xff0c;区间求和(PURQ) 例题: 307. 区域和检索 - 数组可修改 class BIT {var c: [Int]var n: Int init(_ n: Int){c…...

​CUDA学习笔记(三)CUDA简介

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 前言 线程的组织形式对程序的性能影响是至关重要的&#xff0c;本篇博文主要以下面一种情况来介绍线程组织形式&#xff1a; 2D grid 2D block 线程索引 矩阵在memory中是row-major线性…...

RK3568笔记三:基于ResNet18的Cifar-10分类识别训练部署

若该文为原创文章&#xff0c;转载请注明原文出处。 本篇文章参考的是野火-lubancat的rk3568教程&#xff0c;本篇记录了在正点原子的ATK-DLK3568部署。 一、介绍 ResNet18 是一种卷积神经网络&#xff0c;它有 18 层深度&#xff0c;其中包括带有权重的卷积层和全连接层。它…...

块状数据结构学习笔记

分块 分块的思想和珂朵莉树很类似&#xff0c;就是把原序列分成若干个块&#xff0c;对块进行操作的奇妙思想。复杂度通常带根号。分块的块长也有讲究&#xff0c;通常对于大小为 n n n 的数组&#xff0c;取距离 n \sqrt n n ​ 最近的 2 2 2 的幂数或直接取 n \sqrt n n…...

DOM4J解析.XML文件

<?xml version"1.0" encoding"utf-8" ?> <books><book id"SN123123413241"><name>java编程思想</name><author>华仔</author><price>9.9</price></book><book id"SN1234…...

黑豹程序员-架构师学习路线图-百科:MVC的演变终点SpringMVC

MVC发展史 在我们开发小型项目时&#xff0c;我们代码是混杂在一起的&#xff0c;术语称为紧耦合。 如最终写ASP、PHP。里面既包括服务器端代码&#xff0c;数据库操作的代码&#xff0c;又包括前端页面代码、HTML展现的代码、CSS美化的代码、JS交互的代码。可以看到早期编程就…...

二、BurpSuite Intruder暴力破解

一、介绍 解释&#xff1a; Burp Suite Intruder是一款功能强大的网络安全测试工具&#xff0c;它用于执行暴力破解攻击。它是Burp Suite套件的一部分&#xff0c;具有高度可定制的功能&#xff0c;能够自动化和批量化执行各种攻击&#xff0c;如密码破解、参数枚举和身份验证…...

solidworks 2024新功能之-让您的工作更加高效

您可以创建杰出的设计&#xff0c;并将这些杰出的设计将融入产品体验中。为了帮您简化和加快由概念到成品的产品开发流程&#xff0c;SOLIDWORKS 2024 涵盖全新的用户驱动型增强功能&#xff0c;致力于帮您实现更智能、更快速地与您的团队和外部合作伙伴协同工作。 SOLIDWORKS…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...