Cómo crear un archivo Jar que incluir archivos externos

0

Pregunta

Quiero incluir el archivo de texto en la carpeta de recursos para el archivo Jar. Aquí está el ejemplo mínimo:

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 );
        }
    }
}

Aquí es lo que está en el test.txt archivo:

hello
world

Esta es la forma en que mi proyecto se ve como:

enter image description here

Puedo ejecutar correctamente el código. La forma en que me genera Frasco es como sigue:

enter image description here

Ya he agregado los recursos de la carpeta haciendo clic en el signo"+". Sin embargo, cuando me llame el generado el archivo Jar, es todavía quejándose FileNotFoundException.

Alguna sugerencia?

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

Mejor respuesta

1

new File representa un Archivo. Como en, un archivo. Una entrada en un archivo jar no es un Archivo.

El código no puede trabajar por lo que quieres hacer.

El archivo es el malo de la abstracción. Quieres InputStream o, posiblemente, URL, ambos de los cuales pueden representar archivos, secuencias de la red, sobre la marcha genera cosas, y, sí, las entradas en los archivos 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);
  }
}

Un par de cosas que están pasando en ese fragmento de código:

  • Uso ThisClass.class, no getClass(). El getClass ruta se rompe cuando la subclase. No podría hacerlo aquí, pero puede que más adelante; es mejor escribir un código que siempre funciona cuando es igual de corto.
  • Es un recurso, debe cerrarlo. Este código, por lo tanto utiliza intentar-con-recursos.
  • Tenemos un InputStream (getResourceAsStream devuelve un inputstream), que es el nivel correcto de abstracción que puede representar una entrada dentro de una jarra (vs File lo que no puede hacer eso).
  • Nos dicen que el escáner lo que el juego de caracteres de codificación. De lo contrario se obtiene de la plataforma por defecto, que es malo y lo feo: En su propio equipo que va a trabajar, entonces se ejecuta en otro sistema y se produce un error. Siempre, siempre especificar el juego de caracteres de codificación en cualquier momento bytes se convierten en caracteres (o viceversa).
  • e.printStackTrace() es el mal. No vuelvas a manejar las excepciones de esa manera. Si usted no tiene ninguna idea (y eso es justo aquí; si esto arroja IOEx, es evidente que algo está mal y es una buena idea para que tu aplicación solo accidente con tanto detalle como sea posible) - la de arriba es la forma correcta de tratar con él.
2021-11-18 02:07:53

En otros idiomas

Esta página está en otros idiomas

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