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

零基础也能搞定!Trae+MCP实战:从天气查询到Excel自动化,解锁AI协作新姿势

1. 为什么你需要Trae和MCP&#xff1f; 如果你经常需要处理天气数据查询、Excel表格整理这类重复性工作&#xff0c;或者想让不同AI工具协同完成复杂任务&#xff0c;TraeMCP的组合就是为你量身定制的解决方案。这就像给你的工作流程装上了"自动驾驶"系统——原本需要…...

Keil5汇编语言模拟仿真:从环境搭建到寄存器调试实战

1. Keil5与汇编语言仿真入门指南 第一次接触Keil5和汇编语言仿真时&#xff0c;我完全被那些寄存器窗口和汇编指令搞懵了。后来才发现&#xff0c;这其实是理解单片机底层运行原理的最佳途径。就像拆开钟表看齿轮如何咬合&#xff0c;通过Keil5的模拟仿真功能&#xff0c;我们可…...

ArcGIS属性表多条件筛选:精准圈定目标要素的SQL实战

1. 从零开始理解ArcGIS属性表筛选 刚接触ArcGIS那会儿&#xff0c;我最头疼的就是从密密麻麻的属性表里找特定要素。记得有次为了筛选出某几个特定村庄&#xff0c;硬是手动勾选了上百条记录&#xff0c;眼睛都快看花了。后来才发现&#xff0c;原来属性表里藏着个"SQL查询…...

拯救者笔记本电池健康管理深度指南:LenovoLegionToolkit专业配置方案

拯救者笔记本电池健康管理深度指南&#xff1a;LenovoLegionToolkit专业配置方案 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

精通FreeCAD尺寸标注:5个高效实战技巧提升工程图纸质量

精通FreeCAD尺寸标注&#xff1a;5个高效实战技巧提升工程图纸质量 【免费下载链接】FreeCAD_drawing_dimensioning Drawing dimensioning workbench for FreeCAD v0.16 项目地址: https://gitcode.com/gh_mirrors/fr/FreeCAD_drawing_dimensioning FreeCAD绘图尺寸标注…...

从MySQL到PostgreSQL:xxl-job数据库适配实战与避坑指南

1. 为什么需要从MySQL迁移到PostgreSQL 在实际项目开发中&#xff0c;我们经常会遇到需要更换数据库的情况。xxl-job作为一款优秀的分布式任务调度平台&#xff0c;默认使用的是MySQL数据库。但很多企业的技术栈可能更倾向于PostgreSQL&#xff0c;这就产生了数据库适配的需求。…...

PSoC Creator新手入门:5分钟搞定LED闪烁项目(附详细配置截图)

PSoC Creator零基础实战&#xff1a;从环境搭建到LED流水灯开发全指南 第一次接触PSoC Creator时&#xff0c;我被它独特的"可编程片上系统"概念所吸引——这不仅仅是简单的单片机开发&#xff0c;而是将硬件设计与软件编程融为一体的创新平台。对于刚拿到CY8CKIT-0…...

地府管理系统:用代码搭建你的冥界数字中枢

地府管理系统&#xff1a;用代码搭建你的冥界数字中枢 【免费下载链接】netherworld-console 地府管理系统完整版&#xff0c;功能完整&#xff0c;多用户多权限&#xff0c;有前台功能 项目地址: https://gitcode.com/gh_mirrors/ne/netherworld-console 想象一下&…...

STM32CubeIDE用户看过来:用CMake管理你的自定义代码模块,让项目结构更清晰

STM32CubeIDE用户进阶指南&#xff1a;用CMake重构项目架构的五个关键策略 当你面对第17个基于STM32CubeMX生成的项目时&#xff0c;是否发现那些散落在各个角落的驱动代码越来越难以管理&#xff1f;我们曾在一个工业控制器项目中&#xff0c;因为模块耦合度过高导致功能更新时…...

Ultimaker Cura:如何用开源切片软件打造专业级3D打印体验?

Ultimaker Cura&#xff1a;如何用开源切片软件打造专业级3D打印体验&#xff1f; 【免费下载链接】Cura 3D printer / slicing GUI built on top of the Uranium framework 项目地址: https://gitcode.com/gh_mirrors/cu/Cura 你是否曾经被复杂的3D打印参数搞得头晕眼花…...