Чтение данных из текстового файла UTF-8 и токенизация - PullRequest
2 голосов
/ 06 мая 2009

Я пытаюсь прочитать UTF-8 из текстового файла и выполнить токенизацию, но у меня возникают проблемы с кодировкой:

try {
    fis = new FileInputStream(fName);
} catch (FileNotFoundException ex) {
    //...
}

DataInputStream myInput = new DataInputStream(fis);
    try {
        while (thisLine = myInput.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(thisLine, ";");
            while (st.hasMoreElements()) {
            // do something with st.nextToken();
    }
}
} catch (Exception e) {
//...
}

и DataInputStream не имеет параметров для установки кодировки!

Ответы [ 6 ]

5 голосов
/ 06 мая 2009

Позвольте мне процитировать Javadoc для этого метода.

DataInputStream.readLine ()

Запрещены. Этот метод не правильно конвертировать байты в символы. Начиная с JDK 1.1, предпочтительный способ читать строки текста через Метод BufferedReader.readLine (). Программы, использующие DataInputStream класс для чтения строк может быть преобразован использовать класс BufferedReader заменяющий код формы:

     DataInputStream d = new DataInputStream(in);

с:

     BufferedReader d
          = new BufferedReader(new InputStreamReader(in));

Кстати: JDK 1.1 вышел в феврале 1997 года, так что это не должно быть новым для вас.

Подумайте, сколько времени сэкономили бы все, если бы вы прочитали Javadoc. ;)

4 голосов
/ 06 мая 2009

Вы можете использовать InputStreamReader:

BufferedReader br = new BufferedReader (new InputStreamReader (source, charset);
while (br.readLine () != null) { ... }

Вы также можете попробовать сканер, но я не уверен, что он будет работать нормально

1 голос
/ 06 мая 2009

Почему бы не использовать InputStreamReader и указать кодировку? Затем вы можете обернуть с помощью BufferedReader , чтобы обеспечить возможность readLine ().

0 голосов
/ 06 мая 2009

StringTokenizer - это чрезвычайно простой класс для токенизации текста, я могу рекомендовать его только для задач, которые не требуют дальнейшей идентификации токенов (то есть с помощью поиска в словаре) и которые будут использоваться только для западных языков.

Для более сложных случаев, связанных с западными языками, простой токенизатор может быть написан на основе классов символов Unicode (он будет выбирать много видов пробелов, разделять символы и т. Д.), А затем расширяться с помощью регулярных выражений для отлова особых случаев (например, « ',' C ++ '...).

0 голосов
/ 06 мая 2009

Один очень простой способ:

File myFile = ...

String contents = Files.toString(myFile, Charsets.UTF_8);
for (String token : contents.split(";")) {
    // do something with token
}

Где Files и Charsets от Гуава . Или, если вам нужно обрабатывать файл построчно, начните с этого:

List<String> lines = Files.readLines(myFile, Charsets.UTF_8);

Также обратите внимание, что split() здесь проще использовать, чем StringTokenizer.

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

Редактировать (2013): Моя рекомендация переведена с Apache Commons IO на Guava, которая является более чистой и более активно поддерживаемой библиотекой.

0 голосов
/ 06 мая 2009

Когда вы читаете текст (не двоичные данные), вы должны использовать Reader (не InputStream). Затем вы можете указать кодировку для vm, выполнив -Dfile.encoding = utf-8. Читатель автоматически использует эту кодировку. Таким образом, вы можете легко переключать кодировку. Вы можете использовать BufferedReader в FileReader, чтобы иметь readLine (). Метод readLine () имеет смысл только при чтении текста, в противном случае окончания строк - это просто байты

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