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() 将返回 false,length() 等方法可能返回 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) :使用 DataOutputStream 和 DataInputStream 读写基本数据类型。
  • 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. 资源管理 :对于所有 InputStream、OutputStream、Reader、Writer 等资源,务必确保关闭 。优先使用 try-with-resources 语法(如 Listing 7, 15, 16 所示),它可以自动关闭资源,避免内存泄漏 。
  3. 异常处理 :I/O 操作必须处理 IOException。示例中使用了 try-catch,生产代码可能需要更精细的处理。
  4. 缓冲区使用 :大量 I/O 操作时,务必使用缓冲流(如 BufferedInputStream、BufferedReader)包装底层流,可显著提升性能 。
  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

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


参考来源

相关推荐
waterfeeling2 小时前
用 Context7 做一次点云配准的调研—测试—报告闭环:鲁棒 ICP
人工智能
Data-Miner5 小时前
面对 AI 大模型智能涌现,如何从技术层面保护好隐私与数据安全?
大数据·人工智能
0+1115 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
阿狸猿5 小时前
论零信任安全架构在信息系统中的应用
1024程序员节
hpoenixf5 小时前
当 AI 开始谈“买什么”,研究助手离投顾和交易还有多远?
人工智能
大模型真好玩6 小时前
如何让视频模型对你言听计从?结构化提示词助你生成电影级画面
人工智能·agent·deepseek
zhang133830890756 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
特立独行的猫a6 小时前
会说确认叫车才下单-启元机器人官方滴滴打车技能源码详解
人工智能·机器人·技能·启元机器人
念何架构之路6 小时前
Go reflect 场景实战
1024程序员节
老金带你玩AI6 小时前
GPT-6.1 Terra上线:更便宜了,干活到底怎么样?
人工智能