簡體   English   中英

從jar中讀取文件不起作用

[英]read file from inside jar Not Working

在Java中,我嘗試了不同的技術來讀取jar中的文件。 我有一個可以在另一個程序中工作,但是沒有這個程序。 我從classname.class.getClassLoader()。getResourceAsStream(filenamestring);獲得的InputStream; 方法返回null。

 package mainpkg;

 import java.awt.GridLayout;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JTextField;
 import javax.swing.UIManager;

 public class MainClass extends JFrame{
JTextField jtf = new JTextField();
boolean isInstalling = false;
public MainClass(){
    super("StringThatTitleWillBe");
}
public void initiate(){
    setLookAndFeel();
    setSize(550, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout bl = new GridLayout(2, 1, 10, 10);
    setLayout(bl);

    JButton b = new JButton("Install");
    b.addMouseListener(new MouseListener(){

        @Override
        public void mouseClicked(MouseEvent arg0) {
            if(!isInstalling){
            isInstalling = true;
            install();
            }
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {

        }

        @Override
        public void mouseExited(MouseEvent arg0) {

        }

        @Override
        public void mousePressed(MouseEvent arg0) {

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {

        }

    });
    add(b);
    jtf.setEditable(false);
    add(jtf);
    //show
    setVisible(true);
}
private void setLookAndFeel() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception exc) {
        System.out.print("failed to load look and feel");
    }
}
public static void main(String[] args){
    MainClass m = new MainClass();
    m.initiate();
}

public void install() {
    String files = "name of jarfile inside the jar to be read";
    InputStream stream = MainClass.class.getClassLoader().getResourceAsStream(files);
    File f = new File(files);
    if(stream == null)
        System.out.println("stream is null");
    try {
        int val = stream.read();
        BufferedWriter br = new BufferedWriter(new FileWriter(f));
        while(val != -1){
        br.write(val);
        val = stream.read();
        }
        stream.close();
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    isInstalling = false;
     }
 }

它打印“流是空”,並給出就行一個錯誤:stream.read(); 我知道這意味着該文件未正確轉換為InputStream。 有我犯了一個愚蠢的錯誤??? 請幫忙。 預先感謝您編輯:我要復制的文件與jar相同,位於jar內。 這不是在一個包或任何這種附加的目錄。

如果getResourceAsStream(String)返回null ,則意味着類加載器找不到具有您提供的名稱的資源。 這是完全錯誤的,或者您使用的是相對名稱,而資源不在JAR的“ /”目錄中。

有關詳細信息,請閱讀ClassLoader.getResourceAsStream的javadoc,請特別注意:

  • 返回的值,以及
  • 相對路徑名的處理(遵循getResource鏈接!)。

如果要使用相對於類包解析的相對名稱來加載資源,則應編寫以下代碼:

    MainClass.class.getResourceAsStream(files);

Class.getResource...方法解析相對於類的相對名稱。 因此,以上代碼會將"foo.txt"解析為"/mainpkg/foo.txt" ...您的版本會將其解析為"/foo.txt"

我知道這意味着該文件未正確轉換為InputStream

不,不是。 這意味着找不到命名的資源。 檢查Javadoc。

然后,根據JAR列表檢查資源名稱(該名稱已從帖子中省略了)。

如果“ stream”為空,則您無需繼續嘗試讀取它並獲得NPE。 這只是糟糕的編程。

而且,JAR文件中的資源不是文件,並且使用其名稱構造文件是沒有意義的活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM