资讯详情

08IO流技术

📅 2026/11/5 5:21:19 | 华诺云谱 👁 阅读
08IO流技术
File类File类是Java中用于表示文件和目录路径的抽象表示属于java.io包。它不直接操作文件内容而是提供对文件系统中文件和目录的创建、删除、重命名、查询属性等操作的支持。构造方法通过字符串路径创建。File file new File(example.txt);通过父目录路径与子文件名组合创建。File file2 new File(/home/user/documents, data.txt);通过父File对象与子文件名创建。File file3 new File(new File(/home/user), data.txt);路径区别相对路径相对于某个路径下指明的路径绝对路径包含盘符在内的文件或文件目录路径路径分隔符在 Windows 系统中路径分隔符为反斜杠\例如C:\Users\John\Documents\file.txt在 Unix、Linux 及 macOS 系统中路径分隔符为正斜杠/例如/home/john/documents/file.txt为了确保跨平台兼容性File类提供了两个静态常量来表示路径分隔符File.separator返回当前系统的默认路径分隔符字符\或/。File.separatorChar返回当前系统的路径分隔符字符类型为char。String path folder File.separator subfolder File.separator file.txt; System.out.println(path); // 输出根据系统自动调整的路径若处理路径字符串可结合Path和Paths工具类Java 7进行更安全的操作Path path Paths.get(folder, subfolder, file.txt);常用方法获取文件绝对路径调用getAbsolutePath()方法可返回文件或目录的完整路径包括驱动器、目录层级和文件名。例如File file new File(C:/Users/Example/Documents/test.txt); System.out.println(file.getAbsolutePath()); // 输出: C:\Users\Example\Documents\test.txt获取文件路径调用getPath()方法返回构造文件对象时传入的路径字符串可能为相对路径或绝对路径。例如File file new File(data/file.txt); System.out.println(file.getPath()); // 输出: data/file.txt获取文件名称调用getName()方法返回文件或目录的名称不含路径。例如File file new File(/home/user/picture.jpg); System.out.println(file.getName()); // 输出: picture.jpg获取上层目录路径调用getParent()方法返回父目录路径若文件位于根目录或无父目录则返回null。例如File file new File(/var/log/app.log); System.out.println(file.getParent()); // 输出: /var/log获取文件大小字节数调用length()方法返回文件的大小以字节为单位仅适用于文件不适用于目录。例如File file new File(document.pdf); if (file.isFile()) { System.out.println(文件大小: file.length() 字节); // 输出: 文件大小: 102400 字节 }获取最后修改时间调用lastModified()方法返回文件最后一次修改的时间戳毫秒值从1970年1月1日开始计算。可使用new Date转换日期。例如File file new File(report.docx); long lastModifiedTime file.lastModified(); System.out.println(最后修改时间: lastModifiedTime); // 输出: 最后修改时间: 1719583200000列出目录下所有文件或目录名称调用list()方法返回指定目录中所有子项的名称数组若目录不存在或非目录则返回null。例如File dir new File(/home/user/documents); String[] files dir.list(); if (files ! null) { for (String name : files) { System.out.println(name); } }获取目录下所有文件或目录的 File 对象数组调用listFiles()方法返回指定目录中所有子项的File对象数组若目录无效则返回null。例如File dir new File(/home/user/images); File[] files dir.listFiles(); if (files ! null) { for (File f : files) { System.out.println(f.getName() - f.isFile()); } }重命名文件的renameTo方法public boolean renameTo(File dest)File file1 new File(hello.txt); File file2 new File(D:\\io\\hi.txt); boolean renamed file1.renameTo(file2); System.out.println(renamed);以file1.renameTo(file2)为例要确保该方法返回true必须满足两个条件file1在硬盘中必须存在file2在硬盘中不能已存在。判断文件或目录是否存在及属性File file2 new File(C:/example/test.txt);检查是否为目录boolean isDirectory file2.isDirectory();若路径指向一个目录则返回true否则返回false。检查是否为普通文件boolean isFile file2.isFile();若路径指向一个普通文件非目录则返回true否则返回false。检查文件或目录是否存在boolean exists file2.exists();若指定路径对应的文件或目录在系统中存在则返回true否则返回false。检查是否可读boolean canRead file2.canRead();若当前用户有权限读取该文件或目录内容则返回true否则返回false。检查是否可写boolean canWrite file2.canWrite();若当前用户有权限向该文件或目录写入数据则返回true否则返回false。检查是否为隐藏文件或目录boolean isHidden file2.isHidden();若文件或目录在操作系统中被标记为隐藏如 Windows 中的属性为隐藏则返回true否则返回false。创建文件调用createNewFile()方法可创建一个新文件。该方法仅在目标文件不存在时创建并返回true表示创建成功若文件已存在则不进行任何操作返回false。File file new File(example.txt); boolean created file.createNewFile(); if (created) { System.out.println(文件创建成功); } else { System.out.println(文件已存在或创建失败); }创建单层目录调用mkdir()方法用于创建一个目录。仅当父目录存在且目标目录不存在时才会创建该目录返回true若目录已存在或父目录不存在则返回false。File dir new File(mydir); boolean created dir.mkdir(); if (created) { System.out.println(目录创建成功); } else { System.out.println(目录创建失败可能已存在或父目录不存在); }创建多级目录调用mkdirs()方法可创建包含多级嵌套的目录结构。如果父目录不存在会自动递归创建所有必要的上级目录。返回true表示创建成功即使目录已存在也返回true。File nestedDir new File(parent/child/grandchild); boolean created nestedDir.mkdirs(); if (created) { System.out.println(多级目录创建成功); } else { System.out.println(目录创建失败); }删除文件Java中的File类提供了delete()方法用于删除指定的文件或目录删除不走回收站返回一个布尔值true表示文件或目录已被成功删除。false表示删除失败可能原因包括文件被占用、权限不足、路径不存在、目录非空等。boolean deleted file.delete(); if (deleted) { System.out.println(删除成功); } else { System.out.println(删除失败); }IO流概述IO流Input/Output Stream是用于处理数据输入与输出的机制主要通过java.io包中的类来实现。主要基于字节和字符两种基本单位。它提供了统一的接口来读取和写入数据支持文件、网络、内存等多种数据源。IO流的分类方式以程序为中心根据数据流动方向可分为输入流从外部源读取数据到程序中常用抽象类为InputStream字节输入流和Reader字符输入流。输出流将程序中的数据写入外部目标常用抽象类为OutputStream字节输出流和Writer字符输出流。根据处理的数据类型可分为字节流以字节为单位进行数据传输适用于处理二进制数据如图片、音频、视频等。典型类包括FileInputStream、FileOutputStream、ByteArrayInputStream等。字符流以字符为单位进行数据传输主要用于文本数据的读写自动处理字符编码转换。典型类包括FileReader、FileWriter、BufferedReader、BufferedWriter等。根据是否直接连接数据源可分为节点流直接与数据源或数据目标相连的流用于读取或写入原始数据。常见的节点流包括文件流、字节数组流、字符数组流等。FileInputStream和FileOutputStream是典型的节点流它们直接操作文件系统中的数据。处理流处理流不直接连接数据源而是包装一个节点流提供额外的处理能力增强节点流的功能如缓冲、转换编码、过滤数据等。BufferedInputStream和BufferedOutputStream是处理流它们通过缓冲机制提高读写效率。【抽象基类】字节流字符流输入流InputStreamReader输出流OutputStreamWriterIO流40多个类均由这四个抽象基类派生子类名称都是以其父类名作为子类名后缀。使用基本步骤1.指定文件路径既能使用 NIO 的Paths.get()构造Path对象它能自动处理不同操作系统的路径分隔符。也可以用传统的File对象。2.创建节点流字符节点流FileReader、FileWriter、BufferedReader、BufferedWriter等。字节节点流FileInputStream、FileOutputStream等。3.包装缓冲流缓冲流属于“处理流”职责是装饰节点流增加缓冲功能减少底层系统调用。在使用时可以将节点流包装为缓冲流读写性能会大幅提升。4.执行读写操作字节流使用自定义byte[]数组作为临时缓冲区配合read(byte[], int, int)和write(byte[], int, int)进行块读写避免单字节循环。字符流用readLine()逐行读取用write()写入并换行。5.关闭流资源强制使用try-with-resourcesJDK 7语法。这样无论代码正常执行还是抛异常所有AutoCloseable资源都会自动按逆序关闭。在循环中创建流时每次迭代都要创建新的 try-with-resources 块若流作为返回值或参数传递也必须明确关闭责任。举例使用缓冲流复制字符流文件内容// 定义源文件对象指定路径为 src.txt File srcfile new File(src.txt); // 定义目标文件对象指定路径为 dest.txt File destfile new File(dest.txt); // 创建文件读取流用于从源文件读取数据 FileReader fr new FileReader(srcfile); // 创建文件写入流用于向目标文件写入数据 FileWriter fw new FileWriter(destfile); // 包装读取流提升读取效率支持按行读取 BufferedReader br new BufferedReader(fr); // 包装写入流提升写入效率支持缓冲写入 BufferedWriter bw new BufferedWriter(fw); // 定义字符数组用于临时存储读取的数据大小为10个字符 char[] arr new char[10]; // 定义变量用于记录每次读取的实际字符数 int len; // 循环读取源文件内容直到读取结束返回-1表示读完 while ((len br.read(arr)) ! -1) { // 将读取到的字符数据写入目标文件从索引0开始写入len个字符 bw.write(arr, 0, len); } // 关闭缓冲读取流释放资源 br.close(); // 关闭缓冲写入流确保所有数据被写入文件并释放资源 bw.close();try-catch-finally优化后的代码// 定义输入缓冲读取器用于从源文件读取数据 BufferedReader br null; // 定义输出缓冲写入器用于向目标文件写入数据 BufferedWriter bw null; try { // 指定源文件路径为 src.txt File srcfile new File(src.txt); // 指定目标文件路径为 dest.txt File destfile new File(dest.txt); // 创建文件读取器关联源文件 FileReader fr new FileReader(srcfile); // 创建文件写入器关联目标文件覆盖写入 FileWriter fw new FileWriter(destfile); // 将文件读取器包装为缓冲读取器提升读取效率 br new BufferedReader(fr); // 将文件写入器包装为缓冲写入器提升写入效率 bw new BufferedWriter(fw); // 定义字符数组作为读取数据的缓冲区大小为 10 个字符 char[] arr new char[10]; // 记录每次读取的实际字符数量 int len; // 循环读取源文件内容直到读取结束返回 -1 表示读完 while ((len br.read(arr)) ! -1) { // 将读取到的数据写入目标文件写入范围为 [0, len) bw.write(arr, 0, len); } // 刷新缓冲区确保所有数据被写入文件 bw.flush(); } catch (IOException e) { // 捕获可能发生的 I/O 异常并将其包装为运行时异常抛出 throw new RuntimeException(文件读写过程中发生错误, e); } finally { // 确保资源正确关闭避免资源泄漏 // 若缓冲读取器已创建则尝试关闭 if (br ! null) { try { br.close(); } catch (IOException e) { // 忽略关闭失败异常或可选择记录日志 throw new RuntimeException(关闭输入流时发生错误, e); } } // 若缓冲写入器已创建则尝试关闭 if (bw ! null) { try { bw.close(); } catch (IOException e) { // 忽略关闭失败异常或可选择记录日志 throw new RuntimeException(关闭输出流时发生错误, e); } } }try-with-resources优化后的代码// 定义源文件和目标文件路径 File srcFile new File(src.txt); File destFile new File(dest.txt); // 使用 try-with-resources 语法自动管理资源避免手动关闭流 try (BufferedReader reader new BufferedReader(new FileReader(srcFile)); BufferedWriter writer new BufferedWriter(new FileWriter(destFile))) { // 定义字符缓冲数组大小为 1024 字符提升读写效率 char[] buffer new char[1024]; int bytesRead; // 循环读取源文件内容每次读取最多 1024 个字符 while ((bytesRead reader.read(buffer)) ! -1) { // 将读取到的字符写入目标文件写入长度为实际读取的字符数 writer.write(buffer, 0, bytesRead); } // 文件复制完成无需额外操作资源会自动关闭 } catch (IOException e) { // 捕获并处理可能出现的 I/O 异常抛出运行时异常以中断程序 throw new RuntimeException(文件复制过程中发生错误, e); }FileReadertry (FileReader fr new FileReader(hello.txt)) { int len; while ((len fr.read()) ! -1) { System.out.println((char) len); } } catch (IOException e) { System.err.println(读取文件失败: e.getMessage()); }FileWritertry (FileWriter fw new FileWriter(hello.txt)) { fw.write(Hello, world!); // 无需手动关闭try-with-resources 会自动处理 } catch (IOException e) { System.err.println(写入文件失败: e.getMessage()); // 推荐做法记录日志而非使用 e.printStackTrace() }FileInputStreamimport java.io.FileInputStream; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { try (FileInputStream fis new FileInputStream(example.txt)) { int byteData; while ((byteData fis.read()) ! -1) { System.out.print((char) byteData); } } catch (IOException e) { e.printStackTrace(); } } }FileOutputStreamimport java.io.FileOutputStream; import java.io.IOException; public class WriteFileExample { public static void main(String[] args) { String content Hello, this is a test file written in Java!; try (FileOutputStream fos new FileOutputStream(output.txt)) { byte[] bytes content.getBytes(); fos.write(bytes); } catch (IOException e) { e.printStackTrace(); } } }使用 FileInputSteam 与 FileOutputStream 实现文件复制import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileCopyExample { public static void main(String[] args) { String sourcePath source.txt; String destinationPath copy.txt; try (FileInputStream fis new FileInputStream(sourcePath); FileOutputStream fos new FileOutputStream(destinationPath)) { byte[] buffer new byte[1024]; int bytesRead; while ((bytesRead fis.read(buffer)) ! -1) { fos.write(buffer, 0, bytesRead); } System.out.println(文件复制完成从 sourcePath 到 destinationPath); } catch (IOException e) { System.err.println(文件操作失败 e.getMessage()); } } }缓冲流缓冲流是Java I/O体系中用于提高读写效率的一类流其核心机制是在内存中设置一个临时缓冲区减少对底层设备如文件、网络的频繁访问。通过批量读写操作显著降低系统调用次数提升性能。常见的缓冲流类型BufferedInputStream字节缓冲输入流用于包装其他字节输入流提供缓冲功能。BufferedOutputStream字节缓冲输出流用于包装其他字节输出流支持缓冲写入。BufferedReader字符缓冲输入流可读取文本数据并支持按行读取。BufferedWriter字符缓冲输出流用于高效写入字符数据支持换行符自动处理。转换流转换流是Java中用于处理字符编码转换的输入输出流主要作用是在字节流和字符流之间进行桥梁连接。它们能够将字节数据按照指定的字符编码格式转换为字符数据或反之。分类1. InputStreamReader作用将字节输入流转换为字符输入流。构造方法InputStreamReader(InputStream in) InputStreamReader(InputStream in, String charsetName)2. OutputStreamWriter作用将字符输出流转换为字节输出流。构造方法OutputStreamWriter(OutputStream out) OutputStreamWriter(OutputStream out, String charsetName)实际应用示例// 读取文件并按UTF-8编码解析 try (FileInputStream fis new FileInputStream(input.txt); InputStreamReader isr new InputStreamReader(fis, UTF-8); BufferedReader br new BufferedReader(isr)) { String line; while ((line br.readLine()) ! null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } // 写入文件并指定编码 try (FileOutputStream fos new FileOutputStream(output.txt); OutputStreamWriter osw new OutputStreamWriter(fos, UTF-8); BufferedWriter bw new BufferedWriter(osw)) { bw.write(你好世界); bw.newLine(); } catch (IOException e) { e.printStackTrace(); }必须明确指定字符编码否则可能使用系统默认编码导致跨平台兼容性问题。推荐始终显式指定编码如“UTF-8”或“GBK”以确保程序行为一致。转换流不支持直接操作字符数组或字符串需结合其他流类使用。常见编码格式对比编码特点适用场景UTF-8支持全球字符兼容性强网络传输、现代应用GBK/GB2312中文支持良好国内旧系统或中文文档ISO-8859-1单字节编码仅支持西欧字符简单文本处理常见用途当读取或写入文件时若文件使用特定编码如GBK、UTF-8需通过转换流指定编码方式避免乱码。可以配合缓冲流使用提高性能例如BufferedReader与InputStreamReader组合或BufferedWriter与OutputStreamWriter组合。数据流数据流是专门用于读写基本数据类型的流支持直接读写int、double、boolean等原始类型数据。分类数据输入流DataInputStream支持方法readInt()读取一个整数4字节readDouble()读取一个双精度浮点数8字节readBoolean()读取布尔值readUTF()读取字符串使用UTF-8编码数据输出流DataOutputStream支持方法writeInt(int v)写入一个整数writeDouble(double v)写入一个双精度浮点数writeBoolean(boolean b)写入布尔值writeUTF(String str)写入字符串以UTF-8编码存储使用示例数据流写入与读取import java.io.*; public class DataStreamExample { public static void main(String[] args) { try (DataOutputStream dos new DataOutputStream(new FileOutputStream(data.dat)); DataInputStream dis new DataInputStream(new FileInputStream(data.dat))) { // 写入数据 dos.writeInt(100); dos.writeDouble(3.14159); dos.writeBoolean(true); dos.writeUTF(Hello, Data Stream!); // 读取数据 int num dis.readInt(); double pi dis.readDouble(); boolean flag dis.readBoolean(); String text dis.readUTF(); System.out.println(读取结果); System.out.println(整数 num); System.out.println(浮点数 pi); System.out.println(布尔值 flag); System.out.println(字符串 text); } catch (IOException e) { e.printStackTrace(); } } }如果文件较大可以用BufferedInputStream/BufferedOutputStream缓冲流包装底层节点流以提升性能。DataInputStream in new DataInputStream(new BufferedInputStream(new FileInputStream(data.bin)));序列化与反序列化ObjectOutputStream / ObjectInputStream序列化Serialization是指将内存中的 Java 对象转换为字节流以便存储到文件、数据库或通过网络传输反序列化Deserialization则是将字节流重新还原为 Java 对象的过程。Java 提供了ObjectOutputStream和ObjectInputStream两个对象流类来分别实现这两项操作。ObjectOutputStream序列化对象ObjectOutputStream是字节输出流用于将对象写入底层输出流中。核心方法是writeObject()。// 创建对象输出流并关联到文件 ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(person.dat)); // 将 Person 对象序列化写入文件 oos.writeObject(person); // 关闭流以释放资源 oos.close();ObjectInputStream反序列化对象ObjectInputStream是字节输入流用于从底层输入流中读取字节并还原为 Java 对象。核心方法是readObject()。// 创建对象输入流并关联到文件 ObjectInputStream ois new ObjectInputStream(new FileInputStream(person.dat)); // 读取对象并强制转换为 Person 类型 Person person (Person) ois.readObject(); // 关闭流 ois.close();反序列化过程通过ObjectInputStream类将字节流转换为对象进行反序列化。readObject()方法会读取序列化时的对象状态数据并通过ClassNotFoundException抛出类缺失异常因此调用处需要捕获该异常。import java.io.*; public class TestSerialization { public static void main(String[] args) { Person person new Person(121, Albert, 18); // 序列化 try (ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(person.dat))) { oos.writeObject(person); System.out.println(对象已序列化到 person.dat); } catch (IOException e) { e.printStackTrace(); } // 反序列化 try (ObjectInputStream ois new ObjectInputStream(new FileInputStream(person.dat))) { Person saved (Person) ois.readObject(); System.out.println(反序列化结果 saved); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } class Person implements Serializable { private String name; private int age; private int ID; public Person(int ID, String name, int age) { this.ID ID; this.name name; this.age age; } Override public String toString() { return Person{name name , age age , ID ID }; } }须实现Serializable接口如果对象所属类未实现java.io.Serializable直接写出对象会抛出NotSerializableException。若类中包含引用类型的字段该引用类型也必须实现Serializable接口否则序列化过程中遇到该字段时同样会抛异常。声明serialVersionUID建议为每个可序列化类显式声明serialVersionUID静态常量例如private static final long serialVersionUID 1L;。如果省略JVM 会根据类结构自动生成但当类结构发生变化时自动生成的 UID 可能改变导致序列化版本不一致而抛出InvalidClassException。transient关键字被transient修饰的字段不会被序列化。通常用来过滤敏感信息如密码或不需要持久化的缓存字段。static字段静态字段属于类级别不会被序列化。因为序列化保存的是“对象状态”而不是“类状态”。打印流PrintStreamPrintStream继承自OutputStream属于字节输出流体系它可以将各种数据类型如int、double、字符串等自动转换成字节并输出import java.io.*; public class testPrint { public static void main(String[] args) throws FileNotFoundException { // 将 System.out 保存为原始输出流对象便于后续恢复 PrintStream originalOut System.out; // 1. 使用默认的 System.out 打印信息到控制台 originalOut.println(打印流); // 输出字符串 打印流 originalOut.println(true); // 输出布尔值 true // 2. 创建一个新的 PrintStream输出目标为文件 println.txt // 包装顺序FileOutputStream - BufferedOutputStream - PrintStream // true 参数表示自动刷新缓冲区每次 println 后立即写入 PrintStream ps new PrintStream( new BufferedOutputStream( new FileOutputStream(println.txt) ), true ); // 3. 使用新创建的 PrintStream 打印内容到文件 ps.println(打印流); // 写入文件打印流 ps.println(true); // 写入文件true // 4. 将 System.out 重定向到新创建的 PrintStream即文件 System.setOut(ps); // 5. 此时所有通过 System.out 输出的内容都会被写入文件 System.out.println(这条信息会写入文件); // 写入文件而非控制台 // 6. 恢复 System.out 到原始控制台输出 // 使用系统标准输出文件描述符FileDescriptor.out重新创建一个 PrintStream System.setOut(new PrintStream( new BufferedOutputStream( new FileOutputStream(FileDescriptor.out) ), true )); // 7. 恢复后再次使用 System.out 打印输出将回到控制台 System.out.println(这条信息会写入控制台); // 输出到控制台 } }关键点解析PrintStream用于格式化输出数据支持多种类型如字符串、布尔值、数字等。FileOutputStream(println.txt)创建文件输出流向文件写入字节数据。BufferedOutputStream提高写入效率减少 I/O 次数。System.setOut(PrintStream)改变标准输出流的目标位置实现重定向。FileDescriptor.out代表系统标准输出设备通常是控制台用于恢复输出。true 作为构造参数启用自动刷新确保每次调用println()都立即写入底层输出流。注意事项程序运行后会在当前目录生成文件println.txt内容包含两次println输出。若未正确处理异常可能抛出FileNotFoundException因此方法声明中包含throws FileNotFoundException。重定向操作是全局性的影响整个 JVM 中所有使用System.out的地方。建议在程序结束前恢复输出流避免影响其他组件或测试结果。运行结果示例控制台输出打印流 true 这条信息会写入控制台文件println.txt内容打印流 true 这条信息会写入文件标准错误流标准错误流通过System.err提供同样是PrintStream类型用于输出错误信息。虽然与System.out使用相同的底层机制但通常被独立用于错误日志或调试信息。System.err.println(发生了一个错误);在命令行中System.out和System.err可以被分别重定向便于区分正常输出和错误输出。随机访问流RandomAccessFile是 Java 中专门用于随机访问文件的类。它与其他 IO 流不同既可以读取文件也可以写入文件并且可以通过移动内部指针Pointer定位到文件的任意位置进行操作5。它继承自Object实现了DataInput和DataOutput接口因此可以读写基本数据类型和 UTF 字符串构造方法public RandomAccessFile(String name, String mode) public RandomAccessFile(File file, String mode)mode常用的取值有“r”只读模式只能读取文件文件不存在则抛异常。“rw”读写模式可读可写文件不存在会自动创建。“rwd”读写模式同步文件内容的更新。“rws”读写模式同步文件内容和元数据的更新。RandomAccessFile raf new RandomAccessFile(example.txt, rw);随机读取数据通过seek()定位到指定字节位置后可进行读取操作。raf.seek(100); // 移动指针到第100个字节处 int data raf.read(); // 读取一个字节随机写入数据可在任意位置写入数据原有内容可能被覆盖。raf.seek(50); raf.write(X); // 写入字符X到第50字节位置获取当前文件指针位置long currentPosition raf.getFilePointer();获取文件长度long fileLength raf.length();举例import java.io.RandomAccessFile; import java.io.IOException; public class RandomAccessFileDemo { public static void main(String[] args) { String filePath test.txt; try (RandomAccessFile raf new RandomAccessFile(filePath, rw)) { // 1. 写入数据初始指针位于文件开头 raf.writeUTF(Hello RandomAccessFile); raf.writeInt(100); raf.writeLong(20260105L); // 2. 获取当前指针位置 long currentPos raf.getFilePointer(); System.out.println(写入后指针位置 currentPos); // 3. 将指针重置到文件开头 raf.seek(0); // 4. 按照写入顺序读取数据类型需匹配 String str raf.readUTF(); int num raf.readInt(); long date raf.readLong(); System.out.println(读取的字符串 str); System.out.println(读取的int值 num); System.out.println(读取的long值 date); // 5. 定位到指定位置覆盖写入 raf.seek(str.length() 2); // UTF字符串前有2字节长度信息需跳过 raf.writeUTF(Java); } catch (IOException e) { e.printStackTrace(); } } }UTF 字符串的长度前缀writeUTF()会先写入 2 字节的长度标识因此使用seek()定位时需要额外考虑这 2 个字节的偏移
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑