Распечатать класс-контент на консоль в Java - PullRequest
0 голосов
/ 19 сентября 2019

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

Так что в основном я хочу получить доступ к JAR-файлу при выполнении и распечатать код, написанный в (по выбранному меню)класс-файл.Я уже знаю, как найти JAR-файл, и это работает, но я не могу найти способ получить INAR-файл.Я попытался создать объект File и указать путь к JAR в сочетании с путем к файлу класса, к которому я хочу получить доступ.(Например: «C: \ temp \ Test \ program.jar \ de \ bbzsogr \ Main.class», найденный в WinRAR)

Вот некоторый код класса «CodeGrabber», который я написал для доступа к JARи затем файл в JAR.


public class CodeGrabber {

    private static File JAR;

    public static void grabCode(String className) {

        try {
            JAR = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        System.out.println("JAR is located in: " + JAR);

        // -> "JAR is located in: C:\temp\Test.jar"

        System.out.println("Searching for \"" + JAR + File.separator + "ch" + File.separator + "bbzsogr" + File.separator + "Main.class");

        // -> "Searching for "C:\temp\Test.jar\ch\bbzsogr\Main.class" "

        File main = new File(JAR + File.separator + "ch" + File.separator + "bbzsogr" + File.separator + "Main.class");

        try {
            Scanner scanner = new Scanner(main);

            while(scanner.hasNext()) {
                System.out.println(scanner.nextLine());
            }
        } catch (FileNotFoundException e) {
            System.out.println("File MAIN not found...");
            return;
        }

        // -> "File MAIN not found..."

    }

}


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

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

TLDR: записи jar не являются файлами.

Файл jar - это файл - примечание «a» означает «один».JAR-файл обычно создается путем взятия нескольких файлов (часто до сотен, тысяч или более), обычно, по крайней мере, некоторые из них являются файлами классов Java (скомпилированных), (обычно) сжимая данные из каждого и записывая (сжатые данные и имя для каждого файла в виде записи в банке.Однако возможно, что запись в банке не пришла из файла;например, запись манифеста часто создается «в поле», а не читается из файла, а для подписанного фляги всегда есть записи подписи.Но даже для записей jar, которые создаются из файлов, сами записи jar являются , а не файлами, и к ним нельзя получить доступ как к файлам с использованием базового доступа к файлам перед NIO.

У вас есть три варианта.

  1. Для jar в пути к классам - что, очевидно, ваш jar, поскольку вы нашли его как источник для загруженного класса, ClassLoaderпозволяет читать любую запись как «ресурс».Обычно он используется для таких вещей, как изображения, аудио, видео или другие данные, упакованные в банку с приложением, но он работает с записями, которые являются файлами классов.
    // you can invoke it based on a known class like
    InputStream is = Main.class.getResourceAsStream("path/for/package/Foo.class");
    // or globally
    InputStream is = ClassLoader.getResourceAsStream("path/for/package/Foo.class");

jar-файлы на самом деле являются zip-файлами «снизу», и Java уже давно позволяет вам получать доступ к zip-файлам, используя java.io.ZipFile (напрямую) или java.io.ZipInputStream (наслоение на FileInputStream).Первый позволяет получить доступ к записям «случайным образом» с помощью так называемого центрального каталога, тогда как второй требует, чтобы вы обращались к записям в порядке их появления в файле (и работает с неисследуемыми базовыми формами файлов, такими как каналы и соединения с сокетами, но выздесь это не нужно), что делает его немного менее удобным для вашей цели, но все же работоспособным.См. Javadoc.

NIO в Java 7 и выше (и почти все должны быть там сейчас) добавляет поддержку альтернативных файловых систем, которые предоставляют файловую (или, по крайней мере, потоковую)как) доступ к вещам, отличным от реальных файлов, поддерживаемых базовой операционной системой или ее файловой системой (-ами).И хотя может быть добавлено еще больше, он поставляется с одним уже установленным альтернативным провайдером, который обрабатывает файлы jar (на самом деле почтовые индексы) - так, как вы хотите.

    String jarname = Main.class.getProtectionDomain().getCodeSource().getLocation().getPath();
    FileSystem fs = FileSystems.newFileSystem(Paths.get(jarname), null);
    InputStream is = Files.newInputStream(fs.getPath("package/Foo.class"));

Обратите внимание, что во всех случаях я открыл InputStream, а не Reader (или Scanner).Считыватель и сканер предназначены для текста, состоящего из символов, и в большинстве случаев строк (которые по определению содержат символы).Файлы классов имеют некоторые символы здесь и там, но в основном это не символы и, следовательно, не текст;они должны быть прочитаны и обработаны как двоичные (с несколькими частями, которые при желании преобразуются в символы).Веселитесь.

0 голосов
/ 19 сентября 2019

Если вы хотите добавить и получить доступ к файлу jar внутри java-программы, вы должны импортировать java-классы, которые содержит этот jar-файл, и использовать их методы. Вы должны написать что-то вроде import prog.mainclass в начале вашей программы, а не пытатьсядоступ к нему через Jar.

По тому, что вы сейчас спрашиваете, причина, по которой ваша программа не может найти jar, заключается в том, что импортированный вами путь недопустим. Java не может искать внутри любой программы, но только внутрифайловая система. Любой путь должен быть без точек, таких как C:/temp/path, и не может быть, например, C:/temp.csv/path

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...