Как ссылаться на файлы в пакете Java - PullRequest
0 голосов
/ 20 июля 2010

У меня есть пакет MyClassin X, также в пакете X есть пакеты Y и Z, например:

X - MyClass
X - Y - некоторые файлы
X - Z - некоторые файлы

Как получить список всех файлов в пакетах Y и Z из MyClass?

Ответы [ 3 ]

1 голос
/ 20 июля 2010

Java-пакеты отражают структуру каталогов. Вы можете использовать класс File . В частности, см. Метод listFiles().

EDIT

Вы можете динамически находить место исполнения. Вот код из проекта, над которым я недавно работал; Я хотел найти каталог, из которого я запускаю JAR (если я запускаю JAR), или каталог из JAR, если я запускаю из файлов классов. В моем случае мой JAR находится в <project root>/bin, а мои классы в <project root>/classes.

final URL location;
final String classLocation = JavaPlanner.class.getName().replace('.', '/') + ".class";
final ClassLoader loader = JavaPlanner.class.getClassLoader();

if(loader == null)
{
    try { throw new ClassNotFoundException("class loaded with bootstrap loader"); }
    catch (ClassNotFoundException cnfe) { throw new InitializationException(cnfe); }
}
else
{
    location = loader.getResource(classLocation);
}

if(location.toString().startsWith("file:/")) // Line 14
{
    // Running from .class file
    String path;
    try { path = URLDecoder.decode(location.toString().substring(6), "UTF-8"); }
    catch(UnsupportedEncodingException uee) { throw new InitializationException(uee); }

    // Move up package folders to root, add /bin/
    File package_ = new File(path).getParentFile();
    binPath = package_.getParentFile().getParentFile().getParentFile().getParentFile() + File.separator + "bin" + File.separator;
}
else // Line 25
{
    // Running from .jar file
    String jarURL = JavaPlanner.class.getResource("/" + JavaPlanner.class.getName().replaceAll("\\.", "/") + ".class").toString();
    jarURL = jarURL.substring(4).replaceFirst("/[^/]+\\.jar!.*$", "/");

    try
    {
        File dir = new File(new URL(jarURL).toURI());
        jarURL = dir.getAbsolutePath();
    }
    catch(MalformedURLException mue) { throw new InitializationException(mue); }
    catch(URISyntaxException use) { throw new InitializationException(use); }

    binPath = jarURL;
}

В строке 14 я обнаружил, что запускаю приложение из файла класса. String path изначально задан путь к файлу JavaPlanner (класс, содержащий мой метод main). Я знаю, что структура пакета JavaPlanner находится внутри, поэтому я использую getParentFile соответствующее количество раз, чтобы найти корень проекта, а затем добавляю bin /.

В строке 25 я обнаружил, что запускаю приложение из JAR. Блок просто получает путь к папке, содержащей этот исполняемый файл JAR.

Очевидно, этот код не на 100% адаптирован к вашей цели (в частности, я звоню getParentFile определенное количество раз для моей структуры пакета), но я думаю, что это должно помочь.

Цель всего вышеприведенного кода состояла в том, чтобы найти правильные файлы ресурсов для моего приложения. В рабочей версии пользователю будет доступен только JAR, но я не хотел пересобирать JAR каждый раз, когда мне нужно было протестировать некоторый код, и я не хотел дублировать мои файлы ресурсов, и Я не хотел загрязнять мою папку bin / файлами классов (потому что все в bin / предназначалось для отправки пользователю).

0 голосов
/ 20 июля 2010
0 голосов
/ 20 июля 2010

Зависит от источника класса.Если они из файла JAR, то вы можете использовать класс JarFile , чтобы получить список записей.

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