Java文件操作必备技能,10个小技巧让你快速掌握!

news2024/11/22 6:54:30

前言

  在我们日常的开发中,文件操作是一个非常重要的主题。文件读写、文件复制、任意位置读写、缓存等技巧都是我们必须要掌握的。在这篇文章中,我将给你们介绍 10 个实用的文件操作技巧。

  1. 使用 try-with-resources 语句处理文件 IO 流,确保在使用完毕后自动关闭流。
  2. 使用 java.nio.file.Files 类来读取、写入和操作文件。它提供了许多便利的方法,如 copy、move、delete、create 等。
  3. 使用 java.io.File 类操作文件和目录,如创建、删除、重命名、判断是否存在等。
  4. 使用 File.separator 来代替硬编码的文件路径分隔符,以保证在不同的操作系统上文件路径的正确性。
  5. 使用 FileInputStream 和 FileOutputStream 类来读写二进制文件,使用 BufferedReader 和 BufferedWriter 类来读写文本文件。
  6. 在读取大型文件时,使用 BufferedReader.readLine()方法逐行读取,而不是一次性读取整个文件到内存中。
  7. 使用 FileChannel 类进行文件的快速复制和传输,它可以在不使用缓冲区的情况下直接将数据从一个通道传输到另一个通道。
  8. 使用 FileReader 和 FileWriter 类读写文本文件时,指定字符编码方式,以避免出现乱码问题。
  9. 在处理大型文件时,使用 RandomAccessFile 类,可以实现对文件的任意位置读写操作。
  10. 对于频繁读取的文件,可以使用缓存技术,将文件数据缓存到内存中,以提高读取效率。可以使用 java.io.BufferedInputStream 和 java.io.BufferedOutputStream 类实现缓存操作。

示例

1. 使用 try-with-resources 语句处理文件 IO 流,确保在使用完毕后自动关闭流。

import java.io.*;

public class Example1 {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 使用 java.nio.file.Files 类来读取、写入和操作文件。它提供了许多便利的方法,如 copy、move、delete、create 等。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;

public class Example2 {
    public static void main(String[] args) {
        Path source = Paths.get("file.txt");
        Path target = Paths.get("file_copy.txt");
        try {
            Files.copy(source, target);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 使用 java.io.File 类操作文件和目录,如创建、删除、重命名、判断是否存在等。

import java.io.File;

public class Example3 {
    public static void main(String[] args) {
        File file = new File("file.txt");
        if (file.exists()) {
            System.out.println("File exists!");
        } else {
            System.out.println("File does not exist.");
        }
    }
}

4. 使用 File.separator 来代替硬编码的文件路径分隔符,以保证在不同的操作系统上文件路径的正确性。

import java.io.File;

public class Example4 {
    public static void main(String[] args) {
        String path = "C:" + File.separator + "path" + File.separator + "file.txt";
        File file = new File(path);
        System.out.println(file.getAbsolutePath());
    }
}

5. 使用 FileInputStream 和 FileOutputStream 类来读写二进制文件,使用 BufferedReader 和 BufferedWriter 类来读写文本文件。

import java.io.*;

public class Example5 {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("file.bin");
             FileOutputStream fos = new FileOutputStream("file_copy.bin");
             BufferedInputStream bis = new BufferedInputStream(fis);
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6. 在读取大型文件时,使用 BufferedReader.readLine()方法逐行读取,而不是一次性读取整个文件到内存中。

import java.io.*;

public class Example6 {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

7. 使用 FileChannel 类进行文件的快速复制和传输,它可以在不使用缓冲区的情况下直接将数据从一个通道传输到另一个通道。

import java.io.*;
import java.nio.channels.FileChannel;

public class Example7 {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("file.txt");
             FileOutputStream fos = new FileOutputStream("file_copy.txt")) {
            FileChannel inChannel = fis.getChannel();
            FileChannel outChannel = fos.getChannel();
            inChannel.transferTo(0, inChannel.size(), outChannel);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

8. 使用 FileReader 和 FileWriter 类读写文本文件时,指定字符编码方式,以避免出现乱码问题。

import java.io.*;

public class Example8 {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "UTF-8"));
             BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("file_copy.txt"), "UTF-8"))) {
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

9. 在处理大型文件时,使用 RandomAccessFile 类,可以实现对文件的任意位置读写操作。

import java.io.*;

public class Example9 {
    public static void main(String[] args) {
        try (RandomAccessFile raf = new RandomAccessFile("file.txt", "rw")) {
            raf.seek(raf.length());
            raf.writeBytes("This is a new line.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

10. 对于频繁读取的文件,可以使用缓存技术,将文件数据缓存到内存中,以提高读取效率。可以使用 java.io.BufferedInputStream 和 java.io.BufferedOutputStream 类实现缓存操作。

import java.io.*;

public class Example10 {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("file.txt");
             BufferedInputStream bis = new BufferedInputStream(fis)) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = bis.read(buffer)) != -1) {
                // process the data
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

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

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

相关文章

C++Vector类详解

目录 1.Vector介绍 2.Vector的常见使用 2.1 vector构造函数 2.2 vector iterator使用 2.3 vector空间增长问题 2.4 vector增删改查 2.5 vector迭代器失效问题 3.Vector深度剖析及模拟实现 3.1 模拟实现(可跳过) 3.2 不使用memcpy剖析 1.Vector介绍 ve…

【LeetCode】106. 从中序与后序遍历序列构造二叉树

1.问题 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#…

世优科技AI数字人产品“世优BOTA”发布!全面提升AI虚拟员工能力

2023年4月20日,“世优BOTA”产品发布会在北京圆满落幕。此次发布会上,世优(北京)科技有限公司(以下简称“世优科技”)正式发布了新一代AI数字人现象级产品——“世优BOTA”。来自现实世界的LiveVideoStack创始人包研与来自数字世界的世优虚拟主持人「阿央」通过新颖的互动开场方…

JDK多版本配置及切换版本不生效问题解决

一、准备工作 首先你要有多个版本的jdk,如果没有请移至 https://www.oracle.com/java/technologies/downloads/ 下载,具体下载方法可参考:Java同学入职环境安装全讲解 二、配置环境变量 在环境变量中配置多个JAVA_HOME,我这里…

Java中TCP通信的实现

0、TCP通信 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议, 如果使用了 WireShark 工具,可以看到一次TCP连接建立时的整个过程。 1、单向通信 单向通信中&…

案例01-tlias智能学习辅助系统01-增删改查+参数传递

目录 1、需求说明:实现对部门表和员工表的增删改查 2、环境搭建 3、部门管理 3.1 查询部门 3.2 前后端联调 3.3 删除部门 3.4 新增部门 3.5 根据ID查询数据 3.5 修改部门 总结(Controller层参数接收): 4、员工管理 4.…

CMIP6:WRF模式动力降尺度、单点降尺度、统计方法区域降尺度

气候变化关系到农业、生态系统、社会经济和人类生存与发展,是当今世界关注的重点问题之一。IPCC(Intergovernmental Panel on Climate Change)第6次评估报告指出,自 20 世纪 50 年代以来,从全球平均气温和海温升高…

一个关于Mybatis和spring的公共组件starter

utils-springboot-starter 介绍使用说明 介绍 一个关于Mybatis和spring的公共组件starter,目前包含以下功能: 接口请求日志SQL执行日志数据自动加解密数据自动脱敏服务治理方面: 接口限流接口熔断降级:CPU、内存、异常数、异常率…

51.网页设计规则#1_字体设计

一些概念 字体排版 排版是安排字体的艺术和技术,以使书面语言在显示时清晰、可读和吸引人。(来自维基百科翻译) serif字体和sans-serif字体 serif字体 ● 创造一个传统/经典的外观和感觉 ● 体现出可信度 ● 适合长文本 sans-serif字体 …

【JavaScript】7.DOM的操作元素

DOM 的操作元素 JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等 1. 改变元素内容 element.innerText:从起始位置到终止位置的内容, 但它去除 html 标签, 同时空格和换行也会…

Pytorch深度学习笔记(十)多分类问题

课程推荐:09.多分类问题_哔哩哔哩_bilibili 目录 1. 多分类模型 2. softmax函数模型 3. Loss损失函数 4.实战MNIST Dataset 之前,在逻辑斯蒂回归中我们提到了二分类任务,现在我们讨论多分类问题。 1. 多分类模型 与二分类不同的是多分…

基于C#asp.net心里咨询服务网站系统

功能模块: 主要分为管理员和注册用户,注册用户可以查看所有人发布的心里文章,情感在线问答,查询相似问题,以及进入论坛进行交流(发帖跟帖评论收藏等)后台管理主要是针对个人信息修改 管理员对注…

SpringBoot自动装配机制的原理

自动装配 简单来说,就是自动去把第三方组件的Bean装载到IOC容器里面。不需要开发人员再去写Bean相关的一个配置。 在SpringBoot应用里面,只需要在启动类上去加上SpringBootApplication注解就可以实现自动配置,SpringBootApplication注解它是…

DSPC174 3BSE005461R1码垛工业机器人安装调试的13个步骤

​ DSPC174 3BSE005461R1码垛工业机器人安装调试的13个步骤 ABB码垛工业机器人安装调试的13个步骤 最近工业机器人市场上,调试工作比较火爆,单个项目动辄几十台机器人同时调试,开出的日薪达到1500-2000元。拥有如此庞大的市场需求和丰厚收入…

Hudi数据湖技术之核心概念

目录 1 基本概念1.1 时间轴Timeline1.2 文件管理1.3 索引Index 2 存储类型2.1 计算模型2.1.1 批式模型(Batch)2.1.2 流式模型(Stream)2.1.3 增量模型(Incremental) 2.2 查询类型(Query Type&…

力扣:通过《84.柱状图中最大的矩形》求解《85. 最大矩形》

84. 柱状图中最大的矩形 85. 最大矩形 84.柱状图中最大的矩形&#xff1a; 单调栈求解问题范围&#xff1a; 输出每个数左边第一个比它小的数 单调栈例题&#xff1a; Acwing 830. 单调栈 #include <iostream>using namespace std;const int N 100010; int stk[N],tt …

再多猜一次就爆炸(小黑子误入)

目录 猜数字游戏 游戏设计思路 1.电脑随机生成一个数 2.猜数字 3.输入我是ikun&#xff0c;泰裤辣! 否则电脑将在一分钟后关机 游戏运行效果 源码 代码分析 代码实现关键语句 strcmp() rand()与srand() 时间戳time() 寄语 猜数字游戏 游戏设计思路 1.电脑随机生…

C语言_Printf函数返回值

目录 1. 嵌套结构 2. Printf 函数返回值 在了解Printf 函数的返回值之前&#xff0c;先来了解下什么叫嵌套结构。 1. 嵌套结构 这里直接举个例子进行介绍&#xff1a; strlen 函数计算字符串长度&#xff0c;显然打印的结果是 3 但是如果采用嵌套结构&#xff08;简单来说就…

【深度学习】基于华为MindSpore的手写体图像识别实验

1 实验介绍 1.1 简介 Mnist手写体图像识别实验是深度学习入门经典实验。Mnist数据集包含60,000个用于训练的示例和10,000个用于测试的示例。这些数字已经过尺寸标准化并位于图像中心&#xff0c;图像是固定大小(28x28像素)&#xff0c;其值为0到255。为简单起见&#xff0c;每…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题142环形链表II) 2023.4.24

目录 前言算法题&#xff08;LeetCode刷题142环形链表II&#xff09;—&#xff08;保姆级别讲解&#xff09;分析题目&#xff1a;算法思想环形链表II代码&#xff1a;补充 结束语 前言 本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可&#xff0c;撰写…