通过java创建jar文件所在的目录

通过java创建jar文件所在的目录,java,path,directory,Java,Path,Directory,我已经调查过了,所以没有找到合适的答案 当我从jar启动程序时,我需要在jar文件所在的目录中创建一个文件夹。用户将jar文件保存在哪里并不重要 下面是我正在玩的最新代码:ASystem.out.println将打印出正确的目录,但不会创建文件夹。相反,从现在起,所有内容都保存到我的System32文件夹中 public static String getProgramPath() throws IOException{ String currentdir = System.ge

我已经调查过了,所以没有找到合适的答案

当我从jar启动程序时,我需要在jar文件所在的目录中创建一个文件夹。用户将jar文件保存在哪里并不重要

下面是我正在玩的最新代码:A
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
通过一些更改(例如在漫画之前添加“/”),我成功地创建了您期望的目录。这是我使用的完整代码

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);}
        }
}
以后,请不要硬编码“/”之类的东西。使用内置库,它会询问操作系统在这种情况下什么是正确的。这确保了功能不会跨平台中断(很容易)


当然,要正确地捕获异常,等等。这只是快速而肮脏地尝试将代码塑造成可以工作的东西。

获取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的路径。

为什么要将\\替换为/?我正在试图找到一种创建目录的方法。它用于将\替换为/,以便在Windows中正确转换路径。我只是无法让任何东西工作:/user.dir是您的主目录,它是固定的,完全不受jar所在位置的影响。在目录名(不包含尾随斜杠,它只是目录之间的分隔符)和“漫画”之间需要一个“/”。巧合的是,corse的user.dir可以是jar所在的目录。使用此目录写入也不是最好的主意:通常不允许用户写入安装程序的目录。如果用户以
java-JAR/foo/bar/some.JAR
运行JAR,并且当前没有
/foo/bar
作为其当前目录,则这不起作用。出于某种原因,当我尝试在我的程序中使用代码时,它不起作用!它可以使用单个测试类文件。很奇怪。。。