无法在Java中打开文件

时间:2010-08-27 00:57:22

标签: java file

我试图在java中打开这个文件,我想知道我做错了什么。 in文件与我的Java文件位于同一目录中,但我尝试用netbeans和eclipse打开它,它给了一个找不到文件的异常。有人可以帮我打开这个文件并从中读取。我是java文件的新手。这是代码

 import java.util.*;
    import java.io.*;

    public class Practice
    {

      public static void main(String[] args)throws IOException
      {


          FileReader fin = new FileReader("anagrams.in");
          BufferedReader br = new BufferedReader(fin);



          System.out.println(fin);


        String string = "Madam Curie";
        String test = "Radium came";

        string = string.toLowerCase();
        test = test.toLowerCase();

        string = string.replaceAll("[^a-zA-Z0-9]+", "");
        test = test.replaceAll("[^a-zA-Z0-9]+", "");

        char[] array = string.toCharArray();
        char[] array2 = test.toCharArray();

        boolean flag = false;
        HashMap hm = new HashMap();


        for(int i = 0; i < array.length; i++)
        {
            hm.put(array[i], array[i]);
        }

       for(int i = 0; i < array2.length; i++)
       {
           if(hm.get(array2[i]) == null || test.length() != string.length())
           {
               flag = false;
               i = array2.length;
           }
           else
           {
               flag = true;
           }

       }

       System.out.println(flag);
      }

    }

4 个答案:

答案 0 :(得分:1)

确保该文件与.class文件位于同一目录中。它与.java文件是否相同无关紧要。

除此之外,我能看到的唯一问题是你的缩进,这无关紧要。

答案 1 :(得分:1)

一些提示:

  1. 遵守正确的代码缩进
    • 如果您使用的是像Eclipse这样的IDE,它可以自动为您修正缩进
  2. 培养调试本能
    • 尝试获取当前工作目录,并列出其中的所有文件
  3. 重构重复代码
    • 像你一样编写配对语句应立即引发红旗
  4. Effective Java 2nd Edition
    • 第23项:不要在新代码中使用原始类型
    • 第52项:通过接口引用对象
    • 第46项:首选 - 传统for循环的每个循环
  5. 使用合理的变量名称
  6. 关于2,尝试这样的事情:

    public static void listDir() {
        File current = new File(".");
        System.out.println(current.getAbsolutePath());
        for (String filename : current.list()) {
            System.out.println(filename);
        }
    }
    

    然后在main中,只需在其他所有内容之前调用listDir,然后查看您是否从正确的目录运行应用程序,以及目录中是否有"anagrams.in"。请注意,某些平台区分大小写。

    关于3和4,考虑使用这样的辅助方法:

    static Set<Character> usedCharactersIn(String s) {
        Set<Character> set = new HashSet<Character>();
        for (char ch : s.toLowerCase().toCharArray()) {
            set.add(ch);
        }
        return set;
    }
    

    请注意Set<E>如何使用而不是Map<K,V>。看看剩下的代码,你似乎并不需要映射,而是需要一些映射(稍后会详细介绍)。

    然后你可以在main中使用这样的东西,这使得逻辑非常易读:

        String s1 = ...;
        String s2 = ...;
    
        boolean isNotQuiteAnagram = (s1.length() == s2.length()) &&
            usedCharactersIn(s1).containsAll(usedCharactersIn(s2));
    

    注意变量现在如何命名相当合理,突出显示他们的角色。另请注意,此逻辑并不能完全确定s1s2的字谜(例如"abb""aab"),但这实际上就是您正在做的事情。

    因为这看起来像是家庭作业,所以我会留意你试着找出两个字符串是字符串的时间。

    另见

    相关问题

答案 2 :(得分:1)

通常的做法是将资源放在运行时类路径中,或者将其路径添加到运行时类路径中,以便您可以通过类加载器获取它。在Java IO中使用相对路径被认为是不好的做法,因为它破坏了可移植性。相对路径将取决于您在Java代码中完全无法控制的当前工作目录。

将它放在类路径中后(假设它与Java类本身在同一个文件夹中),只需这样做:

BufferedReader reader = null;

try {
    InputStream input = Practice.class.getResourceAsStream("anagrams.in");
    reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); // Or whatever encoding it is in.

    // Process it.
    // ...
} finally {
    if (reader != null) try { reader.close(); } catch (IOException ignore) {}
}

finally中关闭是强制性的,以便在阅读后解除对文件的锁定。

答案 3 :(得分:0)

anagrams.in文件放在与.class文件相同的位置。然后,您将能够读取该文件。 this应该可以帮助您获得有关如何从Java中读取文件的链接。