Harici dosyaları içeren bir Jar dosyası nasıl oluşturulur

0

Soru

Kaynaklar klasöründeki metin dosyasını Jar dosyasına eklemek istiyorum. İşte en az örnek:

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

Testte olan şu.txt dosyası:

hello
world

Projem böyle görünüyor:

enter image description here

Kodu başarıyla çalıştırabilirim. Jar oluşturma şeklim aşağıdaki gibidir:

enter image description here

"+" sembolüne tıklayarak kaynaklar klasörünü zaten ekledim. Ancak, oluşturulan Jar dosyasını çağırdığımda, hala FileNotFoundException şikayet ediyor.

Herhangi bir öneriniz var mı?

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

En iyi cevabı

1

new File bir Dosyayı temsil eder. Gibi, bir dosya. Bir jar dosyasındaki bir girdi bir Dosya değildir.

Kodunuz yapmak istediğiniz şey için çalışamaz.

Dosya yanlış soyutlamadır. İstiyorsun InputStream ya da her ikisi de dosyaları, ağ akışlarını, anında oluşturulan şeyleri ve evet, jar dosyalarındaki girdileri temsil edebilen URL.

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

Bu snippet'te birkaç şey oluyor:

  • Kullanmak ThisClass.class, değil getClass(). Alt sınıf, getClass yol keser. Bunu burada yapmayabilirsiniz, ancak daha sonra yapabilirsiniz; kısa olduğunda her zaman işe yarayan kod yazmak daha iyidir.
  • Bu bir kaynak, kapatmalısın. Bu nedenle, bu kod kaynaklarla deneme'yi kullanır.
  • Bir İnputStream olsun (getResourceAsStream bir kavanozun içindeki bir girişi temsil edebilecek doğru soyutlama düzeyi olan bir inputstream döndürür (vs File bu sadece bunu yapamaz).
  • Tarayıcıya karakter kümesi kodlamasının ne olduğunu söyleriz. Aksi takdirde, yanlış ve kötü olan platform varsayılanını alırsınız: Kendi bilgisayarınızda her zaman çalışır, sonra başka bir sistemde çalıştırırsınız ve başarısız olur. Her zaman, baytların karakterlere dönüştürüldüğü her zaman karakter kümesi kodlamasını belirtin (veya tersi).
  • e.printStackTrace() kötü. Hiç böyle özel durumlar işlemek yok. Hiçbir fikriniz yoksa (ve bu burada adil; eğer bu ioex'i atarsa, açıkça bir şeylerin yanlış olduğu ve uygulamanızın mümkün olduğunca fazla ayrıntıyla çökmesi iyi bir fikirdir) - yukarıdakiler bununla başa çıkmanın doğru yoludur.
2021-11-18 02:07:53

Diğer dillerde

Bu sayfa diğer dillerde

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