Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246

Чтение из текстового файла в строку

07.11.2014, 05:31. Показов 3844. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь сделать програмку, которая будет искать в текстовом файле (в данном случае это словарь) нужное слово и формировать из найденых результатов новую строку с вариантами перевода искомого слова. Сейчас в файле словаря если искомое слово имеет несколько переводов, то оно повторяется несколько раз с новой строки с новым вариантом перевода.
Вот пример текстового файла
ABACK;НАЗАД
ABACUS;РАХІВНИЦЯ
ABACUSES;РАХІВНИЦІ
ABADDON;ПЕКЛО
ABAFT;ПОЗАДУ
ABANDON;ЗАЛИШАТИ
ABANDON;ВІДМОВІТЬСЯ
ABANDON;ЗАЛИШИТИ
ABANDON;КИНУТИ
ABANDON;ОБЛИШАТИ
ABANDON;ЛИШАТИ
ABANDON;ЛИШИТИ
ABANDON;ПОКИДАТИ
ABANDON;ОБЛИШИТИ
ABANDON;ПОКИНУТИ
ABANDONED;ВІДМОВЛЯЮТЬСЯ
ABANDONED;ЗАКИНЕНИЙ
ABANDONED;ЗАКИНУТИЙ
ABANDONED;ЗАНЕДБАНИЙ
ABANDONED;ЗАНЕПАЛИЙ
ABANDONED;ЗАНЕХАЯНИЙ
ABANDONED;НЕВТРИМНИЙ
ABANDONED;НЕСТРИМАНИЙ
ABANDONING;НЕВИМУШЕНІСТЬ
ABANDONMENT;АБАНДОН
ABANDONMENT;ДИТИНУ
ABANDONMENT;ВІДМОВА
ABANDONMENT;ДИТИНИ
ABANDONMENT;ЗАНЕДБАНІСТЬ
ABANDONMENT;ЗАЛИШЕННЯ
ABANDONMENT;ЗАНЕХАЯННЯ
ABANDONMENT;ПОЛИШЕННЯ
вот вариант кода
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Helper {
 
    BufferedReader br;
    char next;
    char stop;
    String engWord = "ABANDONED";
    String resStr;
    char resChar;
    String newResult;
 
    String search() {
        
        try {
            next = (char) (engWord.charAt(0) + 1);
 
            br = new BufferedReader(new FileReader("E:/test.txt"));
 
            do {
                resStr = br.readLine();
 
                if (resStr.contains(engWord)) {
                    System.out.println("resStr " + resStr);
 
//                    newResult.concat(resStr);
//                    System.out.println("Newres" + newResult);
 
                }
 
                stop = (char) resStr.charAt(0);
            } while (stop != next);
 
        } catch (IOException exc) {
            System.out.println("I/O Error: " + exc);
        } catch (NullPointerException e) {
            e.printStackTrace();
            System.out.println("NullPointerException: ");
        }
//        try {
//        newResult.replaceAll(engWord,"");
//        } catch (PatternSyntaxException ex) {
//                ex.prinStackTrace();
//                }
 
 
//        System.out.println(newResult);
        return resStr;
    }
}
 
public class AnkiHelper {
 
  
    public static void main(String[] args) throws IOException {
        Helper h = new Helper();
        h.search();
        System.out.println(h.newResult);
 
    }
 
}
в таком варианте как есть нужные переводы слова находятся и выводятся на экран, но появляется NullPointerException. Если же убрать комментарии с закоментированных строк (часть которая должна найденные результаты добавлять в строчную переменную формируя новую строку с вариантами перевода, а потом убрать оттуда повторяющееся искомое слово, то программа перестает искать нужное слово. Ничего не пойму - объясните пожалуйста как оно должно работать и почему так получается.
Заранее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.11.2014, 05:31
Ответы с готовыми решениями:

Чтение настроек из текстового файла, одна переменная на строку
Доброго времени суток, уважаемые форумчане! Вопрос у меня на этот раз простой, но интересный :) есть у нас текстовый файл вот такого...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, "ing") в текстовом документе. в прикреплённом коде текст вводится прямо в консоль,...

Чтение из одного текстового файла и копирование на другой текстового файл с заменой пробелов на "_"
Здравствуйте, помогите пожалуйста с паскалем. Надо прочитать текстовый файл (в нем строки с именами типа: Имя Фамилия; в каждой строке одно...

4
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
07.11.2014, 07:03
Лучший ответ Сообщение было отмечено AMufu как решение

Решение

Цитата Сообщение от AMufu Посмотреть сообщение
появляется NullPointerException
RTMF?
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
if (
    (resStr = br.readLine()) == null
) {
    break;
}


Цитата Сообщение от AMufu Посмотреть сообщение
часть которая должна найденные результаты добавлять в строчную переменную
Java
1
newResult = newResult.concat(resStr);
Кликните здесь для просмотра всего текста
Но вообще код плохой, так не делают. Читай про StringBuilder.
1
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
07.11.2014, 19:53  [ТС]
Спасибо большое за оперативные ответы и за ссылки по предмету.
Код конечно плохой так как это первая приложение которое я придумал и пишу самостоятельно а не с учебника ))
0
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
14.11.2014, 00:10  [ТС]
Но вообще код плохой, так не делают. Читай про StringBuilder.
Вот получилась более-менее работающая версия.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package ankihelper;
 
import java.io.*;
 
class Helper2 {
 
    String transl;
 
    String search(CharSequence engWord) {
        char initLet;
        String resStr;
        String newResult;
 
        StringBuilder sb = new StringBuilder();
 
        try (BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream("d:/Dictionary.txt"), "Cp1251"))) {
            initLet = (char) (engWord.charAt(0));
 
            do {
                resStr = br.readLine();
                if (resStr.contains(engWord + ";")) {
                    if (sb.length() > 0) {
                        sb.append(new StringBuilder(resStr).substring((int) engWord.length()));
                    } else {
                        sb.append(resStr);
                    }
                }
            } while ((char) resStr.charAt(0) <= initLet);
 
        } catch (UnsupportedEncodingException exep) {
            System.out.println("Unsupported encoding of file.");
        } catch (NullPointerException e) {
            System.out.println("No words for translation.");
        } catch (IOException exc) {
            System.out.println("I/O Error: " + exc);
 
        }
 
        newResult = sb.toString();
        System.out.println("newRes " + newResult);
        return newResult;
    }
 
    String translate() {
        CharSequence enWord;
 
        try (BufferedReader brHistory = new BufferedReader(new FileReader("d:/History.txt"));
                FileWriter fw = new FileWriter("D:/Translation.txt", true)) {
            do {
                enWord = brHistory.readLine();
                System.out.println("Word for translation : " + enWord);
                fw.write(search(enWord) + "\r\n");
 
            } while (enWord != null);
 
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex1) {
            System.out.println("End of History file reached ");
        }
 
        return transl;
    }
 
}
 
public class AnkiHelper2 {
 
    public static void main(String[] args) throws IOException {
        Helper2 h = new Helper2();
        h.translate();
 
    }
 
}
Как писал раньше программа должна взять из файла History.txt слова для перевода и найти совпадения в файле словаря Dictionary.txt и вывести результат в файл Translation.txt в следующем виде - первым в строке идет искомое слово, далее через точку с запятой переводы.
Формат файла History.txt просто слова по одному на строчку (строчные или прописные буквы значения не имеет)
Формат файла History.txt

ABANDONED
ABANDONING
ABANDONMENT
.


Но есть еще 2 вопроса
Вопрос 1. Как можна улучшить данный код (то есть что в нём есть не рационального, не принятого, глупого итд). Спрашиваю, чтоб впредь делать лучше. Понимаю что кроме меня он нафиг никому не нужен )), но если вдруг будет желание дать рекомендации - буду благодарен.

Вопрос 2. Один из промежуточных вариантов метода search как условие остановки цикла do-while предусматривал получение потоком значения null (do {...} while (br.readLine() != null))
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
do {
 
                resStr = br.readLine();
                System.out.println("Res22 " + resStr);
 
                if (resStr.contains(engWord + ";")) {
 
                    if (newResult != null) {
                    newResult = newResult.concat(resStr);
                    } else {
                    newResult = resStr;
                    }
                } 
 
            } while (br.readLine() != null);
Но в таком варианте слова из словаря считывались через одну строку. Вот собственно вопрос -почему?
0
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
16.11.2014, 21:59  [ТС]
Уважаемые форумчане. Хочу еще спросить относительно кодировок. Я решил немного усовершенствовать приведенный выше код, чтоб из файла history для перевода можна было брать слова как на английском так и на украинском. Соответственно для етого в файл Dictionary добавил набок слов для перевода с украинского на английский в том же формате как и с английского на украинский. Но тут начались проблемы- то переводит с украинского, то не переводит. Закономерности от чего это зависит я так и не понял. Пока думаю что это зависит от кодировки текста. Вроде джава работает по умолчанию с кодировкой Unicode а у меня текст импортируется из UTF-8. Пробовал через getBytes передать значения сравниваемых строк в байтовые масивы и потом сравнить через цикл for и метод compare (byte x, byte y), но что-то тоже не получилось. Может дело и не в кодировке...
Вот текст кода (поправленый немножко
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ankihelper2;
 
import java.io.*;
import static java.lang.Byte.*;
 
class Helper2 {
 
    String transl;
 
    String search(String engWord) {
        char initLet;
        String resStr;
        String newResult;
        int counter = 0;
        byte[] resStrByte;
        byte [] engWordByte;
 
        StringBuilder sb = new StringBuilder();
 
        try (BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream("d:/Anki/Dictionary.txt"), "UTF-8"))) {
            initLet = (char) (engWord.charAt(0));
 
            do {
                resStr = br.readLine();
                engWordByte = engWord.getBytes("UTF-8");
                resStrByte = resStr.getBytes("UTF-8");
                
                                
                if ((resStr).regionMatches(true, 0, (engWord+ ";"), 0, (engWord.length()+1))) {
                    System.out.println("YESSSS");
                    if (sb.length() > 0) {
                        
                        counter++;
                        sb.append(" " + counter + ") ");
 
                        sb.append(new StringBuilder(resStr.toLowerCase()).substring((int) engWord.length() + 1));
                        System.out.println("String Builder"+sb.toString());
 
                    } else {
                        
                        sb.append(resStr.toLowerCase());
                        counter++;
                        sb.insert(((int) engWord.length() + 1), counter + ") ");
                        System.out.println("String Builder"+sb.toString());
                    }
                }
            } while ((char) resStr.charAt(0) <= initLet);
 
        } catch (UnsupportedEncodingException exep) {
            System.out.println("Unsupported encoding of file.");
        } catch (NullPointerException e) {
            System.out.println("No words for translation.");
        } catch (IOException exc) {
            System.out.println("I/O Error: " + exc);
 
        }
 
        newResult = sb.toString();
        System.out.println("newRes " + newResult);
        return newResult;
    }
 
    String translate() {
        String enWord;
 
        try (BufferedReader brHistory = new BufferedReader(new InputStreamReader
            (new FileInputStream("d:/Anki/all_history.txt"), "UTF-8"));
                FileWriter fw = new FileWriter("d:/Anki/Translation.txt", true)) {
            do {
                enWord = brHistory.readLine();
                System.out.println("Word for translation : " + enWord);
//                fw.write(search(enWord) + "\r\n");
                fw.write(search(enWord) + "\r\n");
 
            } while (enWord != null);
 
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex1) {
            System.out.println("End of History file reached ");
        }
 
        return transl;
    }
 
}
 
public class AnkiHelper2 {
 
    public static void main(String[] args) throws IOException {
        Helper2 h = new Helper2();
        h.translate();
 
    }
 
}
Подскажите пожалуйста как правильно сравнить две строки в выражении "if ((resStr).regionMatches(true, 0, (engWord+ ";"), 0, (engWord.length()+1)))" в строчке кода №35
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.11.2014, 21:59
Помогаю со студенческими работами здесь

Чтение из одного текстового файла и копирование на другой текстового файл с заменой пробелов на "_"
Здравствуйте, помогите пожалуйста с паскалем. Надо прочитать текстовый файл (в нем строки с именами типа: Имя Фамилия; в каждой строке одно...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

Как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Создание текстового файла и чтение данных из файла
Здравствуйте. Дана задача : Создать файл, содержащий сведения о сдаче студентами первого курса сессии. Структура записи – Индекс группы,...

Напечатать первую строку, пятую строку текстового файла
имеется текстовый файл , напечатать а) его первую строку б) его пятую строку


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru