You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FileDialog选文件后Scanner抛出FileNotFoundException的问题求助

问题原因与解决方法

核心问题

  1. File对象创建错误:你写的new File("filename")是在尝试读取一个名为filename的固定文件,而非用户选择的目标文件,应该使用变量filename而非字符串字面量。
  2. 缺少完整文件路径:FileDialog.getFile()仅返回文件名,不包含文件所在的目录,直接用它创建File对象会导致程序在当前工作目录下查找该文件,自然找不到用户选择的文件。

修正后的代码

public void readItemData() {
    try {
        Frame frame = null;
        FileDialog fileBox = new FileDialog(frame, "Open", FileDialog.LOAD);
        fileBox.setVisible(true);
        
        // 先判断用户是否取消了文件选择
        String filename = fileBox.getFile();
        String directory = fileBox.getDirectory();
        if (filename == null || directory == null) {
            System.out.println("用户取消了文件选择");
            return;
        }
        
        // 用目录+文件名创建File对象,双参数构造器会自动处理不同系统的路径分隔符
        File inFile = new File(directory, filename);
        System.out.println("文件绝对路径:" + inFile.getAbsolutePath());
        
        Scanner fileScanner = new Scanner(inFile);
        // 逐行读取用hasNextLine()和nextLine(),next()是按空白符分割读取内容
        while (fileScanner.hasNextLine()) {
            String line = fileScanner.nextLine();
            System.out.println(line);
        }
        fileScanner.close(); // 记得关闭资源避免内存泄漏
    } catch (FileNotFoundException ex) {
        System.out.println("找不到指定文件:" + ex.getMessage());
    }
}

额外说明

  • 优先使用File(directory, filename)构造器,它会根据操作系统自动适配路径分隔符(Windows用\,Linux用/),比手动字符串拼接更可靠。
  • 若要实现逐行读取,需搭配hasNextLine()和nextLine(),原代码中的next()是按空白符分割读取内容,并非真正的逐行读取。
  • 必须处理用户取消选择的场景,此时getFile()会返回null,避免后续代码触发空指针异常。

内容的提问来源于stack exchange,提问作者Massiveegg9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:58:24