Подтвердить что ты не робот

Читать из файла, который находится в той же папке, что и файл .jar

Есть ли способ прочитать из файла, который находится в той же папке, что и файл .jar? Я пытаюсь создать Java-программу, которая должна читать из файла, когда я включаю свое назначение. Я не знаю, где будет храниться файл или программа, когда я его переверну, так что я не думаю, что могу кодировать каталог удерживаемого файла. Это возможно? Проблема в том, что я должен загрузить файл на сервер хостов CSX, который является сервером Linux и запускает его оттуда. Если я не помещаю путь до того, как файл будет искать его текущую папку?

4b9b3361

Ответ 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();
    }

}

Ответ 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.)