在Java中,我嘗試了讀取jar中文件的不同技巧。我已經得到一個在另一個程序內工作,但不是這個。我從classname.class.getClassLoader()。getResourceAsStream(filenamestring)獲得的InputStream;方法返回null。從jar中讀取文件不工作
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中。它不在包或任何這樣的附加目錄中。
所有的GUI代碼與這個問題完全無關。 – EJP
無法建立指向Jar中資源的「文件」。檔案不包含任何文件。但是,它們包含可以通過URL或InputStream訪問的資源。 –