Como criar um arquivo Jar que incluir arquivos externos

0

Pergunta

Eu quero incluir o arquivo de texto na pasta de recursos para o arquivo Jar. Aqui é o mínimo exemplo:

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        main.readFile( "test.txt" );
    }

    public void readFile(String fileName){
        File file = new File( getClass().getResource( fileName ).getPath() );

        try{
            Scanner scanner = new Scanner( file );
            while ( scanner.hasNextLine() ){
                System.out.println( scanner.nextLine() );
            }
        }catch (Exception e){
            System.out.println( e );
        }
    }
}

Aqui está o que o test.txt arquivo:

hello
world

Isto é como o meu projeto se parece com:

enter image description here

Eu posso executar o código com êxito. A maneira que eu Jar gerado é o seguinte:

enter image description here

Eu já adicionaram pasta de recursos clicando em "+" símbolo. No entanto, quando eu chamo o gerado o arquivo Jar, ele ainda está reclamando FileNotFoundException.

Alguma sugestão?

intellij-idea jar java
2021-11-18 02:01:21
1

Melhor resposta

1

new File representa um Arquivo. Como em um arquivo. Uma entrada em um arquivo jar não é um Arquivo.

O seu código não funciona para o que você quer fazer.

Arquivo é o errado abstração. Você quer InputStream ou, possivelmente, URL, o que pode representar arquivos, fluxos de rede, on-the-fly gerados coisas, e, sim, as entradas em arquivos jar.

public void readFile(String fileName) {
  try (var in = ThisClass.class.getResourceAsStream(fileName)) {
    Scanner scanner = new Scanner(in, StandardCharsets.UTF_8);
    // proceed here.
  } catch (IOException e) {
    throw new RuntimeException("Uncaught", e);
  }
}

Algumas coisas estão acontecendo nesse trecho:

  • Utilização ThisClass.class, não getClass(). O getClass rota quebras quando você subclasse. Você não pode fazê-lo aqui, mas você pode mais tarde; é melhor escrever código que sempre funciona quando é tão curto.
  • É um recurso, você deve fechá-lo. Este código, portanto, usa try-with-resources.
  • Temos um InputStream (getResourceAsStream retorna um inputstream), que é o nível de abstração, o que pode representar uma entrada dentro de uma jarra (vs File que simplesmente não pode fazer isso).
  • Podemos dizer que o scanner que o conjunto de caracteres de codificação. Caso contrário, você começa plataforma padrão, o que é errado e desagradável: No seu próprio computador, ele sempre vai funcionar, então você executá-lo em outro sistema e não falha. Sempre, sempre especificar o conjunto de caracteres de codificação a qualquer momento bytes são transformados em chars (ou vice-versa).
  • e.printStackTrace() é o mal. Nunca manipular exceções que forma. Se você não tem idéia (e que é justo aqui; se este lança IOEx, claramente, algo está muito errado e é uma boa idéia para o seu aplicativo falhar com o máximo de detalhes que é possível) - o acima é o caminho certo para lidar com ele.
2021-11-18 02:07:53

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................