Java 基础之文件处理

news2024/11/20 1:48:03

1. Stream 流

2. File 和 IO

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标:

2.1 控制台输入

Java 的控制台输入由 System.in 完成, 将 System.in 包装在一个 BufferedReader 对象中来创建一个字符流,创建后可使用 read() 方法读取一个 字符,读取字符串使用 readLine()

import java.io.*;

public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
        char c;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("输入字符,按 'q' 退出:");
        do {
            // 读取字符
            c = (char) br.read();   // 每次只能读取一个字符
            System.out.println(c);
        } while (c != 'q');
    }
}

输出:

输入字符,按 'q' 退出:
a
a

b
b

c
c

java
j
a
v
a

q
q

注意:read() 方法读取一个字符,就会返回一个整数,直至输入流结束,返回 -1,此时会抛出 IOException,因此要 throws

2.2 控制台输出

控制台的输出可以由 print() 和 println() 、write() 完成,都是来自 PrintStream 类,不过 write() 方法不常用:

// void write(int byteval),write() 方法将 byteval 的低八位字节写到流中
System.out.println("abc");
int b;
b = 'A';
System.out.write(b);
System.out.write('\n');

2.3 文件读写

输入流和输出流的类层次图

2.3.1 FileInputStream

该流用于读取文件数据,创建方法:

// 方法一
InputStream f = new FileInputStream("xxx.txt");

// 方法二
File f = new File("xxx.txt");
InputStream in = new FileInputStream(f);

文件对象常用方法

方法描述
public void close() throws IOException{}关闭文件输入流并释放与此流相关的所有系统资源,抛出 IOException
protected void finalize()throws IOException {}清除与该文件的连接,确保在不引用时调用 close() 方法,抛出 IOException
public int read(int r)throws IOException{}从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1
public int read(byte[] r) throws IOException{}从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1
public int available() throws IOException{}返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileInputStreamTest {
    public static void main(String[] args) throws IOException {
        readFile();
    }

    public static void readFile() throws IOException {
        int name;
        // 创建文件对象
        InputStream input = new FileInputStream("F:\\JavaStudy\\Source\\FileTest\\src\\people.txt");
        do {
            name = input.read(); // 循环调用 read(),直至返回 -1
            System.out.println(name);
        } while (name != -1);   // name = -1 时文件读取完毕

        input.close();  // 关闭
    }
}

运行结果:

114
111
115
101
13
10
108
105
108
97
13
10
106
111
104
110
-1

read() 方法每次只会读取一个字节,直至读取完毕,返回 -1(可以根据此来作为循环退出条件),另外需要记得关闭文件对象!

使用 for 循环读取:

public static void readFile() throws IOException {
        int name;
        // 创建文件对象
        InputStream input = new FileInputStream("F:\\JavaStudy\\Source\\FileTest\\src\\people.txt");
//        do {
//            name = input.read(); // 循环调用 read(),直至返回 -1
//            System.out.println(name);
//        } while (name != -1);

        for (; ; ) {
            name = input.read(); // 循环调用 read(),直至返回 -1
            if (name == -1) {
                break;
            }
            System.out.println(name);
        }

        input.close();  // 关闭
    }

使用 try...finally 保证任何时候都会关闭文件对象:

public static void readFileTest() throws IOException {
        InputStream input = null;
        try {
            input = new FileInputStream("F:\\JavaStudy\\Source\\FileTest\\src\\people.txt");
            int n = 0;
            while (n != -1) {
                n = input.read();
                System.out.println(n);
            }
        } finally {
            if (input != null) {
                input.close();
            }
        }
    }

Java7 后,省略写法:

public void readFile() throws IOException {
    try (InputStream input = new FileInputStream("F:\\JavaStudy\\Source\\FileTest\\src\\people.txt")) {
        int n;
        while ((n = input.read()) != -1) {
            System.out.println(n);
        }
    } // 编译器在此自动为我们写入finally并调用close()
}

缓冲(一次读取多个字节)

read() 方法只能一次读取一个字节,但是可以将读取的字节放入一个缓冲的 bytes[] 数组中,这样返回值不再是字节的 int 值,而是返回实际读取了多少个字节。如果返回-1,表示没有更多的数据了:

public static void readFileCache() throws IOException {
        try (InputStream input = new FileInputStream("F:\\JavaStudy\\Source\\FileTest\\src\\people.txt")) {
//            定义 1000 个字节大小的缓冲区
            byte[] buffer = new byte[1000];
            int n;
            while ((n = input.read(buffer)) != -1) {
                System.out.println("已读取:" + n + " 字节!");     // 已读取:16 字节!
            }
        }
    }

2.3.2 FileOutputStream

FileOutputStream 用来创建一个文件并向文件中写数据,若目标文件不存在,那么该流会创建该文件:

// 方法一
OutputStream f = new FileOutputStream("C:/java/hello")

// 方法二
File f = new File("C:/java/hello");
OutputStream fOut = new FileOutputStream(f);

常用方法

方法说明
close()关闭文件对象,释放系统资源
finalize()清除与该文件的连接,确保在不再引用文件输入流时调用其 close 方法。抛出 IOException 异常
write(int w)将指定的字节写入到输出流中
write(byte[] w)将指定数组中的 w.length 长度的字节写入到输出流中
flush()将缓冲区内容写入输出流中

flush()

当向磁盘、网络写入数据时,并不是输出一个字节就立即写入,而是先把输出存入内存中(相当于缓冲区),当到达一定量后(缓冲区满了)再写入磁盘或网络,这能提高写入效率,减少 IO 消耗;flush() 可以强制将缓冲区内容输出,一般情况下我们不需要手动去 flush(会自动 flush),除非一些特殊情况需要,比如缓冲区大小 4K,但是输出的字节大小不足 4k,这是就需要手动去 flush()

一次写入多个字节 xx.getBytes() 转换为 byte[]

public static void writeFile() throws IOException {
    try (OutputStream output = new FileOutputStream("F:\\JavaStudy\\Source\\FileTest\\src\\result.txt")) {
        output.write("Hello".getBytes("UTF-8"));
    }
}

2.4 File 类

关于文件和 IO 的类:

  • File
  • FileReader
  • FileWriter

创建目录

File 类中两个方法:

  • mkdir():创建一个目录,成功返回 true,否则返回 false(表示指定的路径已存在或整个路径不存在)
  • mkdirs():递归创建目录(多个)
import java.io.File;

public class FileTest {
    public static void main(String[] args) {
        String path = "F:\\JavaStudy\\Source\\FileTest\\src\\newFile";
        File d = new File(path);
        d.mkdir();
    }
}

读取目录

  • isDirectory():是否是一个目录,是返回 true
  • list():返回目标目录中所有文件夹和文件
import java.io.File;

public class FileTest {
    public static void main(String[] args) {
        String path = "F:\\JavaStudy\\Source\\FileTest\\src";
        File f1 = new File(path);
        if (f1.isDirectory()) {
            System.out.println(path + " 是一个目录!");
            String[] file_arrs = f1.list();
            for (int i = 0; i < file_arrs.length; i++) {
                File f2 = new File(file_arrs[i]);
                if (f2.isDirectory()) {
                    System.out.println(file_arrs[i] + " 是一个目录!");
                } else {
                    System.out.println(file_arrs[i] + " 是一个文件!");
                }
            }
        } else {
            System.out.println(path + " 是一个文件!");
        }
    }
}

运行结果:

F:\JavaStudy\Source\FileTest\src 是一个目录!
BufferedReaderTest.java 是一个文件!
FileInputStreamTest.java 是一个文件!
FileTest.java 是一个文件!
newFile 是一个文件!
people.txt 是一个文件!
result.txt 是一个文件!

删除文件或目录

delete() 方法删除目录时,需保证该目录下没有其他文件,否则会删除失败:

import java.io.File;

public class FileTest {
    public static void main(String[] args) {
//        删除目录或文件
        deleteDirectoryOrFile();

    }

    public static void deleteDirectoryOrFile() {
        String path = "F:\\JavaStudy\\Source\\FileTest\\src\\newFile";
        File f1 = new File(path);
//        直接删除失败
//        f1.delete();

        deleteDirectory(f1);
    }

    public static void deleteDirectory(File f1) {
        File[] files = f1.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isDirectory()) {
                    deleteDirectory(f);
                } else {
                    f.delete();
                }
            }
        }
        f1.delete();
    }
}

其他方法

canRead()  // 是否可读
canWrite() // 是否可写
canExecute()    // 是否可执行
length()    // 文件字节大小
listFiles() // 列出目录下的文件和子目录名

2.5 Path 类

Path 类与 File 类功能相似,但操作更简单,位于 java.nio.file 包中:

public static void getPath() {
        Path p1 = Paths.get(".", "project", "java_study");  // 构造一个Path对象
        System.out.println(p1); //  .\project\java_study

        // 转换为绝对路径 F:\JavaStudy\Source\.\project\java_study
        Path p2 = p1.toAbsolutePath();
        System.out.println(p2);

        // 转换为规范路径 F:\JavaStudy\Source\project\java_study
        Path p3 = p2.normalize();
        System.out.println(p3);

        // 转换为File对象  F:\JavaStudy\Source\project\java_study
        File f = p3.toFile();
        System.out.println(f);

        // 遍历Path
        for (Path p: Paths.get("..").toAbsolutePath()) {
            System.out.println("===>" + p);
            
            /*
            ===>JavaStudy
            ===>Source
            ===>..
             */
        }
    }

2.6 Scanner 类

Scanner 类可以获得用户输入:

Scanner scan = new Scanner(System.in);

常用方法

  • next()、nextLine():获取输入的字符串
  • hasNext()、hasNextLine():是否还有数据输入
  • nextInt()、nextFloat():接收数字

2.6.1 接收字符串

next 方法

import java.util.Scanner;


public class ScannerTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        System.out.println("请输入:");
        if (scan.hasNext()) {
            String str1 = scan.next();
            System.out.println(str1);
        }
        scan.close();
    }
}

运行结果:

请输入:
Hello World			// 输入的字符串
Hello				// 只输出了 Hello,没有输出 World

nextLine()

import java.util.Scanner;


public class ScannerTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        System.out.println("请输入:");
        if (scan.hasNextLine()) {
            String str2 = scan.nextLine();
            System.out.println(str2);
        }
        scan.close();
    }
}

运行结果:

请输入:
Hello World
Hello World

next() 与 nextLine() 区别

  • next()
    • 对录入的字符串遇到 空格就会停止录入,会截断空格后的字符串
    • 在录入字符串时,会在尾部加一个 \r\n,若 nextnextLine 之前录入就会导致 nextLine 录入了 \r\n
  • nextLine()
    • 会把整行字符串全部录入,录入字符串时推荐使用
    • 回车为结束符,可获得空白

2.6.2 接收数字

import java.util.Scanner;


public class ScannerTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int m = 0;
        float n = 0;
        System.out.println("请输入一个整数:");
        if (scan.hasNextInt()) {
            m = scan.nextInt();
            System.out.println(m);
        }

        System.out.println("请输入一个小数:");
        if (scan.hasNextFloat()) {
            n = scan.nextFloat();
            System.out.println(n);
        }
        scan.close();
    }
}

运行结果:

请输入一个整数:
36000
36000
请输入一个小数:
3.6
3.6

2.6.3 示例

接收多个输入,并求和

import java.util.Scanner;


public class ScannerTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 求和
        int a = 0;
        System.out.println("请输入一个整数(输入非整数结束程序运行):");
        while (scan.hasNextInt()) {
            a = a + scan.nextInt();
            System.out.println("请继续输入:");
        }
        System.out.println("总和:" + a);
        scan.close();
    }
}

运行结果:

请输入一个整数(输入非整数结束程序运行):
1
请继续输入:
2
请继续输入:
3
请继续输入:
4
请继续输入:
a
总和:10

2.6.4 接收文件流

Scanner sc=new Scanner(new File("test.txt"));
import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class ScannerFileTest {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner scan = new Scanner(new File("F:\\JavaStudy\\Source\\FileTest\\src\\people.txt"));
        while (scan.hasNextLine()) {
            System.out.println("接收到一个字符串:" + scan.nextLine());
        }
    }
}

运行结果:

接收到一个字符串:rose
接收到一个字符串:lila
接收到一个字符串:john

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

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

相关文章

大数据必学Java基础(一百二十二):POM模式-Maven工程关系

文章目录 POM模式-Maven工程关系 一、依赖 1、特性:依赖的传递性 2、原则:两个原则

[Linux]冯诺依曼体系结构

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

98家央企及下属上市企业全名单(2023版)

1月10日&#xff0c;央企专业化整合又有新动作。国家电网与国家电投生物质发电项目专业化整合项目在北京举行管理权交接仪式&#xff0c;中国电建与通用技术集团医疗资源专业化整合项目在京签约。经过整合&#xff0c;我国生物质发电领域龙头企业国能生物重组进入国家电投&…

springboot ssm招生管理系统java

招生管理系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;springboot框架和idea工具开发&#xff0c;本系统分为学生和管理员两个角色&#xff0c;学生可以注册和登陆&#xff0c;查看招生公告信息&#xff0c;查看招生专业信息&#xff0c;在线申请专业&#xff0c…

Tapdata Cloud 场景通关系列:数据入湖仓之 MySQL → Doris,极简架构,更实时、更简便

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自去年发布云版公测以来&#xff0c;吸引了近万名用户的注册使用。应社区用户上生产系统的要求&#xff0c;Tapdata Cloud 3.0 将正式推出商业版服务&#xff0c;提供对生产系统的 SLA 支撑。Tapdata 目前专注在实时数…

RNN从理论到实战【理论篇】

来源&#xff1a;投稿 作者&#xff1a;175 编辑&#xff1a;学姐 要深入理解深度学习&#xff0c;从零开始创建的经验非常重要&#xff0c;从自己可以理解的角度出发&#xff0c;尽量不使用外部完备的框架前提下&#xff0c;实现我们想要的模型。本系列文章的宗旨就是通过这样…

【JavaSE】数据类型与变量

数据类型与变量数据类型与变量1. 字面常量2. 数据类型3. 变量3.1 变量概念3.2 语法格式3.3.1 整型变量3.3.2 长整型变量3.3.3 短整型变量3.3.4 字节型变量3.3 浮点型变量3.4.1 双精度浮点型3.4.2 单精度浮点型3.4 字符型类型3.5 布尔型变量3.6 类型转换3.7.1 自动类型转换&…

TensorFlow 实战案例: ResNeXt 交通标志图像多分类,附Tensorflow完整代码

各位同学好&#xff0c;今天和大家分享一下如何使用 Tensorflow 构建 ResNeXt 神经网络模型&#xff0c;通过 案例实战 ResNeXt 的训练以及预测过程。每个小节的末尾有网络、训练、预测的完整代码。 ResNeXt 是 ResNet 的改进版&#xff0c;在 bottleneck卷积块 结构上进行了较…

阿里高级技术专家方法论:如何写复杂业务代码?

阿里妹导读&#xff1a;张建飞是阿里巴巴高级技术专家&#xff0c;一直在致力于应用架构和代码复杂度的治理。最近&#xff0c;他在看零售通商品域的代码。面对零售通如此复杂的业务场景&#xff0c;如何在架构和代码层面进行应对&#xff0c;是一个新课题。结合实际的业务场景…

ECM工业能耗管理云平台

在我国的能源消耗中&#xff0c;工业企业是能源消耗的主要群体&#xff0c;能源消耗量占全国能源消耗总量的70%左右&#xff0c;传统方式进行各类工厂能耗的计量&#xff0c;造成能耗数据不完整、不准确、不全面&#xff0c;因而无法进行能耗分析与诊断&#xff0c;造成普遍在各…

DFS初入门

目录 一、前言 二、搜索与暴力法 1、概念 2、搜索的基本思路 3、BFS&#xff1a;一群老鼠走迷宫 4、DFS&#xff1a;一只老鼠走迷宫 三、DFS 1、DFS访问示例 2、DFS的常见操作 3、DFS基础&#xff1a;递归和记忆化搜索 4、DFS的代码框架&#xff08;大量编码后回头体…

一个真正的鳗,他清楚自己每天都要刷《剑指offer》(第九天)

跟着博主一起刷题 这里使用的是题库&#xff1a; https://leetcode.cn/problem-list/xb9nqhhg/?page1 目录剑指 Offer 57 - II. 和为s的连续正数序列剑指 Offer 59 - I. 滑动窗口的最大值剑指 Offer 60. n个骰子的点数剑指 Offer 57 - II. 和为s的连续正数序列 剑指 Offer 57 …

文旅元宇宙热潮来袭,天下秀用“科技之钥”解锁三大价值

让未来照进现实&#xff0c;让现实走进虚拟&#xff0c;元宇宙正成为通往下个时代的船票。2018年上映的电影《头号玩家》&#xff0c;让大部分人首次感触到元宇宙里的沉浸式体验——男主角带上VR头盔后&#xff0c;瞬间就能进入另一个极其逼真的虚拟世界。随着VR、AR、区块链、…

系统回顾MyBatis体验这一优秀的持久层框架

文章目录1.MyBatis2.Mapper代理3.MyBatis配置升级4.配置文件CRUD5.多条件查询6.多条件动态查询7.单条件动态条件查询8.添加数据并主键返回9.更新数据10.删除数据11.参数传递12.注解开发1.MyBatis MyBatis基本上取消了所有的JDBC硬编码&#xff0c;对于单独使用这样的ORM框架&a…

1585_AURIX_TC275_SMU的部分内核寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 继续看SMU的资料&#xff0c;这次看一部分SMU的内核相关寄存器。这一次整理的内容比较少&#xff0c;而且优点断篇&#xff0c;因此按照序号来分没有保持10页的对齐。 调试相关的寄存器不…

详解外网访问内网DDNS作用 及ddns解析软件使用方法

导语&#xff1a;随着互联网的成熟&#xff0c;家庭宽带的提速&#xff0c;大家对外网访问家庭内网电脑&#xff0c;监控&#xff0c;服务器&#xff0c;存储NAS等设备的需求倍增。目前外网访问内网可以用DDNS动态域名解析的方式&#xff0c;以下本文就来介绍一下原理和实现工具…

ELK日志(3)

EFK日志收集 Elasticsearch: 数据库&#xff0c;存储数据 javalogstash: 日志收集&#xff0c;过滤数据 javakibana: 分析&#xff0c;过滤&#xff0c;展示 javafilebeat: 收集日志&#xff0c;传输到ES或logstash go redis&#xff1a;缓冲数据&#xff0c;等待logstash取数据…

高并发多级缓存架构解决方案 OpenResty、canal搭建及使用流程

高并发多级缓存架构解决方案1、缓存的常规使用方式2、请求流程拆分1、搭建tomcat集群2、搭建OpenRestyOpenResty的目录结构nginx的配置文件lua脚本的执行流程http请求反向代理到tomcat服务器3、OpenResty、Redis的单点故障问题4、防止缓存穿透java中通过redisson实现布隆过滤器…

Mac 下配置 go语言环境

Mac 下配置 go语言环境两种方法安装Go通过Homebrew安装&#xff08;不太推荐&#xff09;通过官网安装 &#xff08;推荐&#xff09;方法一安装Homebrew通过Homebrew安装Go方法二 通过官网进行安装配置go环境配置go环境国内镜像Vscode环境配置Helloworld.go两种方法安装Go 通…

LabVIEW中的VI脚本

LabVIEW中的VI脚本用户可使用VI脚本选板上的VI、函数和相关的属性、方法&#xff0c;通过程序创建、编辑和运行VI。通过VI脚本&#xff0c;可减少重复的VI编辑所需的时间&#xff0c;例如&#xff1a;创建若干类似VI对齐和分布控件显示或隐藏控件标签连接程序框图对象注: 必须先…