金桂飘香迎国庆,皓月当空照中秋。当举国欢庆的“中国红”遇上阖家团圆的“月光银”,作为程序员的我们,怎能少了代码里的节日浪漫? 这个假期,有人打卡网红景点,有人宅家追剧吃月饼,而我选择用Java文件操作与IO流,把双节的快乐“写”进代码里——比如生成专属祝福文件、整理旅行照片目录、备份团圆时刻的视频…… 今天就带大家解锁“技术人专属双节玩法”,让枯燥的IO知识变得有温度、有乐趣!
咱们先从基础说起:文件,其实就是计算机里“装数据的礼盒”。就像你中秋收到的月饼礼盒,不仅有里面的月饼(文件内容),还有礼盒上的标签(文件元信息)——比如文件名、大小、创建时间(相当于礼盒上的“品牌”“净含量”“生产日期”)。

在Java里,我们用java.io.File类来描述这个“礼盒”。注意哦,创建File对象不代表真的有这个文件,就像你先设计了礼盒样式,还没实际生产一样~
来段代码感受下“礼盒标签读取”:
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创建“双节照片收纳柜”超简单:
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”:
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流,就是帮你“写”和“拆”的工具。

读文件有两种常见方式:“小口慢品”(单字节读)和“大口快吃”(字节数组读)。就像你吃月饼,有人喜欢小口啃,有人喜欢切大块吃~
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();
}
}
}运行结果:中秋快乐,阖家团圆!——就像慢慢啃完了一整块月饼,尝到了所有味道~
单字节读效率低,就像你吃月饼一口只咬一粒渣。用字节数组读,相当于一次咬一大口,效率更高:
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更方便,就像用精致的餐具拆礼物,优雅又省心:
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”里写着:
2025.09.30 中秋家宴
2025.10.01 国庆出游
2025.10.02 赏月拍照运行后就会一行行输出,清晰又直观~
写文件和读文件对应,也有多种方式。最常用的是OutputStream,就像你用钢笔写贺卡,把祝福“写”进文件里。
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”,打开就是你写的祝福——是不是很有仪式感~
如果要写多行内容,用PrintWriter更方便,就像用带格子的信纸写,格式整齐:
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();
}
}
}运行后打开文件,清单格式整整齐齐,再也不用手动换行啦~
学会了基础操作,我们来搞个实战:写一个“双节文件管理器”,功能是扫描指定目录下的所有照片文件,按“中秋”“国庆”分类移动到对应文件夹。再也不用手动整理照片,解放双手去吃月饼!

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());
}
}
}
}
}
}D:/手机照片);jpg/png/jpeg格式的照片;D:/双节照片/中秋赏月;D:/双节照片/国庆出游;再也不用手动筛选照片了,省下时间去陪家人、吃月饼,多香!
其实Java文件操作与IO流,没那么枯燥。它就像我们生活中的“收纳术”“写信术”——把混乱的数据整理得井井有条,把心底的祝福传递给想给的人。
这个双节,无论是用代码生成一份祝福文件,还是用程序整理旅行照片,都是技术人独有的浪漫。毕竟,能把“枯燥的代码”变成“有温度的礼物”,才是我们程序员最酷的本事~
最后,送上我用代码写的双节祝福:
System.out.println("🥮 中秋快乐,月圆人团圆!");
System.out.println("🇨🇳 国庆安康,祖国万岁!");
System.out.println("愿你:代码无bug,月饼吃不够,假期玩得嗨!");祝大家双节快乐,阖家幸福!咱们下期再见