首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >JavaEE初阶——国庆中秋双节特辑:Java文件操作与IO流,用代码玩转双节“仪式感”

JavaEE初阶——国庆中秋双节特辑:Java文件操作与IO流,用代码玩转双节“仪式感”

作者头像
想不明白的过度思考者
发布2025-10-29 16:17:37
发布2025-10-29 16:17:37
1090
举报
文章被收录于专栏:OverThinker的专栏OverThinker的专栏

🥮国庆中秋双节特辑:Java文件操作与IO流,用代码玩转双节“仪式感”

金桂飘香迎国庆,皓月当空照中秋。当举国欢庆的“中国红”遇上阖家团圆的“月光银”,作为程序员的我们,怎能少了代码里的节日浪漫? 这个假期,有人打卡网红景点,有人宅家追剧吃月饼,而我选择用Java文件操作与IO流,把双节的快乐“写”进代码里——比如生成专属祝福文件、整理旅行照片目录、备份团圆时刻的视频…… 今天就带大家解锁“技术人专属双节玩法”,让枯燥的IO知识变得有温度、有乐趣!

一、先搞懂:文件是啥?—— 数据的“双节礼盒”

咱们先从基础说起:文件,其实就是计算机里“装数据的礼盒”。就像你中秋收到的月饼礼盒,不仅有里面的月饼(文件内容),还有礼盒上的标签(文件元信息)——比如文件名、大小、创建时间(相当于礼盒上的“品牌”“净含量”“生产日期”)。

请添加图片描述
请添加图片描述

在Java里,我们用java.io.File类来描述这个“礼盒”。注意哦,创建File对象不代表真的有这个文件,就像你先设计了礼盒样式,还没实际生产一样~

来段代码感受下“礼盒标签读取”:

代码语言:javascript
复制
import java.io.File;
import java.io.IOException;

public class FestivalFileDemo {
    public static void main(String[] args) throws IOException {
        // 定义一个“中秋祝福.txt”的文件对象(礼盒设计图)
        File festivalFile = new File("D:/双节祝福/中秋祝福.txt");
        
        // 读取“礼盒标签”信息
        System.out.println("礼盒名称(文件名):" + festivalFile.getName());
        System.out.println("礼盒存放地址(绝对路径):" + festivalFile.getAbsolutePath());
        System.out.println("礼盒是否已制作(文件是否存在):" + festivalFile.exists());
        System.out.println("礼盒能装多少(文件大小,不存在则为0):" + festivalFile.length() + "字节");
    }
}

运行结果就像你拿到礼盒后,一眼看到的所有关键信息,清晰明了~

二、目录:文件的“节日收纳柜”

双节期间,你是不是拍了很多照片?有中秋赏月的、国庆出游的、家庭聚餐的……如果都堆在一个文件夹里,找的时候堪比“大海捞针”。这时候就需要“分类收纳柜”——也就是目录(Directory),俗称文件夹。

在这里插入图片描述
在这里插入图片描述

计算机里的目录是“树形结构”,就像你家的收纳柜:最顶层是“衣柜”(根目录),里面分“上衣区”“裤子区”(子目录),每个区里再放具体的衣物(文件)。Windows里的C:\Users\照片\2025双节,Linux里的/home/photos/2025_festival,都是典型的树形路径。

用Java创建“双节照片收纳柜”超简单:

代码语言:javascript
复制
public class FestivalDirDemo {
    public static void main(String[] args) {
        // 目标:创建“D:/双节照片/中秋赏月”和“D:/双节照片/国庆出游”两个目录
        File midAutumnDir = new File("D:/双节照片/中秋赏月");
        File nationalDir = new File("D:/双节照片/国庆出游");
        
        // mkdir():创建单个目录;mkdirs():创建多级目录(父目录不存在也能建)
        if (midAutumnDir.mkdirs()) {
            System.out.println("中秋照片收纳柜创建成功!");
        } else {
            System.out.println("中秋照片收纳柜已存在~");
        }
        
        if (nationalDir.mkdirs()) {
            System.out.println("国庆照片收纳柜创建成功!");
        } else {
            System.out.println("国庆照片收纳柜已存在~");
        }
    }
}

运行后去对应路径看看,两个“专属收纳柜”就建好啦,再也不怕照片乱糟糟~

三、路径:找文件的“双节导航”

想打开“中秋祝福.txt”文件,得知道它在哪个文件夹里——这就是路径(Path),相当于你去亲戚家的“导航地址”。路径分两种,对应不同的导航方式:

路径类型

定义

例子(就像去亲戚家)

Java获取方式

绝对路径

从“根目录”(比如C盘、/home)开始的完整地址

“北京市朝阳区建国路88号某小区3单元501”

file.getAbsolutePath()

相对路径

从“当前位置”开始的地址

“从你家出门右转走500米,再左转进小区”

file.getPath()

举个实际例子,假设你现在的代码在D:/JavaProject目录下,要找“中秋祝福.txt”:

代码语言:javascript
复制
import java.io.File;
import java.io.IOException;

public class PathDemo {
    public static void main(String[] args) throws IOException {
        // 相对路径:从当前代码目录(D:/JavaProject)出发,找“../双节祝福/中秋祝福.txt”
        File relativeFile = new File("../双节祝福/中秋祝福.txt");
        // 绝对路径:完整地址
        File absoluteFile = new File("D:/双节祝福/中秋祝福.txt");
        
        System.out.println("相对路径的“真实导航”:" + relativeFile.getCanonicalPath());
        System.out.println("绝对路径的“真实导航”:" + absoluteFile.getCanonicalPath());
    }
}

运行后会发现,两者的getCanonicalPath()结果一样——就像不同导航方式,最终都能到亲戚家~

四、核心玩法:文件读写——给双节写“代码情书”

搞定了文件和目录,最核心的就是读写操作了!这就像你给家人写中秋贺卡(写文件),或者拆朋友送的国庆礼物(读文件)。Java里的IO流,就是帮你“写”和“拆”的工具。

在这里插入图片描述
在这里插入图片描述
1. 读文件:拆“双节礼物”的正确姿势

读文件有两种常见方式:“小口慢品”(单字节读)和“大口快吃”(字节数组读)。就像你吃月饼,有人喜欢小口啃,有人喜欢切大块吃~

方式1:单字节读(小口啃月饼)
代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.InputStream;

public class ReadFileDemo1 {
    public static void main(String[] args) {
        // 要读的文件:“中秋祝福.txt”,里面写着“中秋快乐,阖家团圆!”
        try (InputStream is = new FileInputStream("D:/双节祝福/中秋祝福.txt")) {
            int byteData; // 存储单个字节
            // 读一个字节,返回-1表示读完(没月饼了)
            while ((byteData = is.read()) != -1) {
                // 转成字符输出(相当于把月饼馅吐出来尝)
                System.out.print((char) byteData);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:中秋快乐,阖家团圆!——就像慢慢啃完了一整块月饼,尝到了所有味道~

方式2:字节数组读(大块吃月饼)

单字节读效率低,就像你吃月饼一口只咬一粒渣。用字节数组读,相当于一次咬一大口,效率更高:

代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.InputStream;

public class ReadFileDemo2 {
    public static void main(String[] args) {
        try (InputStream is = new FileInputStream("D:/双节祝福/国庆祝福.txt")) {
            byte[] buf = new byte[1024]; // 每次读1024字节(相当于月饼切1024块)
            int len; // 实际读到的字节数(可能没装满buf)
            while ((len = is.read(buf)) != -1) {
                // 把buf里的有效字节转成字符串(只吃实际咬到的部分)
                String content = new String(buf, 0, len, "UTF-8");
                System.out.print(content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果“国庆祝福.txt”里写着“国庆安康,祖国万岁!”,运行后就会完整输出——效率高多了吧~

进阶:用Scanner读文本(优雅地拆礼物)

如果读的是文本文件,用Scanner更方便,就像用精致的餐具拆礼物,优雅又省心:

代码语言:javascript
复制
import java.io.FileInputStream;
import java.util.Scanner;

public class ScannerReadDemo {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("D:/双节祝福/全家福.txt");
             Scanner scanner = new Scanner(fis, "UTF-8")) {
            // 按行读(就像一行一行看全家福的备注)
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println("全家福备注:" + line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果“全家福.txt”里写着:

代码语言:javascript
复制
2025.09.30 中秋家宴
2025.10.01 国庆出游
2025.10.02 赏月拍照

运行后就会一行行输出,清晰又直观~

2. 写文件:给双节写“代码贺卡”

写文件和读文件对应,也有多种方式。最常用的是OutputStream,就像你用钢笔写贺卡,把祝福“写”进文件里。

方式1:字节数组写(写中秋祝福)
代码语言:javascript
复制
import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteFileDemo1 {
    public static void main(String[] args) {
        // 要写的祝福内容
        String midAutumnWish = "亲爱的爸妈:中秋快乐!今年虽然不能回家,但心意与你们同在~";
        try (OutputStream os = new FileOutputStream("D:/双节祝福/给爸妈的中秋信.txt")) {
            // 把字符串转成字节数组(相当于把祝福转成钢笔墨水)
            byte[] wishBytes = midAutumnWish.getBytes("UTF-8");
            // 写入文件(相当于把墨水写到纸上)
            os.write(wishBytes);
            os.flush(); // 关键!把“墨水”彻底吸干到纸上,避免漏写
            System.out.println("给爸妈的中秋信已写好!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行后去对应路径,就能看到“给爸妈的中秋信.txt”,打开就是你写的祝福——是不是很有仪式感~

方式2:用PrintWriter写(优雅地写贺卡)

如果要写多行内容,用PrintWriter更方便,就像用带格子的信纸写,格式整齐:

代码语言:javascript
复制
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class WriteFileDemo2 {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("D:/双节祝福/双节待办清单.txt");
             OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
             PrintWriter writer = new PrintWriter(osw)) {
            // 用println()写多行,就像在信纸上换行
            writer.println("2025双节待办清单:");
            writer.println("1. 10.01:看国庆阅兵直播");
            writer.println("2. 10.02:和朋友去公园赏月");
            writer.println("3. 10.03:整理旅行照片,生成电子相册");
            writer.println("4. 10.04:给家人打视频电话");
            writer.flush(); // 别忘了“吸干墨水”
            System.out.println("双节待办清单已生成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行后打开文件,清单格式整整齐齐,再也不用手动换行啦~

五、实战项目:双节文件管理器——解放双手!

学会了基础操作,我们来搞个实战:写一个“双节文件管理器”,功能是扫描指定目录下的所有照片文件,按“中秋”“国庆”分类移动到对应文件夹。再也不用手动整理照片,解放双手去吃月饼!

请添加图片描述
请添加图片描述
项目代码:
代码语言:javascript
复制
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Scanner;

public class FestivalFileManager {
    // 目标目录:中秋照片和国庆照片
    private static final String MID_AUTUMN_DIR = "D:/双节照片/中秋赏月";
    private static final String NATIONAL_DIR = "D:/双节照片/国庆出游";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要扫描的照片目录(比如D:/手机照片):");
        String scanDirPath = scanner.next();
        File scanDir = new File(scanDirPath);

        // 检查目录是否存在
        if (!scanDir.exists() || !scanDir.isDirectory()) {
            System.out.println("输入的目录不存在或不是文件夹!");
            return;
        }

        // 初始化目标目录(不存在则创建)
        initTargetDirs();

        // 递归扫描目录下的所有文件
        scanAndClassifyFiles(scanDir);
        System.out.println("照片分类完成!快去对应文件夹查看吧~");
    }

    // 初始化目标目录
    private static void initTargetDirs() {
        File midAutumnFile = new File(MID_AUTUMN_DIR);
        File nationalFile = new File(NATIONAL_DIR);
        if (!midAutumnFile.exists()) {
            midAutumnFile.mkdirs();
        }
        if (!nationalFile.exists()) {
            nationalFile.mkdirs();
        }
    }

    // 递归扫描并分类文件(照片格式:jpg、png、jpeg)
    private static void scanAndClassifyFiles(File dir) {
        File[] files = dir.listFiles();
        if (files == null) {
            return;
        }

        for (File file : files) {
            if (file.isDirectory()) {
                // 如果是目录,递归扫描子目录
                scanAndClassifyFiles(file);
            } else {
                // 如果是文件,判断是否为照片,且按文件名分类
                String fileName = file.getName().toLowerCase();
                if (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".jpeg")) {
                    try {
                        if (fileName.contains("中秋") || fileName.contains("赏月")) {
                            // 移动到中秋目录
                            Files.move(file.toPath(), new File(MID_AUTUMN_DIR + "/" + file.getName()).toPath());
                            System.out.println("已移动中秋照片:" + file.getName());
                        } else if (fileName.contains("国庆") || fileName.contains("出游")) {
                            // 移动到国庆目录
                            Files.move(file.toPath(), new File(NATIONAL_DIR + "/" + file.getName()).toPath());
                            System.out.println("已移动国庆照片:" + file.getName());
                        }
                    } catch (IOException e) {
                        System.out.println("移动文件失败:" + file.getName() + ",原因:" + e.getMessage());
                    }
                }
            }
        }
    }
}
项目效果:
  1. 输入你手机照片的目录(比如D:/手机照片);
  2. 程序会自动扫描所有jpg/png/jpeg格式的照片;
  3. 文件名包含“中秋”“赏月”的照片,会移动到D:/双节照片/中秋赏月
  4. 文件名包含“国庆”“出游”的照片,会移动到D:/双节照片/国庆出游
  5. 控制台会输出移动进度,一目了然~

再也不用手动筛选照片了,省下时间去陪家人、吃月饼,多香!

六、总结:IO流里的双节浪漫

其实Java文件操作与IO流,没那么枯燥。它就像我们生活中的“收纳术”“写信术”——把混乱的数据整理得井井有条,把心底的祝福传递给想给的人。

这个双节,无论是用代码生成一份祝福文件,还是用程序整理旅行照片,都是技术人独有的浪漫。毕竟,能把“枯燥的代码”变成“有温度的礼物”,才是我们程序员最酷的本事~

最后,送上我用代码写的双节祝福:

代码语言:javascript
复制
System.out.println("🥮 中秋快乐,月圆人团圆!");
System.out.println("🇨🇳 国庆安康,祖国万岁!");
System.out.println("愿你:代码无bug,月饼吃不够,假期玩得嗨!");

祝大家双节快乐,阖家幸福!咱们下期再见

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🥮国庆中秋双节特辑:Java文件操作与IO流,用代码玩转双节“仪式感”
    • 一、先搞懂:文件是啥?—— 数据的“双节礼盒”
    • 二、目录:文件的“节日收纳柜”
    • 三、路径:找文件的“双节导航”
    • 四、核心玩法:文件读写——给双节写“代码情书”
      • 1. 读文件:拆“双节礼物”的正确姿势
      • 2. 写文件:给双节写“代码贺卡”
    • 五、实战项目:双节文件管理器——解放双手!
      • 项目代码:
      • 项目效果:
    • 六、总结:IO流里的双节浪漫
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档