线程“main”中的奇怪异常java.io.FileNotFoundException I / O Java

时间:2012-03-31 05:39:10

标签: java file-io filenotfoundexception

我在尝试阅读文件时遇到此错误:

Exception in thread "main" java.io.FileNotFoundException: \src\product.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:120)
at dao.Inventory.readFile(Inventory.java:30)
at view.InventoryView.init(InventoryView.java:33)
at view.InventoryView.<init>(InventoryView.java:21)
at view.InventoryView.main(InventoryView.java:211)

但问题是,我的src文件夹中有product.txt。

我的代码如下:

  public void readFile() throws IOException {
            // input file must be supplied in the first argument
            InputStream istream;
                    File inputFile = new File("\\src\\product.txt");
                    istream = new FileInputStream(inputFile);

                    BufferedReader lineReader;
                lineReader = new BufferedReader(new InputStreamReader(istream));
                    String line;

                        while ((line = lineReader.readLine()) != null) {

                StringTokenizer tokens = new StringTokenizer(line, "\t");

                // String tmp = tokens.nextToken();
                // System.out.println("token " + tmp);
                ActionProduct p = new ActionProduct();
                prodlist.add(p);
                String category = p.getCategory();
                category = tokens.nextToken();
                System.out.println("got category " +category);

                int item = p.getItem();
                item = Integer.parseInt(tokens.nextToken());

                String name = p.getName();
                System.out.println("got name " +name);

                double price = p.getPrice();
                price = Double.parseDouble(tokens.nextToken());

                int units = p.getUnits();
                units = Integer.parseInt(tokens.nextToken());
            }
        }

我认为我的代码没有任何问题。另外,我看到一篇关于像FILE.TXT.TXT这样的隐藏扩展的类似帖子,你如何在MacOSX中展示一个隐藏的扩展?有什么建议? (除了隐藏的扩展问题之外还有其他问题吗?)

3 个答案:

答案 0 :(得分:6)

/src/product.txt是绝对路径,因此程序将尝试在根路径(/)的src文件夹中找到该文件。使用src/product.txt以便程序将其用作相对路径。

答案 1 :(得分:1)

有可能(最有可能的是)你的Java代码没有在src的父文件夹中执行,而是在带有编译的java .class文件的'class'或'bin'文件夹中执行。

假设'src'和'bin'在同一目录中,您可以尝试..\\src\\product.txt

另见http://en.wikipedia.org/wiki/Path_(computing

答案 2 :(得分:1)

  1. 正如其他评论者所说,这条路是绝对的,并指向 \ src \ product.txt这是(希望)不在哪里 您的来源已存储。

  2. 应使用与OS无关的方式设置路径分隔符     System.getProperty(“path.separator”)属性。在Unix系统上,您将遇到硬编码反斜杠作为路径分隔符的问题。保持便携性!

  3. String pathSeparator = System.getProperty("path.separator");
    String filePath = "." + pathSeparator + "src" + pathSeparator + "product.txt";
    File file = new File(filePath);
    

    或更好:

    // this could reside in a non-instantiable helper class somewhere in your project
    public static String getRelativePath(String... pathElements) {
        StringBuilder builder = new StringBuilder(".");
        for (String pathElement : pathElements) {
            builder.append(System.getProperty("path.separator");
            builder.append(pathElement);
        }
        return builder.toString();
    }
    
    // this is where your code needs a path
    ...
    new File(getRelativePath("src", "product.txt");
    ...