Возникли проблемы при открытии файла в Java - PullRequest
1 голос
/ 27 августа 2010

Я пытаюсь открыть этот файл в Java, и я хочу знать, что я делаю неправильно. Входной файл находится в том же каталоге, что и мой 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 ]

1 голос
/ 27 августа 2010

Обычная практика - помещать ресурсы в путь к классу времени выполнения или добавлять его путь к пути к классу времени выполнения, чтобы вы могли получить его от загрузчика классов.Использование относительных путей в 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, кстати, обязательно для снятия блокировки файла после чтения.

1 голос
/ 27 августа 2010

Несколько советов:

  1. Соблюдать правильные отступы кода
    • Если вы используете IDE, например Eclipse, он может автоматически исправить отступ для вас
  2. Развить инстинкт отладки
    • Попробуйте получить текущий рабочий каталог и перечислите все файлы в нем
  3. Рефакторинг повторяющегося кода
    • Написание парных операторов, как вы сделали, должно немедленно поднять красные флажки
  4. Effective Java 2nd Edition
    • Элемент 23: Не используйте необработанные типы в новом коде
    • Элемент 52: Ссылаться на объекты по их интерфейсам
    • Элемент 46: Предпочитайте циклы «для каждого» традиционным for циклам
  5. Использовать разумные имена переменных

Что касается 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;
}

Обратите внимание, как вместо Map<K,V> используется Set<E>. Глядя на остальную часть кода, вам, похоже, на самом деле не нужно отображение, а скорее какой-то набор (но об этом позже).

Затем вы можете получить что-то подобное в main, что делает логику очень читабельной:

    String s1 = ...;
    String s2 = ...;

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

Обратите внимание, как переменные теперь называются довольно разумно, выделяя их роли. Также обратите внимание, что эта логика не совсем определяет, что s1 является анаграммой s2 (рассмотрим, например, "abb" и "aab"), но это фактически то, что вы делали.

Так как это выглядит как домашнее задание, я предоставлю вам возможность выяснить, когда две строки являются анаграммами.

Смотри также

Смежные вопросы

1 голос
/ 27 августа 2010

Убедитесь, что файл находится в том же каталоге, что и ваш .class файл. Неважно, находится ли он в том же файле, что и ваш .java, или нет.

Кроме этого, единственная проблема, которую я вижу, - это ваш отступ, который не имеет значения.

0 голосов
/ 27 августа 2010

Поместите файл anagrams.in в то же место, что и файл .class.Тогда вы сможете прочитать файл.И это должно помочь вам получить некоторые ссылки о том, как читать файлы в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...