Как получить путь к документу внутри .jar при весенней загрузке? [Дубликат]

У меня была эта проблема, даже когда я указал правильную версию minSDK и targetSDK. Моя проблема заключалась в том, что я использовал "android:theme="@android:style/Theme.NoTitleBar.Fullscreen" в активности запуска, на устройстве Jellybean. Когда я удалил этот атрибут, он сработал.

0
задан coders 19 March 2019 в 11:11
поделиться

2 ответа

(Внимание: вы жестко программируете "Brochure.pdf" и полностью игнорируете filePath в своем цикле. Я предполагаю, что вы намеревались присоединить каждое значение filePath.)

Как вы можете видеть в документации для метода attachFile аргумент String должен быть допустимым именем файла.

Преобразование байтов в InputStream в строку, безусловно, не приведет к имени файла.

Ресурс в .jar не является файлом. Это часть файла .jar, а не отдельный файл.

Вам нужно будет вручную установить содержимое и имя файла MimeBodyPart вместо использования attachFile:

URL content = GenericMailClient.class.getResource("/" + filePath);
attachPart.setDataHandler(new DataHandler(content));

URI uri = content.toURI();
String path = uri.getPath();
String fileName = path.substring(path.lastIndexOf('/') + 1);

attachPart.setDisposition(Part.ATTACHMENT);
attachPath.setFileName(fileName);

( Не пытайтесь использовать метод URL getFile ()). Метод getFile () не будет не возвращать правильное имя файла, поскольку URL-адрес не будет URL-адресом file:, а также потому, что символы, которые не допускаются непосредственно в URL-адресах (например, пробелы), будут быть в процентах. С другой стороны, класс URI правильно анализирует компоненты URI и возвращает их неэкранированные формы.)

0
ответ дан VGR 19 March 2019 в 11:11
поделиться

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

Это потому, что я столкнулся с той же ошибкой, что и вы, когда я использовал эту строку.

getClass().getClassLoader().getResource("Brochure.pdf")

Итак, я создал две функции, которые принимают имя файла и пути к классам, включенные в jar, и рекурсивно искали файл.

  private static File findConfigFile(String paths, String configFilename) {
    for (String p : paths.split(File.pathSeparator)) {
      File result = findConfigFile(new File(p), configFilename);
      if (result != null) {
        return result;
      }
    }
    return null;
  }

  private static File findConfigFile(File path,  String configFilename) {
    if (path.isDirectory()) {
      String[] subPaths = path.list();
      if (subPaths == null) {
        return null;
      }
      for (String sp : subPaths) {
        File subPath = new File(path.getAbsoluteFile() + "/" + sp);
        File result = findConfigFile(subPath, configFilename);
        if (result != null && result.getName().equalsIgnoreCase(configFilename)) {
          return result;
        }
      }
      return null;
    } else {
      File file = path;
      if (file.getName().equalsIgnoreCase(configFilename)) {
        return file;
      }
      return null;
    }
  }

Вот пример моего кода в действии:

import java.io.File;

public class FindResourcesRecursive {

    public File findConfigFile(String paths, String configFilename) {
        for (String p : paths.split(File.pathSeparator)) {
            File result = findConfigFile(new File(p), configFilename);
            if (result != null) {
                return result;
            }
        }
        return null;
    }

    private File findConfigFile(File path, String configFilename) {
        if (path.isDirectory()) {
            String[] subPaths = path.list();
            if (subPaths == null) {
                return null;
            }
            for (String sp : subPaths) {
                File subPath = new File(path.getAbsoluteFile() + "/" + sp);
                File result = findConfigFile(subPath, configFilename);
                if (result != null && result.getName().equalsIgnoreCase(configFilename)) {
                    return result;
                }
            }
            return null;
        } else {
            File file = path;
            if (file.getName().equalsIgnoreCase(configFilename)) {
                return file;
            }
            return null;
        }
    }

}

Здесь у меня есть тестовый пример, который связан с файлом «test.txt» в моей папке test / resources. Содержимое указанного файла:

A sample file

Теперь вот мой тестовый пример:

import org.junit.Test;

import java.io.*;

import static org.junit.Assert.fail;

public class FindResourcesRecursiveTest {

    @Test
    public void testFindFile() {
        // Here in the test resources I have a file "test.txt"
        // Inside it is a string "A sample file"
        // My Unit Test will use the class FindResourcesRecursive to find the file and print out the results.
        File testFile = new FindResourcesRecursive().findConfigFile(
                System.getProperty("java.class.path"),
                "test.txt"
        );

        try (FileInputStream is = new FileInputStream(testFile)) {
            int i;
            while ((i = is.read()) != -1) {
                System.out.print((char) i);
            }
            System.out.println();
        } catch (IOException e) {
            fail();
        }

    }
}

Теперь, если вы запустите этот тест, он напечатает «Пример файла» и тест будет зеленым.

Теперь, с тобой все в порядке?

0
ответ дан David Latief Budiman 19 March 2019 в 11:11
поделиться
Другие вопросы по тегам:

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