有没有办法从与.jar文件位于同一文件夹中的文件中读取?我正在尝试创建一个java程序,当我提交作业时,该程序必须从文件中读取。我不知道一旦我把文件或程序翻过来,它会放在哪里,所以我不认为我可以编码保存文件的目录。这可能吗?问题是,我必须将文件上传到CSX主机服务器,这是一个linux服务器,并从那里运行它。如果我不在文件前面放一个路径,它会只搜索它当前的文件夹位置吗?
您可以通过获取包含任何特定类的JAR文件的位置
URL url = thisClass.getProtectionDomain().getCodeSource().getLocation();
从那里可以很容易地将URL与所需文件进行对比。
如注释中所述,只有当您从jar所在的目录中运行命令时,这才有效。
(在桌面应用程序的上下文中)
要访问jar
当前目录中的文件,文件的path
前面应该有一个点。示例:
String path = "./properties.txt";
FileInputStream fis = new FileInputStream(path);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
// Read the file contents...
在本例中,在与jar
相同的目录中有一个名为properties.txt
的文本文件
该文件将由jar
中包含的程序读取
编辑:您说过文件名不会更改,这个答案适用于您事先知道名称的情况,当然,如果您更喜欢硬编码的话。
如果输入文件名可以硬编码,并且您知道它将始终与包含代码的jar位于同一目录中,那么这应该有效:
public static void main(String[] args) {
try {
// Determine where the input file is; assuming it's in the same directory as the jar
String fileName = "input.txt";
File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
String inputFilePath = jarFile.getParent() + File.separator + fileName;
FileInputStream inStream = new FileInputStream(new File(inputFilePath));
try {
// Read in the contents of the input file in a single gulp
FileChannel fc = inStream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0,
fc.size());
// Do something with the read in data
System.out.println(Charset.defaultCharset().decode(bb)
.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
inStream.close();
}
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
}
}
@kcpr-感谢您提供的解决方案。下面一个对我有用。
private static String CONFIG_FILE_LOCATION = "lib"+ File.separator + "Config.properties";
static {
File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
String inputFilePath = jarFile.getParent() + File.separator + CONFIG_FILE_LOCATION;
propConfig = new PropertiesConfiguration(new File(inputFilePath));
propConfig.load();
}
要使其"自包含",请将资源放入Jar中。然后,它变成了一个(只读)嵌入资源,我们可以使用以下内容获得URL:
URL url = this.getClass().getResource("/path/to/the.resource");
以下是如何获得jar文件的干净目录路径(基于EJP的答案):
URL url = IssueInfoController.class.getProtectionDomain().getCodeSource().getLocation();
String urlString = url.toString();
int firstSlash = urlString.indexOf("/");
int targetSlash = urlString.lastIndexOf("/", urlString.length() - 2) + 1;
return urlString.substring(firstSlash, targetSlash) + YOUR_FILE;
根据您的评论,我认为您最好的解决方案是将上传文件的绝对路径传递到jar中。
您可以将路径作为命令行参数传递到jar中。由于路径和文件名不会更改,并且您是从linux运行它的,因此可以创建一个.sh脚本来运行它。
#!/bin/bash
java -jar myjar.jar /path/to/file/filename.txt
这样还可以将文件路径或文件名硬编码到jar中。
public class TestClassLoaderAccess {
public static void main(String[] argv) {
TestClassLoaderAccess me = new TestClassLoaderAccess();
ClassLoader myLoader = me.getClass().getClassLoader();
System.out.println(myLoader.getClass().getSuperclass().getName());
java.net.URLClassLoader myUrlLoader = (java.net.URLClassLoader) myLoader;
java.net.URL resource = myUrlLoader.findResource("TestClassLoaderAccess.class");
System.out.println(resource.toString());
}
}
运行它:
C:JavaTools>javac TestClassLoaderAccess.java
C:JavaTools>java TestClassLoaderAccess
java.net.URLClassLoader
file:/C:/JavaTools/TestClassLoaderAccess.class
C:JavaTools>
(第一个println只是为了证明类加载器是URLClassLoader的一个子类。)