我想將資源檔案夾中的文本檔案包含到 Jar 檔案中。這是最小的例子:
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 );
}
}
}
這是 test.txt 檔案中的內容:
hello
world
這是我的專案的樣子:

我可以成功運行代碼。我生成Jar的方式如下:

我已經通過單擊“ ”符號添加了資源檔案夾。但是,當我呼叫生成的 Jar 檔案時,它仍然在抱怨 FileNotFoundException。
有什么建議?
uj5u.com熱心網友回復:
new File代表一個檔案。就像一個檔案。jar 檔案中的條目不是檔案。
您的代碼無法用于您想做的事情。
檔案是錯誤的抽象。您想要InputStream或可能需要 URL,這兩者都可以表示檔案、網路流、動態生成的內容,以及,是的,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);
}
}
該代碼段中發生了一些事情:
- 使用
ThisClass.class,不是getClass()。當您創建子類時, getClass 路由會中斷。你可能不會在這里這樣做,但你以后可能會這樣做;最好撰寫在同樣短的情況下始終有效的代碼。 - 這是一個資源,你必須關閉它。因此,此代碼使用 try-with-resources。
- 我們得到一個 InputStream(
getResourceAsStream回傳一個 inputstream),這是正確的抽象級別,可以表示 jar 中的條目(而File它不能這樣做)。 - 我們告訴掃描器字符集編碼是什么。否則,您將獲得平臺默認值,這是錯誤且令人討厭的:在您自己的計算機上它始終可以作業,然后您在另一個系統上運行它卻失敗了。始終,始終在位元組轉換為字符時指定字符集編碼(反之亦然)。
e.printStackTrace()是邪惡的。永遠不要那樣處理例外。如果你不知道(這很公平;如果這會引發 IOEx,顯然有些事情是嚴重錯誤的,最好讓你的應用程式崩潰時盡可能多的細節) - 以上是正確的處理方式它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368616.html
