2013-12-12 2 views
1

Может ли кто-нибудь дать мне, что здесь может быть не так?Что здесь может быть неправильным?

import java.io.BufferedInputStream; 
    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.Arrays; 
    import java.io.IOException; 

    public class TopWordsFinder { 

     /** 
     * Map of <word length, <word content, count in text>> Use some different, or 
     * even multiple data structures if it makes more sense to you. 
     */ 
     Map<Integer, Map<String, Integer>> wordsByLength = new HashMap<>(); 

     public static void main(String[] args) { 
     new TopWordsFinder().findTopWords(); 
     } 

     private void findTopWords() { 
     readWords(); // Read words to data structure 
     printTopWords(); // Print words from data structure 
     } 

     // Reads words from file and stores in some data structure 
     // Make sure to check the definition of word in context of this puzzle in 
     // class javadoc 
    private void readWords() { 
     BufferedInputStream in = new BufferedInputStream(TopWordsFinder.class.getResourceAsStream("c:/book-text.txt")); 
     StringBuilder word = new StringBuilder(""); 
     try{ 
      while (in.available() > 0) { 
       char c = (char) in.read(); 
       if(Character.isAlphabetic(c)){ 
        if(Character.isUpperCase(c)){ 
         c = Character.toLowerCase(c); 
        } 
        word.append(c); 
       }else{ 
        saveWord(word.toString()); 
        word.delete(0, word.length()-1);// Reset the sequence 
       } 
      } 
     } catch (IOException e) { 
      System.out.println("Error: "+e); 
     } 
    } 
private void printTopWords() { 
     Integer[] lengths = wordsByLength.keySet().toArray(new Integer[wordsByLength.keySet().size()]); 
     Arrays.sort(lengths); 
     for(int i = lengths.length-1; i>=0; i--){ 
      for(String word : wordsByLength.get(lengths[i]).keySet()){ 
       if(wordsByLength.get(lengths[i]).get(word) >= 3){ 
        System.out.println("Sõna: "+word+" sõna pikkus: "+word.length()+" kordusi: "+wordsByLength.get(lengths[i]).get(word)); 
        return; 
       } 
      } 
     } 
    } 

private void saveWord(String word) { 
    // FILL IN HERE: Store word in data structure you chose 
     if(wordsByLength.get(word.length()) == null){ 
      wordsByLength.put(word.length(), new HashMap<String, Integer>()); 
     } 
     if(wordsByLength.get(word.length()) == null){ 
      wordsByLength.get(word.length()).put(word, 1); 
     }else{ 
      int n = wordsByLength.get(word.length()).get(word); 
      wordsByLength.get(word.length()).put(word, ++n); 
     } 
    } 
} 

Это моя ява работа, но я получаю Error: java.io.IOException: Stream closed.

+0

Пожалуйста, разместить код здесь, а не ссылку на него, а также объяснить, что именно эта проблема. – SudoRahul

+0

Я не знаю, как публиковать обычный текст здесь –

+0

Где вы можете получить эту ошибку? – Hitman

ответ

0

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

BufferedInputStream in = new BufferedInputStream(TopWordsFinder.class.getResourceAsStream("c:/book-text.txt")); 

Что-то вроде

finally 
{ 
    in.close(); 
} 

Проверьте здесь для получения более подробной информации: http://www.javapractices.com/topic/TopicAction.do?Id=8

1

Вот ваше исключение IO

}catch (IOException e) { 
    System.out.println("Error: "+e); 
} 

Ваш char c = (char) in.read(); может бросить его когда либо поток само повреждено или так произошла ошибка во время чтения данных, то есть исключений безопасности, разрешенных прав и т. д. и/или набора Исключений, которые получены из IOEXception.

Чтобы знать лучше, вы должны использовать System.out.println("Error: " +e.getMessage()) в вашем catch block

0

Моя догадка Проблема заключается в in.avaialble() метода.

от doc

IOException происходит в этом способе, если этот входной поток был закрыт , вызывая его метод Close(), или происходит ошибка ввода/вывода.

но вы не закрываете поток. поэтому я думаю, что проблема в линии

BufferedInputStream in = new BufferedInputStream(TopWordsFinder.class.getResourceAsStream("c:/book-text.txt")); 

проверить, если ваш путь к файлу в порядке или есть другая проблема в этой строке.

и всегда закрыть поток после завершения задания (prefereable в finally блоке)

0

Я думаю, что вы можете использовать сканер вместо этого, ваш код будет легче читать, как это

private void readWords() { 
    FileInputStream in = new FileInputStream("c:/book-text.txt"); 
    Scanner scanner = new Scanner(in); 
    try { 
    while (scanner.hasNext()) { 
     String word = scanner.next(); 
     if (word != null) { 
     saveWord(word.toLowerCase()); 
     } else { 
     break; 
     } 
    } 
    } catch (IOException e) { 
    System.out.println("Error: " + e.getMessage()); 
    e.printStackTrace(); 
    } finally { 
    scanner.close(); 
    } 
} 
+0

Я сделал это, и теперь я получаю это: исключения в потоке «основного» java.lang.NullPointerException \t на TopWordsFinder.saveWord (TopWordsFinder.java:74) \t в TopWordsFinder.readWords (TopWordsFinder.java:47) \t at TopWordsFinder.findTopWords (TopWordsFinder.java:24) \t at TopWordsFinder.main (TopWordsFinder.java:19) –

+0

Отредактировано, чтобы добавить чек для null. Что в вашем файле? –

+0

Это просто обычная электронная книга. Задача - найти самое длинное слово и сколько раз я получаю это –

0

Вы должны использовать: -

FileInputStream fin = new FileInputStream("c:/book-text.txt"); 
BufferedInputStream in = new BufferedInputStream(fin); 
0

Вы получаете сообщение об ошибке от блока следующей попытки прилова

}catch (IOException e) { 
    System.out.println("Error: "+e); 
} 

Причина: Вы не проверяли, правильно ли был открыт файл. Поместите код, чтобы открыть файл в примерочных поймать блок, и если файл не открывается правильно:

private void readWords() { 
     FileInputStream fis = null; 
     BufferedInputStream in = null; 

     try { 
      fis = new FileInputStream(new File("c:/book-text.txt")); 
      in = new BufferedInputStream(fis); 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
      return; // unable to open file, so should not proceed further in 
        // readWords 
     } 

Кроме того, вам нужно исправить код в saveWord метода, поскольку эта строка нулевой проверка не является правильным:

if(wordsByLength.get(word.length()) == null){ 
} 
if(wordsByLength.get(word.length()) == null){ 
} else {} 

Оно должно быть:

private void saveWord(String word) { 
    // FILL IN HERE: Store word in data structure you chose 
    if (wordsByLength.get(word.length()) == null) { 
     wordsByLength.put(word.length(), new HashMap<String, Integer>()); 
     wordsByLength.get(word.length()).put(word, 1); 
    } else { 
     int n = wordsByLength.get(word.length()).get(word); 
     wordsByLength.get(word.length()).put(word, ++n); 
    } 
} 
Смежные вопросы