2010-05-27 17 views
1

这里是一个非常简单的Java程序来打印文件的第一行:如何获取Java承认在cygwin下符号链接

import java.io.* 
public class test { 
    public static void main(String[] args) throws IOException { 
    System.out.print(new BufferedReader(new FileReader(args[0])).readLine()); 
    } 
} 

当我运行在Cygwin的这一计划并把它传递一个符号的名称链接,它打印的符号链接,而不是链接的目标的内容:

$ echo foo > testfile 
$ ln -s testfile symlink_to_testfile 
$ java test testfile 
foo 
$ java test symlink_to_testfile 
!<symlink> ?t e s t f i l e 

我怎样才能让Java来跟随符号链接?我希望比自己实现重定向更简单。

+0

我戳了一圈,发现了一个名为路口(http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx)工具,我用来做Windows下的快捷方式(而不是LN -s以上)。这似乎解决了这个问题。 – 2010-05-27 18:09:25

回答

0

我不认为这是一个简单的答案。正如各种页面所述,Cygwin是一个应用程序套件而不是操作系统,Sun不支持Cygwin上的Java。

但是,它可能可能可能从源代码为Cygwin构建JDK 6。当然,this page暗示这是可能的。无论这给你一个理解Cygwin样式符号链接的JDK,任何人都会猜测...... :-)

0

你正在使用什么版本的Java? This Java Tutorial表示NIO知道文件系统链接,所以只要你是Java1.4或更高版本,你就应该是Aok。它可能是它实际上是nio2它在谈论,在这种情况下尝试与Java7预发布。

+0

这是1.6.0_20,HotSpot虚拟机。他们推荐的包(java.nio.file)在Java7之前不存在。我不认为我还想去Java7。 – 2010-05-27 06:04:45

1

我有这个问题了,所以我写了一个外壳包装,包括像

# java runs as native windows program, so convert pathnames 
WINDOWS_ARGS="" 
for ARG in $* 
do 
if [ -e $ARG ] 
# pathname argument is only converted if the file exists, 
# so this trick may not be appropriate everywhere... 
then 
WINDOWS_ARGS="$WINDOWS_ARGS `cygpath -w $ARG`" 
else 
WINDOWS_ARGS="$WINDOWS_ARGS $ARG" 
fi 
done 
java -jar `cygpath -w myprogram.jar` $WINDOWS_ARGS 

因为我调用从cygwin的东西反正壳。如果你需要开始从窗口$环境的脚本,看到http://cygwin.com/ml/cygwin/2004-07/msg00163.html

cygpath是转换路径字符串的建议的方式......我来到这个页面,因为我想开一个File对象与硬编码路径可能成为一个cygwin符号链接。仍然不确定这个......运行一个子进程似乎极端,需要cygpath在你的Windows路径或cygwin目录在每台计算机上的相同位置。

+0

在我看来最好的答案。我已经根据你制作了一个类似的脚本。它不会假定'-jar'选项,并且对于包含空格的参数没有问题。 – artistoex 2012-11-13 18:09:17

+0

这只适用于在命令行中指定的文件名。如果程序构造一个文件名,或从其他地方读取文件名,然后尝试打开它,它仍然会读取链接的内容而不是链接文件。 – 2013-01-16 20:25:08

2

我爱derpaderp的答案,所以我调整了我的需要。在没有采用-jar选项并且不存在包含空格的参数问题时更一般。我已经将这个脚本移动到/usr/bin/java并使其成为可执行文件。

#!/bin/sh  

JAVA_PATH="/cygdrive/c/Program Files/Java/jre7/bin/java" 


declare -a WINDOWS_ARGS 
i=0 
for ARG in "[email protected]" 
do 

    if [ -e "$ARG" ]; then 
     # pathname argument is only converted if the file exists, 
     # so this trick may not be appropriate everywhere... 
     WINDOWS_ARGS[$i]="`cygpath -w $ARG`" 
    else 
     WINDOWS_ARGS[$i]="$ARG" 
    fi 
    ((i++)) 
done 
"$JAVA_PATH" "${WINDOWS_ARGS[@]}"