Прочитайте символ и добавьте в буфер строку Java - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть простой текстовый файл словаря, который содержит слова, разделенные ';'. Моя проблема - прочитать все слова и сохранить их на карте без загрузки всего файла в строку (файл словаря может быть очень большим). Вот мой код, где я пытаюсь распечатать эти слова на консоли:

 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.Map;

 public class Dictionary {
private static Dictionary instance;
private Map DictionaryMap;
private String delimiter;

private Dictionary() {

}

private Dictionary(String dictfile, String delimiter) throws FileNotFoundException, IOException
{
    FileReader fr = new FileReader(dictfile);
    int position = 0;
    StringBuffer buffer = new StringBuffer();
    while ((position = fr.read()) != -1) {
        char symbol = (char) fr.read();
        if(symbol != ';') {
            buffer.append(symbol);
            System.out.println("Char is : "+symbol+" ;");
        } else {
            System.out.println("String is "+buffer+" ;");
            buffer.delete(0, buffer.length()-1);
        }
    }
}

public void loadFromFile(File dictfile, String delimiter) {

}

public String getDelimiter() {
    return delimiter;
}

public void setDelimiter(String delimiter) {
    this.delimiter = delimiter;
}

Но когда я пытаюсь запустить этот код в файле образца dict.txt, который содержит:

test1; test2;

Некоторые символы между разделителем (char ';') не отображаются:

Чар является: е; Чар это: т; Строка это; Чар это: е; Чар это: т; Чар это:;
Char: \ uffff;

Мой вопрос, почему он не работает должным образом и как читать символы из fileinputstream (в моем случае) без приведения типов?

1 Ответ

1 голос
/ 01 апреля 2012

Вы звоните fr.read() дважды, например,

while ((position = fr.read()) != -1) {
    char symbol = (char) fr.read();

Поэтому вы пропускаете ввод.

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

  while ((position = fr.read()) != -1) {
    char symbol = (char) position;

Также это обычно неХорошая идея читать файл по 1 символу за раз - вы должны попробовать использовать char [] в качестве буфера и использовать метод read(char[] cbuf, int off, int len), или для простоты используйте BufferedReader.

...