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

Groovy与Java调用File.listRoots()输出差异:本地盘vs含网络盘

Groovy与Java调用File.listRoots()返回结果不同的原因分析

我尝试用Groovy调用File.listRoots()列出根目录时,只能获取本地硬盘;但相同的代码在Java中执行,却能返回本地硬盘及所有网络驱动器。想了解二者表现不同的原因。

使用环境

  • Groovy版本:4.0.4,JVM:1.8.0_151,厂商:Oracle Corporation,操作系统:Windows 10
  • Java版本:"1.8.0_151"

Groovy代码及输出

for (File root : File.listRoots()) {
    System.out.println(root);
}

输出:

B:\
C:\
E:\

Java代码及输出

import java.io.File;
import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException {
        for (File root : File.listRoots()) {
            System.out.println(root);
        }
    }
}

输出:

B:\
C:\
E:\
J:\
P:\
S:\
U:\
V:\
X:\
Z:\

原因分析

核心原因是Groovy与Java的运行环境上下文存在差异,具体可能有以下几点:

  1. 用户权限与会话差异:Windows的网络驱动器映射和当前用户会话绑定。如果Groovy以管理员身份启动(比如右键Groovy Console选择以管理员运行),而Java程序以普通用户身份运行,管理员会话无法看到普通用户映射的网络驱动器,反之亦然。
  2. Groovy运行环境的默认配置:Groovy脚本启动时,可能加载了内部扩展或设置了特定系统属性,间接影响File.listRoots()对Windows API的调用逻辑,导致网络驱动器未被枚举。
  3. 控制台环境差异:Java程序作为独立控制台进程运行,会完全继承当前用户的环境变量和驱动器映射;而Groovy如果通过IDE内嵌控制台或特殊启动器运行,可能未正确加载用户的网络驱动器映射信息。

验证方法:确保Groovy和Java以相同用户身份、相同启动方式运行(比如都在普通用户命令行下执行groovy script.groovy和java Test),此时二者返回的根目录应该一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:54:24