为什么我使用url和绝对文件名得到不同的结果?

时间:2014-10-05 15:45:36

标签: java eclipse file url getresource

我是Java的新手,面临着审查文件的问题。 我有一个名为" FileOperation"使用" boom.txt" file(位置:" FileOperation / files / boom.txt")。我想要做的是从类#34; MyTextPanel"中访问该文件。 (位置:" FileOperation / MyTextPanel.java")。

我为此创建了2种方法。一个是通过getClass.getResource(path),另一个是通过给出文件的绝对位置。第二种方法有效,首先没有。有人请解释,第一种方法的问题是什么。这是MyTextPanel类:

package FileOperaton;
import java.awt.BorderLayout;
import java.io.FileReader;
import java.net.URL;

import javax.swing.JPanel;
import javax.swing.JTextArea;


public class MyTextPanel extends JPanel {

    JTextArea textArea;
    MyTextPanel()
    {
        setLayout(new BorderLayout());
        textArea=new JTextArea();
        add(textArea,BorderLayout.CENTER);

        String fileName;
        fileName=getFileName1();
        //fileName=getFileName2();
        System.out.println("File Name = "+fileName);
        if(fileName!=null)
        {
            try {
                    FileReader fr=new FileReader(fileName);
                    System.out.println("Access Successful");
            } catch (Exception e) {
                    e.printStackTrace();
            }
        }
    }

    private String getFileName1()
    {
        URL url=getClass().getResource("/files/boom.txt");
        System.out.println("by getFileName1()");
        if(url!=null)
            return url.getFile();
        return null;
    }

    private String getFileName2()
    {
        String absolutePath="E:\\Project Eclipse\\Workspace\\FileOperation\\src\\FileOperaton\\files\\boom.txt";
        System.out.println("by getFileName2()");
        return absolutePath;
    }
}

以下是产出:

by getFileName1()
File Name =/E:/Project%20Eclipse/Workspace/FileOperation/bin/FileOperaton/files/boom.txt
java.io.FileNotFoundException: E:\Project%20Eclipse\Workspace\FileOperation\bin\FileOperaton\files\boom.txt (The system cannot find the path specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileReader.<init>(Unknown Source)
    at FileOperaton.MyTextPanel.<init>(MyTextPanel.java:32)
    at FileOperaton.MyFrame.<init>(MyFrame.java:22)
    at FileOperaton.MyFrame.main(MyFrame.java:29)

通过第二种方法:

by getFileName2()
File Name = E:\Project Eclipse\Workspace\FileOperation\src\FileOperaton\files\boom.txt
Access Successful

我还在第一种方法中尝试了url = getClass()。getResource(&#34; /files/boom.txt")但是url被指定为null。 在第二种方法中,如果我使用absolutePath =&#34; E:\ Project Eclipse \ Workspace \ FileOperation \ bin \ FileOperaton \ files \ boom.txt&#34 ;; (bin而不是src)它也会获得成功。

3 个答案:

答案 0 :(得分:0)

仔细阅读你的输出:

第一种方法:

  

E:\项目%20Eclipse \工作区\ FileOperation \ BIN \ FileOperaton \文件\ boom.txt

第二种方法:

  

E:\ Project Eclipse \ Workspace \ FileOperation \ src \ FileOperaton \ files \ boom.txt

有一次您将文件放在src文件夹中,一次放在bin文件夹中。

我建议制作第三个文件夹res并将其存储在那里(E:\Project Eclipse\Workspace\FileOperation\res\boom.txt)并加载它:

public static URL getFile (String filename)
{
    return MyTextPanel.class.getClassLoader().getResource(filename);
}

答案 1 :(得分:0)

如果文件位于FileOperation包/文件夹中,我将采取以下措施:

YourClass.class.getResource("/FileOperation/boom.txt");

当您的文件位于FileOperation / files文件夹中时,您应该执行以下操作:

YourClass.class.getResource("/FileOperation/files/boom.txt");

此外,您可以查看bin文件夹以查看boom.txt是否存在。如果没有,可能使用F5刷新项目,因此文件/ boom.txt是项目的一部分。

答案 2 :(得分:0)

好吧,我找到了解决自己问题的方法。这可能对其他人有所帮助。使用&#34;文件名进行实验:&#34;输出我发现,getFile1()和getFile2()的返回实际上只有一个&#34; sapce&#34; charecter。那是&#34; ...项目%20Eclipse ......&#34; [由getFile1()返回]和#34; ...项目Eclipse ...&#34; [由getFile2返回( )]。所以,我编辑了getFile1()方法:

private String getFileName1()
    {
        URL url=getClass().getResource("files/boom.txt");
        System.out.println("by getFileName1()");
        if(url!=null)
            return url.getFile().replaceAll("%20", " ");//<--- replace %20 by space charecter
        return null;
    }

最后它起作用了。如果有人知道,为什么url会生成%20的空格以及为什么这不起作用,那会更好。:)