ImageIO.read не может найти файлы, которые перемещаются во вложенную папку [дубликат]

Я, наконец, получил это самостоятельно после некоторого чтения. Трудно, когда вы ничего не знаете о javascript и когда документ довольно тонкий по этому вопросу. Вот мое решение, надеюсь, что это поможет другим:

С HTML-страницей, содержащей две кнопки в конце:

<div>
     <button type="button" id="ok" style="font-weight: 700; margin-right: 20px;" onclick="validClick();">J'accepte</button>
     <button type="button" id="no" onclick="refuseClick();">Je refuse</button>
</div>

Я отправляю событие щелчка на javascript в верхней части моей HTML-страницы:

<script language="javascript">

   function validClick()
   {
      valid.performClick();
      document.getElementById("ok").value = "J'accepte";
   }
   function refuseClick()
   {
      refuse.performClick();
      document.getElementById("no").value = "Je refuse";
   }

</script>

valid и refuse - это два java-объекта, которые я прошел через интерфейс javascript, чтобы использовать их методы. Таким образом, в java я создал две кнопки (не отображаемые в Activity, только здесь для их методов и являются тенями кнопок HTML:

valid = new Button(ctx);
valid.setOnClickListener(this);
refuse = new Button(ctx);
refuse.setOnClickListener(this);

Затем я добавил javascript к своему WebView :

// Enablejavascript
WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
// Add the interface to record javascript events
wv.addJavascriptInterface(valid, "valid");
wv.addJavascriptInterface(refuse, "refuse");

И, наконец, обработайте события щелчка в методе onClick:

@Override
public void onClick(View v) {
    if (v.equals(valid)) {
        //do Something
    } else if (v.equals(refuse)) {
        //do Something else }
}

Надеюсь, это поможет некоторым людям

54
задан Chris 10 November 2015 в 18:50
поделиться

5 ответов

Если вы хотите прочитать этот файл из вашего приложения, используйте:

InputStream input = getClass().getResourceAsStream("/classpath/to/my/file");

Путь начинается с «/», но это не путь в вашей файловой системе, а в вашем пути к классам , Поэтому, если ваш файл находится в пути к классам «org.xml» и называется myxml.xml, ваш путь выглядит так: «/org/xml/myxml.xml".

InputStream считывает содержимое вашего файла. Вы можете поместить его в Reader, если хотите.

Надеюсь, что это поможет.

103
ответ дан Chris 15 August 2018 в 17:53
поделиться
  • 1
    +1 для объяснения, почему ведущий & quot; / & quot; необходимо. – Thorbjørn Ravn Andersen 30 July 2010 в 10:30

Сначала проверьте загрузчик вашего класса.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

if (classLoader == null) {
    classLoader = Class.class.getClassLoader();
}

classLoader.getResourceAsStream("xmlFileNameInJarFile.xml");

// xml file location at xxx.jar
// + folder
// + folder
// xmlFileNameInJarFile.xml
8
ответ дан hothead 15 August 2018 в 17:53
поделиться

Ах, это один из моих любимых предметов. Существует два способа загрузки ресурса через путь к классам:

Class.getResourceAsStream(resource)

и

ClassLoader.getResourceAsStream(resource)

(существуют другие способы, связанные с получением URL-адреса ресурса в аналогичным образом, затем открывая соединение с ним, но это два прямых способа).

Первый метод на самом деле делегирует второй, после изменения имени ресурса. Существует, по существу, два типа имен ресурсов: абсолютный (например, «/ path / to / resource / resource») и относительный (например, «ресурс»). Абсолютные пути начинаются с «/».

Вот пример, который следует проиллюстрировать. Рассмотрим класс com.example.A. Рассмотрим два ресурса, один из которых находится в / com / example / nested, другой в / top, в пути к классам. Следующая программа показывает девять возможных способов доступа к двум ресурсам:

package com.example;

public class A {

    public static void main(String args[]) {

        // Class.getResourceAsStream
        Object resource = A.class.getResourceAsStream("nested");
        System.out.println("1: A.class nested=" + resource);

        resource = A.class.getResourceAsStream("/com/example/nested");
        System.out.println("2: A.class /com/example/nested=" + resource);

        resource = A.class.getResourceAsStream("top");
        System.out.println("3: A.class top=" + resource);

        resource = A.class.getResourceAsStream("/top");
        System.out.println("4: A.class /top=" + resource);

        // ClassLoader.getResourceAsStream
        ClassLoader cl = A.class.getClassLoader();
        resource = cl.getResourceAsStream("nested");        
        System.out.println("5: cl nested=" + resource);

        resource = cl.getResourceAsStream("/com/example/nested");
        System.out.println("6: cl /com/example/nested=" + resource);
        resource = cl.getResourceAsStream("com/example/nested");
        System.out.println("7: cl com/example/nested=" + resource);

        resource = cl.getResourceAsStream("top");
        System.out.println("8: cl top=" + resource);

        resource = cl.getResourceAsStream("/top");
        System.out.println("9: cl /top=" + resource);
    }

}

Выход из программы:

1: A.class nested=java.io.BufferedInputStream@19821f
2: A.class /com/example/nested=java.io.BufferedInputStream@addbf1
3: A.class top=null
4: A.class /top=java.io.BufferedInputStream@42e816
5: cl nested=null
6: cl /com/example/nested=null
7: cl com/example/nested=java.io.BufferedInputStream@9304b1
8: cl top=java.io.BufferedInputStream@190d11
9: cl /top=null

В основном все делает то, что вы ожидаете. Случай-3 выходит из строя из-за относительного разрешения класса относительно класса, поэтому «top» означает «/ com / example / top», но «/ top» означает то, что он говорит.

Случай-5 не работает поскольку относительное разрешение класса loader относится к загрузчику классов. Но неожиданно Case-6 также терпит неудачу: можно было бы ожидать, что «/ com / example / nested» будет корректно разрешаться. Чтобы получить доступ к вложенному ресурсу через загрузчик классов, вам необходимо использовать Case-7, то есть вложенный путь относится к корню загрузчика классов. Аналогично, случай-9 выходит из строя, но Case-8 проходит.

Помните: для java.lang.Class getResourceAsStream () делегирует загрузчик классов:

     public InputStream getResourceAsStream(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResourceAsStream(name);
        }
        return cl.getResourceAsStream(name);
    }

, поэтому он поведение resolveName () важно.

Наконец, поскольку поведение загрузчика классов загружает класс, который по существу управляет getResourceAsStream (), а загрузчик классов часто является пользовательским загрузчиком, тогда правила загрузки ресурсов могут быть еще более сложными. например для веб-приложений, загрузки с WEB-INF / classes или WEB-INF / lib в контексте веб-приложения, но не из других изолированных веб-приложений. Кроме того, хорошо управляемые загрузчики классов передают родителям, так что дублированные ресурсы в пути к классам могут быть недоступны с помощью этого механизма.

51
ответ дан smac89 15 August 2018 в 17:53
поделиться

JAR - это в основном ZIP-файл, поэтому рассматривайте его как таковой. Ниже приведен пример того, как извлечь один файл из WAR-файла (также рассматривать его как ZIP-файл) и выводит содержимое строки. Для двоичных файлов вам потребуется изменить процесс извлечения, но для этого есть много примеров.

public static void main(String args[]) {
    String relativeFilePath = "style/someCSSFile.css";
    String zipFilePath = "/someDirectory/someWarFile.war";
    String contents = readZipFile(zipFilePath,relativeFilePath);
    System.out.println(contents);
}

public static String readZipFile(String zipFilePath, String relativeFilePath) {
    try {
        ZipFile zipFile = new ZipFile(zipFilePath);
        Enumeration<? extends ZipEntry> e = zipFile.entries();

        while (e.hasMoreElements()) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            // if the entry is not directory and matches relative file then extract it
            if (!entry.isDirectory() && entry.getName().equals(relativeFilePath)) {
                BufferedInputStream bis = new BufferedInputStream(
                        zipFile.getInputStream(entry));
                // Read the file
                    // With Apache Commons I/O
                 String fileContentsStr = IOUtils.toString(bis, "UTF-8");

                    // With Guava
                //String fileContentsStr = new String(ByteStreams.toByteArray(bis),Charsets.UTF_8);
                // close the input stream.
                bis.close();
                return fileContentsStr;
            } else {
                continue;
            }
        }
    } catch (IOException e) {
        logger.error("IOError :" + e);
        e.printStackTrace();
    }
    return null;
}

В этом примере я использую Apache Commons I / O, и если вы используете Maven здесь, это зависимость:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
2
ответ дан Tristan Everitt 15 August 2018 в 17:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: