当前位置:首页 > 后端开发 > 正文

Java怎么读写文件?

在Java中操作文件主要通过 java.io.File类实现,支持创建、删除、重命名及检查文件属性等基础功能,结合 FileInputStream/ FileOutputStream可读写字节数据,使用 FileReader/ FileWriter处理字符流,NIO包的 FilesPaths类提供更高效的文件操作,如复制、移动及遍历目录。

在Java中处理文件操作是开发中的常见需求,涉及文件读写、上传、下载等多种场景,下面通过实际代码示例和最佳实践详细讲解核心操作方法:

文件读写基础(java.io包)

文本文件读写

import java.io.*;
public class TextFileExample {
    // 写入文本文件
    public static void writeFile(String path, String content) throws IOException {
        try (FileWriter writer = new FileWriter(path)) {
            writer.write(content);
            System.out.println("文件写入成功");
        }
    }
    // 读取文本文件
    public static String readFile(String path) throws IOException {
        StringBuilder content = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("n");
            }
        }
        return content.toString();
    }
    public static void main(String[] args) {
        String filePath = "demo.txt";
        try {
            writeFile(filePath, "你好,这是测试内容n第二行文本");
            System.out.println("文件内容:n" + readFile(filePath));
        } catch (IOException e) {
            System.err.println("文件操作错误: " + e.getMessage());
        }
    }
}

二进制文件操作(如图片/视频)

import java.nio.file.*;
public class BinaryFileExample {
    // 保存字节数据到文件
    public static void saveBinaryFile(byte[] data, String path) throws IOException {
        Files.write(Paths.get(path), data);
    }
    // 读取文件为字节数组
    public static byte[] readBinaryFile(String path) throws IOException {
        return Files.readAllBytes(Paths.get(path));
    }
}

高效文件处理(NIO包)

Java NIO提供更高效的文件操作API:

import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class NioExample {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("nio_demo.txt");
        // 写入文件(覆盖模式)
        Files.write(path, 
                   "NIO写入示例".getBytes(StandardCharsets.UTF_8),
                   StandardOpenOption.CREATE,
                   StandardOpenOption.TRUNCATE_EXISTING);
        // 追加内容
        Files.write(path, 
                   "n追加内容".getBytes(),
                   StandardOpenOption.APPEND);
        // 读取所有行
        List<String> lines = Files.readAllLines(path);
        lines.forEach(System.out::println);
    }
}

Web文件上传(Servlet示例)

前端HTML表单

<form action="upload" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <button type="submit">上传</button>
</form>

Servlet处理上传

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        Part filePart = request.getPart("file");
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
        // 保存到服务器指定目录
        try (InputStream fileContent = filePart.getInputStream()) {
            Files.copy(fileContent, 
                      Paths.get("/uploads/" + fileName),
                      StandardCopyOption.REPLACE_EXISTING);
        }
        response.getWriter().print("上传成功: " + fileName);
    }
}

关键注意事项

  1. 异常处理 – 必须捕获IO异常:

    try {
        Files.readAllBytes(Paths.get("file.txt"));
    } catch (IOException e) {
        System.err.println("错误: " + e.getClass().getSimpleName() + " - " + e.getMessage());
    }
  2. 资源关闭 – 使用try-with-resources自动关闭:

    Java怎么读写文件?  第1张

    try (FileInputStream fis = new FileInputStream("data.bin")) {
        // 自动关闭资源
    }
  3. 文件安全

    • 验证上传文件类型:String contentType = Files.probeContentType(path)
    • 限制上传文件大小(@MultipartConfig注解配置)
  4. 路径处理建议

    • 使用相对路径:Paths.get("data/files/")
    • 跨平台路径分隔符:File.separator

高级场景处理

大文件分块读取

try (BufferedReader br = Files.newBufferedReader(Paths.get("large.log"))) {
    String line;
    while ((line = br.readLine()) != null) {
        // 逐行处理大文件
    }
}

文件监控(WatchService)

WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get("/monitor");
path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
while (true) {
    WatchKey key = watchService.take();
    for (WatchEvent<?> event : key.pollEvents()) {
        if (event.kind() == ENTRY_MODIFY) {
            System.out.println("文件修改: " + event.context());
        }
    }
    key.reset();
}

  1. 选择正确API

    • 小文件:Files.readAllBytes()/Files.write()
    • 大文件:缓冲流(BufferedInputStream)或NIO Channel
  2. 字符编码 – 始终明确指定:

    new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
  3. 临时文件处理

    Path tempFile = Files.createTempFile("prefix_", ".tmp");
    tempFile.toFile().deleteOnExit(); // 程序退出时删除
  4. 新版JDK特性(JDK11+):

    Files.writeString(Path.of("new.txt"), "内容"); // 直接写入字符串
    String content = Files.readString(Path.of("file.txt"));

引用说明:本文代码基于Java 17 API规范编写,文件操作遵循Oracle官方文档推荐实践,Servlet示例需Tomcat 10+支持,NIO特性要求JDK 7及以上版本,安全建议参考OWASP文件上传防护指南。

0