2013-09-03 6 views
1

У меня проблема с BufferedWriter. Я читаю в 50 000 слов wordlist, используя алгоритм создания и создания нового словаря, который содержит только слова. Вместо этого новый файл, содержащий любые стебли, однако он litrally содержит только:Java BufferedWriter не работает

-

Вот мой код:

public static void main(String[] args) { 
    BufferedReader reader=null; 
    BufferedWriter writer=null; 
    try { 
     writer = new BufferedWriter(new FileWriter(new File("src/newwordlist.txt"))); 
     HashSet<String> db = new HashSet<String>(); 
     reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/wordlist"),"UTF-8")); 
     String word; 
     int i=0; 
     while ((word=reader.readLine())!=null) { 
      i++; 
      Stemmer s= new Stemmer(); 
      s.addword(word); 
      s.stem(); 
      String stem =s.toString(); 
      if(!db.contains(stem)){ 
       db.add(stem); 
       writer.write(stem); 
       //System.out.println(stem); 
      } 
     } 
     System.out.println("Reduced file from " + i + " words to " + db.size()); 
     reader.close(); 
     writer.close(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
} 

Выход я получить на консоли:

Reduced file from 58110 words to 28201

Так Я знаю его работу. Ive также попытался изменить writer.write(stem); на writer.write("hi");, и я все равно получаю тот же результат в newwordlist.txt. Я знаю, что это не ошибка класса Stemmer, Ive попытался вывести строку стека (где я прокомментировал код), и это привело к правильному выводу на консоль, так что ошибка должна быть у писателя, но я не понимаю, что.


Edit 1

Я упрощена закодировать в:

 BufferedReader reader=null; 
     BufferedWriter writer=null; 
     try { 
      writer = new BufferedWriter(new FileWriter(new File("src/newwordlist.txt"))); 
      HashSet<String> db = new HashSet<String>(); 
      reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/wordlist.txt"),"UTF-8")); 
      String word; 
      int i=0; 
      while ((word=reader.readLine())!=null) { 
       i++; 
       if(!db.contains(word)){ 
        db.add(word); 
        writer.write("hi"); 
       } 
      } 
      System.out.println("Reduced file from " + i + " words to " + db.size()); 
      reader.close(); 
      writer.close(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

Теперь я получаю консольный вывод:

Reduced file from 58110 words to 58109 

Но выходной файл остается пустым

+0

Я предлагаю вам упростить код еще дальше. Если вы * просто * откройте писателя, напишите «привет» и закройте его (не читая ничего), что происходит? –

+0

Попробуйте использовать writer.flush() перед закрытием. –

+0

Устранение зависимости от Stemmer полностью, и просто вывод того, что читается, имеет тот же эффект – Edd

ответ

1

Я ожидал бы код, как указано в вопросе, чтобы создать файл, который состоит из одной строки, состоящей из всех «стебли» сцепляются. (Или в версии «привет» одна строка, состоящая из «hihihi ....», повторялась много раз.)

Можно предположить, что все, что вы используете для просмотра файла, не может справиться с входным файлом который состоит из многих тысяч символов ... и без конца строки.

Изменить

writer.write(stem); 

в

writer.write(stem); 
    writer.write(EOL); 

где оконечный резистор платформы конкретной конца-строки последовательности.


Предполагая, что вы используете Java 7, было бы лучше использовать примерочный с-ресурсом, чтобы убедиться, что выходной поток всегда замкнут/покраснел, даже если есть ошибка:

public static void main(String[] args) { 
    try (BufferedReader reader = new BufferedReader(
      new InputStreamReader(new FileInputStream("src/wordlist"), "UTF-8")); 
     BufferedWriter writer = new BufferedWriter(new FileWriter(
      new File("src/newwordlist.txt"))); 
     HashSet<String> db = new HashSet<>(); 
     String EOL = System.getProperty("line.separator"); 
     String word; 
     int i = 0; 
     while ((word = reader.readLine()) != null) { 
      i++; 
      Stemmer s = new Stemmer(); 
      s.addword(word); 
      s.stem(); 
      String stem = s.toString(); 
      if (db.add(stem)) { 
       writer.write(stem); 
       writer.write(EOL); 
      } 
     } 
     System.out.println("Reduced file from " + i + " words to " + db.size()); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
} 

(я убирала пару других вещей тоже ...)

1

Причина, по которой вы получаете вывод консоли Reduced file from 58110 words to 58109, состоит в том, что после цикла вы имеете только один оператор System.out.println.

Писатель должен писать слова только в выходной файл src/newwordlist.txt и не на консоль. Если вы хотите, чтобы ваша программу вывода слов в консоль добавить дополнительные System.out.println(word) после writer.write("hi");

Надеются, что это помогает ...

0

Когда я бегу отредактированного коду я получаю одну строки с

hihihihihihihihihihihihihi ............ 

Как и ожидался ,

Возможно, вы намеревались добавить символы строки новой строки.

  if(!db.contains(word)){ 
       db.add(word); 
       writer.write(word); 
       writer.write("\n"); 
      } 
+0

Я думаю, что это может быть ошибка с Eclipse. Я обязательно обновил рабочее пространство, закрою и снова открою файл для проверки, и он все еще открыл его как пустое. Однако, когда я открыл его в Проводнике Windows, я получаю тот же результат, что и вы – Edd

+0

Поскольку нет новой строки, оно может отображаться неправильно. –

+0

Я добавил новую строку, и я получаю вывод, который мне нужен – Edd

1

Работы для меня. Это ваш точный класс, вы его отредактировали перед вставкой?

wordlist;

the
cat
sat
on
the
mat

newwordlist.txt;

thecatsatonmat

Мой Stemmer просто возвращает слово, которое вы ему дали.

public class Stemmer { 

    private String word; 

    public void addword(String word) { 
     this.word = word; 
    } 

    public void stem() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public String toString() { 
     return word; 
    } 

} 
1

Согласно Java documentation вам нужно использовать BufferedWriter.write() следующим образом:

write(string,offset,length); 

так попробовать:

writer.write(stem,0,stem.length());