Считать файл свойств из jar - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу прочитать файлы свойств внутри файла jar.Я читал много веток об этом, но это не решило проблему.Для этого я использую следующий метод:

public InputStream getLanguageFile(String languageName) {
    languageName = languageName.replace(".properties", "");
    return MainClass.class.getResourceAsStream("/me/s3ns3iw00/resources/languages/" + languageName + ".properties");
}

Я получаю следующую ошибку:

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 4: file:\C:\Users\danie\Desktop\mcserverlauncher_resources\setup\mcserverlauncher.jar!\me\s3ns3iw00\resources\languages
        at sun.nio.fs.WindowsPathParser.normalize(Unknown Source)
        at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
        at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
        at sun.nio.fs.WindowsPath.parse(Unknown Source)
        at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source)
        at java.io.File.toPath(Unknown Source)
        at me.s3ns3iw00.windows.Welcome.<init>(Welcome.java:59)
        at me.s3ns3iw00.MainClass.start(MainClass.java:44)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
        ... 1 more
Exception running application me.s3ns3iw00.MainClass

Извините за мой плохой английский, и спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Итак, я нашел решение.

Я использую этот метод, чтобы получить InputStream файла, который находится в банке вашего приложения:

public InputStream getLanguageStream(String languageName) {
        languageName = languageName.replace(".properties", "");
        return MainClass.class.getResourceAsStream("/me/s3ns3iw00/resources/languages/" + languageName + ".properties");
}

Теперь вы можете загрузить его в Свойства:

properties.load(new InputStreamReader(getLanguageStream("ENG"), Charset.forName("UTF-8")));

И дополнительно:

Я использую этот метод для получения имени файла в пути к jar:

public List<String> getFileNamesInJarPath(String jarPath) {
        List<String> fileNames = new ArrayList<>();
        CodeSource src = MainClass.class.getProtectionDomain().getCodeSource();
        try {
            if (src != null) {
                URL jar = src.getLocation();
                ZipInputStream zip = new ZipInputStream(jar.openStream());
                while (true) {
                    ZipEntry e = zip.getNextEntry();
                    if (e == null)
                        break;
                    String name = e.getName();
                    if (name.startsWith(jarPath)) {
                        String substringedName = name.substring(name.lastIndexOf("/") + 1);
                        if (!substringedName.equalsIgnoreCase("")) {
                            fileNames.add(substringedName);
                        }
                    }
                }
            } else {
                /* Fail... */
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileNames;
}

Вы получаете список содержимого каталога jarPath, который находится вбаночка ваших приложений.

0 голосов
/ 12 декабря 2018

getResourceAsStream ожидает путь, который находится внутри ResourceFile, указывать путь к папке проекта не требуется.

public InputStream getLanguageFile(String languageName) throws URISyntaxException {
    languageName = languageName.replace(".properties", "");
    return MainClass.class.getResourceAsStream("languages\" + languageName + ".properties");
}
...