当前位置: 首页 > 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…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...