Есть ли способ прочитать из файла, который находится в той же папке, что и файл .jar? Я пытаюсь создать Java-программу, которая должна читать из файла, когда я включаю свое назначение. Я не знаю, где будет храниться файл или программа, когда я его переверну, так что я не думаю, что могу кодировать каталог удерживаемого файла. Это возможно? Проблема в том, что я должен загрузить файл на сервер хостов CSX, который является сервером Linux и запускает его оттуда. Если я не помещаю путь до того, как файл будет искать его текущую папку?
Читать из файла, который находится в той же папке, что и файл .jar
Ответ 1
Как отмечено в комментариях, это работает, только если вы запустите команду из каталога, в котором находится jar.
(В контексте настольного приложения)
Чтобы получить доступ к файлу, который в текущем каталоге jar
, вашему path
к файлу должна предшествовать точка. Пример:
String path = "./properties.txt";
FileInputStream fis = new FileInputStream(path);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
// Read the file contents...
В этом примере есть текстовый файл с именем properties.txt
в том же каталоге, что и jar
.
Этот файл будет прочитан программой, содержащейся в jar
.
Изменить: вы сказали, что имя файла не изменится, и этот ответ будет применяться, если вы знаете имя заранее, конечно, если вы предпочитаете его жестко кодировать.
Ответ 2
Вы можете получить местоположение файла JAR, содержащего какой-либо конкретный класс, с помощью:
URL url = thisClass.getProtectionDomain().getCodeSource().getLocation();
Оттуда легко релятивизировать URL-адрес требуемого файла.
Ответ 3
если входное имя файла может быть жестко запрограммировано, и вы знаете, что он всегда будет находиться в том же каталоге, что и jar, содержащий ваш код, тогда это должно работать:
public static void main(String[] args) {
try {
// Determine where the input file is; assuming it 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();
}
}
Ответ 4
Чтобы сделать его "самодостаточным", поместите ресурс внутри Jar. Затем он становится встроенным ресурсом (только для чтения) для которого мы можем получить URL-адрес, используя что-то в соответствии с строками:
URL url = this.getClass().getResource("/path/to/the.resource");
Ответ 5
Основываясь на ваших комментариях, я думаю, что вашим лучшим решением было бы передать абсолютный путь загруженного файла в банку.
Вы можете передать путь в банку как аргумент командной строки. Поскольку путь и имя файла не изменяются, и вы запускаете его из linux, вы можете создать .sh script для его запуска.
#!/bin/bash
java -jar myjar.jar /path/to/file/filename.txt
Это также освобождает вас от жесткого кодирования в пути к файлу или имени файла в банке.
Ответ 6
Здесь вы получите чистый путь к файлу 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;
Ответ 7
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.)