[英]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.