2013-02-02 38 views
-1

在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中。它不在包或任何这样的附加目录中。

+3

所有的GUI代码与这个问题完全无关。 – EJP

+0

无法建立指向Jar中资源的“文件”。档案不包含任何文件。但是,它们包含可以通过URL或InputStream访问的资源。 –

回答

4

如果getResourceAsStream(String)返回null,这意味着类加载器无法找到具有您给它的名称的资源。要么是明显错误的,要么是您使用了相对名称,并且该资源不在JAR的“/”目录中。

有关详细信息,请阅读的Javadoc ClassLoader.getResourceAsStream,仔细注意:

  • 返回的值,并
  • 相对路径的处理(按照getResource链接!!)。

如果要加载使用解决相关的类包相对名称的资源,你应该这样写:

MainClass.class.getResourceAsStream(files); 

Class.getResource...方法解决相对于类相对名称。因此,上述内容将会解析"foo.txt""/mainpkg/foo.txt" ......您的版本可能会将其解析为"/foo.txt"

+0

该文件直接在项目文件夹中,我尝试了/之前,但它仍然无法正常工作。它在没有斜杠的另一个项目中工作,并且该文件位于/ foo中。txt,所以我不明白我应该怎么做才能使它适用于第二个项目。感谢您的想法,但可能是我错误地引用了它。我试图添加/和\\在它之前,但都没有工作 – user2016463

+0

我想通过InputStream stream = MainClass.class.getResourceAsStream(files);是我唯一的选择,我必须将该罐放入该包装中。没有其他选择正在工作。谢谢您的帮助! – user2016463

1

我知道这意味着该文件不被转换成一个InputStream正确

不,它不需要。这意味着找不到名为的资源。检查Javadoc。

然后根据JAR的列表检查您的帖子中有用的资源名称。

如果'stream'为空,那么您将不会继续尝试阅读并获取NPE。这只是糟糕的编程。

此外,JAR文件中的资源不是文件,并且用其名称构造文件是无意义的活动。

+0

对错误沟通感到抱歉。该文件直接在jar中。我将文件名设置为“filename.extension”。我需要在它前面添加“\\”吗?我试图将文件放在jar文件中,并将其复制到jar所在的同一目录中。 – user2016463

+0

@ user2016463您需要在其前面添加“/”。 – EJP