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的运行环境上下文存在差异,具体可能有以下几点:
- 用户权限与会话差异:Windows的网络驱动器映射和当前用户会话绑定。如果Groovy以管理员身份启动(比如右键Groovy Console选择以管理员运行),而Java程序以普通用户身份运行,管理员会话无法看到普通用户映射的网络驱动器,反之亦然。
- Groovy运行环境的默认配置:Groovy脚本启动时,可能加载了内部扩展或设置了特定系统属性,间接影响
File.listRoots()对Windows API的调用逻辑,导致网络驱动器未被枚举。 - 控制台环境差异:Java程序作为独立控制台进程运行,会完全继承当前用户的环境变量和驱动器映射;而Groovy如果通过IDE内嵌控制台或特殊启动器运行,可能未正确加载用户的网络驱动器映射信息。
验证方法:确保Groovy和Java以相同用户身份、相同启动方式运行(比如都在普通用户命令行下执行groovy script.groovy和java Test),此时二者返回的根目录应该一致。
内容的提问来源于stack exchange,提问作者Scoutman
相关产品推荐
相关产品推荐

