Java通过在jar文件所在位置创建目录

5

我已经在SO上搜索了答案,但没有找到合适的。

当我从一个jar文件中启动我的程序时,我需要在jar文件所在的目录中创建一个文件夹。无论用户将jar文件保存在哪里都不应该有影响。

以下是我最近尝试的代码:使用System.out.println可以打印出正确的目录,但是文件夹不会被创建。与此相反,现在所有的东西都被保存在我的System32文件夹中。

    public static String getProgramPath() throws IOException{
    String currentdir = System.getProperty("user.dir");
    currentdir = currentdir.replace( "\\", "/" );
    return currentdir;

}

File dir = new File(getProgramPath() + "Comics/");//The name of the directory to create
    dir.mkdir();//Creates the directory

你为什么要用 / 替换 \? - Hovercraft Full Of Eels
我一直在尝试找到一种方法来创建目录。这是用来将 \ 替换为 /,以便路径在 Windows 中正确转换。但我就是无法让任何东西起作用 :/ - Michael Scott
1
user.dir 是您的主目录,它是固定的,并不受您的 jar 文件所在位置的影响。在目录名称(不包含尾部斜杠)和 "Comics" 之间需要一个 "/",这只是目录之间的分隔符。巧合的是,您的 user.dir 可以是 jar 文件所在的目录。然而,将其用作写入目录并不是最佳选择:用户通常无权写入安装程序的目录。 - user unknown
2个回答

4

获取Jar文件的路径可能比仅仅获取user.dir目录要棘手一些。我记不清楚原因了,但是在某些情况下,user.dir不能可靠地返回这个路径。如果您绝对必须获取jar文件的路径,则需要进行一些黑魔法,并首先获取类的protectionDomain。类似于:

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;

import javax.swing.JOptionPane;

public class MkDirForMe {
   public static void main(String[] args) {
      try {
         String path = getProgramPath2();

         String fileSeparator = System.getProperty("file.separator");
         String newDir = path + fileSeparator + "newDir2" + fileSeparator;
         JOptionPane.showMessageDialog(null, newDir);

         File file = new File(newDir);
         file.mkdir();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   public static String getProgramPath2() throws UnsupportedEncodingException {
      URL url = MkDirForMe.class.getProtectionDomain().getCodeSource().getLocation();
      String jarPath = URLDecoder.decode(url.getFile(), "UTF-8");
      String parentPath = new File(jarPath).getParentFile().getPath();
      return parentPath;
   }
}

即使如此也不能保证一定能够成功,你需要接受这样一个事实,有时候(比如出于安全考虑),你将无法获得Jar包的路径。

2

通过一些改动(例如在Comics之前加上“/”),我成功地创建了您期望的目录。这是我使用的完整代码。

import java.io.*;
public class TestClass {

        public static String getProgramPath() throws IOException{
                String currentdir = System.getProperty("user.dir");
                currentdir = currentdir.replace( "\\", "/" );
                return currentdir;

        }
        public static void main(String[] argv) {
                try {
                        String d = getProgramPath() + "/Comics/";
                        System.out.println("Making directory at " + d);
                        File dir = new File(d);//The name of the directory to create                                                                                      
                        dir.mkdir();//Creates the directory                                                                                                               
                }
                catch (Exception e) { System.out.println("Exception occured" + e);}
        }
}

在未来,请不要像“/”这样硬编码。使用内置库,它会询问操作系统在此情况下正确的内容。这确保了跨平台功能不容易出现问题。

当然,要适当地捕获异常等。这只是将您的代码快速改造成可用的尝试。


1
如果用户以 java -jar /foo/bar/some.jar 的方式运行JAR文件,并且当前目录不是 /foo/bar,那么这个方法就无法正常工作。 - Stephen C
由于某些原因,当我尝试在我的程序中使用这段代码时它不起作用!但是在单个测试类文件中它可以正常工作。非常奇怪... - Michael Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接