Java I/O核心操作实战

要执行这些 Java 程序,你需要遵循以下步骤。这些程序涵盖了 Java I/O 操作的核心类,包括 File、字节流、字符流、缓冲流、序列化等。

1. 环境准备与编译

首先,确保你已安装 Java 开发工具包 (JDK)。然后,为每个程序创建独立的 .java 文件并编译。

1.1 创建与编译文件

将每个 listing 的代码分别保存为对应的 .java 文件。例如:

bash 复制代码
# 创建并编译 FileDemo.java
cat > FileDemo.java << 'EOF'
// Demonstrate File.
import java.io.File;

class FileDemo {
  static void p(String s) {
    System.out.println(s);
  }

  public static void main(String args[]) {
    File f1 = new File("/java/COPYRIGHT");

    p("File Name: " + f1.getName());
    p("Path: " + f1.getPath());
    p("Abs Path: " + f1.getAbsolutePath());
    p("Parent: " + f1.getParent());
    p(f1.exists() ? "exists" : "does not exist");
    p(f1.canWrite() ? "is writeable" : "is not writeable");
    p(f1.canRead() ? "is readable" : "is not readable");
    p("is " + (f1.isDirectory() ? "" : "not" + " a directory"));
    p(f1.isFile() ? "is normal file" : "might be a named pipe");
    p(f1.isAbsolute() ? "is absolute" : "is not absolute");
    p("File last modified: " + f1.lastModified());
    p("File size: " + f1.length() + " Bytes");
  }
}
EOF
javac FileDemo.java

注意listing 3 (OnlyExt.java) 是一个过滤器类,需要先编译,因为它被 listing 4 (DirListOnly.java) 依赖。

bash 复制代码
# 编译过滤器类
cat > OnlyExt.java << 'EOF'
import java.io.*;

public class OnlyExt implements FilenameFilter {
  String ext;

  public OnlyExt(String ext) {
    this.ext = "." + ext;
  }

  public boolean accept(File dir, String name) {
    return name.endsWith(ext);
  }
}
EOF
javac OnlyExt.java

1.2 依赖关系与编译顺序

部分程序之间存在依赖关系,编译顺序如下:

程序文件 依赖项 编译顺序
OnlyExt.java (Listing 3) 1
DirListOnly.java (Listing 4) OnlyExt.class 2
SerializationDemo.java (Listing 23) MyClass (内部类) 独立编译
其他程序 任意

2. 程序执行与结果分析

执行程序前,请根据代码中的文件路径(如 /java/COPYRIGHT)确保相应文件或目录存在,或修改路径为本地有效路径。

2.1 文件与目录操作 (Listing 1, 2, 4)

  • FileDemo (Listing 1) :输出指定文件(如 /java/COPYRIGHT)的属性信息。如果文件不存在,exists() 将返回 falselength() 等方法可能返回 0 或默认值。
  • DirList (Listing 2) :列出指定目录(如 /java)下的所有文件和子目录,并区分类型。
  • DirListOnly (Listing 4) :依赖 OnlyExt 过滤器,仅列出指定目录中扩展名为 .html 的文件。

2.2 字节流操作 (Listing 5-13)

  • FileInputStreamDemo (Listing 5) :读取自身源文件,演示 available()read()skip() 等方法。
  • FileOutputStreamDemo (Listing 6 & 7) :将字符串写入三个文件。Listing 6 使用传统 try-catch-finally 关闭资源,Listing 7 使用 try-with-resources 语法(Java 7+),这是更推荐的自动资源管理方式 。
  • ByteArrayInputStreamDemo (Listing 8)ByteArrayInputStreamReset (Listing 9) :演示从字节数组读取数据,以及 reset() 方法重置流。
  • ByteArrayOutputStreamDemo (Listing 10):演示将数据写入内部字节数组,并可转换为字符串或写入其他输出流。
  • BufferedInputStreamDemo (Listing 11)PushbackInputStreamDemo (Listing 12):演示缓冲流和回退流,用于标记读取和回退操作。
  • SequenceInputStreamDemo (Listing 13):将多个输入流串联成一个流顺序读取。

2.3 字符流与高级 I/O (Listing 14-22)

  • PrintfDemo (Listing 14) :演示 System.out.printf() 的格式化输出功能。
  • DataIODemo (Listing 15) :使用 DataOutputStreamDataInputStream 读写基本数据类型。
  • FileReaderDemo (Listing 16)FileWriterDemo (Listing 17):字符流方式读写文件。
  • CharArrayReaderDemo (Listing 18)CharArrayWriterDemo (Listing 19):字符数组的读写操作。
  • BufferedReaderDemo (Listing 20)PushbackReaderDemo (Listing 21):字符缓冲流和回退流。
  • ConsoleDemo (Listing 22) :从控制台读取输入(注意:在某些 IDE 中 System.console() 可能返回 null)。

2.4 对象序列化 (Listing 23)

  • SerializationDemo (Listing 23) :演示对象的序列化(写入 serial 文件)与反序列化(从 serial 文件读取)。MyClass 必须实现 Serializable 接口。

3. 关键注意事项与最佳实践

  1. 路径问题 :将代码中的绝对路径(如 /java)替换为你本地存在的目录路径,或使用相对路径(如 ./test.txt)。
  2. 资源管理 :对于所有 InputStreamOutputStreamReaderWriter 等资源,务必确保关闭 。优先使用 try-with-resources 语法(如 Listing 7, 15, 16 所示),它可以自动关闭资源,避免内存泄漏 。
  3. 异常处理 :I/O 操作必须处理 IOException。示例中使用了 try-catch,生产代码可能需要更精细的处理。
  4. 缓冲区使用 :大量 I/O 操作时,务必使用缓冲流(如 BufferedInputStreamBufferedReader)包装底层流,可显著提升性能 。
  5. 序列化版本SerializationDemo 中,若修改了 MyClass 的字段,反序列化可能因 serialVersionUID 不匹配而失败。可显式定义 private static final long serialVersionUID 来保持版本兼容。

4. 快速执行脚本示例

你可以创建一个 Shell 脚本(如 run_all.sh)来批量编译和运行。以下是一个简化示例:

bash 复制代码
#!/bin/bash
# 编译所有Java文件
javac *.java 2>/dev/null

# 运行FileDemo (修改路径为你本地存在的文件)
echo "=== Running FileDemo ==="
java FileDemo 2>&1 | head -5

# 运行DirList (修改路径为你本地存在的目录)
echo -e "
=== Running DirList ==="
java DirList 2>&1# 运行DataIODemo
echo -e "
=== Running DataIODemo ==="
java DataIODemo

#清理class文件
# rm *.class

注意:由于部分程序依赖特定文件或路径,直接全部运行可能报错。建议根据你的环境单独编译和运行感兴趣的示例。


参考来源

相关推荐
彩讯股份3006346 分钟前
Claude Code 开启多 Session 通信,Rich AIBox 拆解多智能体 AI 团队
人工智能
我不是疯子是傻子7 分钟前
用 DeepSeek 将 Modbus 协议文档自动化为 Qt 枚举与寄存器结构体?「文档解析+AI生成+编译验证」的代码工厂实践
人工智能·qt·自动化
小淮AI8 分钟前
告别水印困扰?2026年AI图像修复工具实测
人工智能
泛凡(Linyongui)12 分钟前
第三篇、生命的bug分两种:一种是Flash坏了,一种是RAM乱了
人工智能·单片机·程序人生
OAK中国_官方14 分钟前
在 OAK 上进行箱体尺寸测量:无需专用测量系统
人工智能·机器人·oak深度相机·箱体测量
网易云信15 分钟前
AI 也要"背业绩":销售正在成为 Agent 落地的下一个黄金战场
人工智能·agent
博、、19 分钟前
AI新零售线上商城系统实战开发指南:从架构设计到部署经验
人工智能·零售
帅哥的AI自修课20 分钟前
模型幻觉检测与抑制技术-金融医疗双案例实战
人工智能·深度学习·金融
小女孩真可爱21 分钟前
GPT(1)----------从零实现 GPT 模型以生成文本
人工智能·python·gpt·nlp
程序员cxuan23 分钟前
一招让你的 Claude 被封了也能用
人工智能·后端·程序员