如何在运行时获得Java应用程序的真正path?

我正在使用log4j创build一个Java应用程序。 我给出了configurationlog4j文件的绝对path以及生成的日志文件(生成此日志文件的位置)的绝对path。 我可以在运行时通过以下方式获得Java Web应用程序的绝对path:

String prefix = getServletContext().getRealPath("/"); 

但是在普通的Java应用程序的上下文中,我们可以使用什么?

尝试;

 String path = new File(".").getCanonicalPath(); 

目前还不清楚你要求什么。 我不知道我们使用的web应用程序是什么意思,如果getServletContext().getRealPath()不是答案,但是:

  • 当前用户的当前工作目录由System.getProperty("user.dir")
  • 当前用户的主目录由System.getProperty("user.home")
  • this.getClass().getProtectionDomain().getCodeSource().getLocation()提供当前类加载的JAR文件的位置。

那么使用this.getClass().getProtectionDomain().getCodeSource().getLocation()

如果您正在讨论一个Web应用程序,您应该使用ServletContext对象中的getRealPath

例:

 public class MyServlet extends Servlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ String webAppPath = getServletContext().getRealPath("/"); } } 

希望这可以帮助。

 new File(".").getAbsolutePath() 

最好将文件保存到user.home的子目录中,而不是应用程序的任何位置。 可能居住。

Sun为了确保applet和应用程序付出了相当大的努力。 使用Java Web Start启动无法确定应用程序。 真正的道路。 这一改变打破了很多应用 如果更改扩展到其他应用程序,我不会感到惊讶。

 /***************************************************************************** * return application path * @return *****************************************************************************/ public static String getApplcatonPath(){ CodeSource codeSource = MainApp.class.getProtectionDomain().getCodeSource(); File rootPath = null; try { rootPath = new File(codeSource.getLocation().toURI().getPath()); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rootPath.getParentFile().getPath(); }//end of getApplcatonPath() 

由于JAR和从IDE内部运行的应用程序的应用程序path不同,因此我编写了以下代码以始终返回正确的当前目录:

 import java.io.File; import java.net.URISyntaxException; public class ProgramDirectoryUtilities { private static String getJarName() { return new File(ProgramDirectoryUtilities.class.getProtectionDomain() .getCodeSource() .getLocation() .getPath()) .getName(); } private static boolean runningFromJAR() { String jarName = getJarName(); return jarName.contains(".jar"); } public static String getProgramDirectory() { if (runningFromJAR()) { return getCurrentJARDirectory(); } else { return getCurrentProjectDirectory(); } } private static String getCurrentProjectDirectory() { return new File("").getAbsolutePath(); } private static String getCurrentJARDirectory() { try { return new File(ProgramDirectoryUtilities.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParent(); } catch (URISyntaxException exception) { exception.printStackTrace(); } return null; } } 

只需调用getProgramDirectory() ,你应该很好。

我使用这个方法来获得jar或exe的完整path。

 File pto = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()); pto.getAbsolutePath()); 

expression方式

 new File(".").getAbsolutePath(); 

会得到与JVM执行相关的当前工作目录。 但是,JVM确实提供了许多其他有用的属性

 System.getProperty(propertyName); 

接口。 这些属性的列表可以在这里find 。

这些将允许您以独立于平台的方式引用当前用户目录,临时目录等。