Александр Дорофеев:вопрос,
String currentLine = null;
while((currentLine = reader.readLine()) != null) {
if (currentLine.startsWith(key)){
writer.write(currentLine);
}
writer.write перезаписывает файл с новыми строками или добавляет новые строки к старым? То есть мы считываем каждую строку и записываем ее в currentLine и если строка начинается с определенного ключа то мы записываем ее. Просто не очень понятно writer.write(currentLine); перезаписывает строку или добавляет новую с таким же ключом и новым сообщением?
Александр Дорофеев: Спасибо, ясно, если можно я подведу итоги, чтобы понять в чем я не прав и дабы выявить то чего я не понял.
Обновление существующей строчки на другую будет так:
static void refreshParser(String key, String info) throws IOException {
Path path = Paths.get("res/help.dict");
try (BufferedReader reader = Files.newBufferedReader(path);
BufferedWriter writer = Files.newBufferedWriter(path)) {
String currentLine = null;
while((currentLine = reader.readLine()) != null) {
if (currentLine.startsWith(key)){
writer.write(currentLine);
}
}
writer.close()
reader.close()
writer.flush();
}}
Либо написанный вами вариант с другим подходом.
Удаление правильно будет через итератор(правда я искал ConcurrentModificationException в сети так ничего понятного для себя не нашел, ну да ладно, почитаю литературу,это не так важно)
Получение я реализовал через hash map (правда не знаю насколько это правильно):
static void getParser() {
data.clear();
try (Reader reader = new InputStreamReader(Qrequests.class.getResourceAsStream("/help.dict"))) {
List lines = CharStreams.readLines(reader);
for (String line: lines) {
String [] splitted = line.split(" ");
data.put(splitted[0].trim(), splitted[1].trim());
}
} catch (Exception ex) {
ex.printStackTrace();
}}
и сам метод
static String getAnswer(String key) {
return data.get(key);
}
И насчет добавления новой строки ,могу ли я реализовать добавление так
static void WriteParser(String message){
Path path = Paths.get("res/help.dict");
try(BufferedReader reader = Files.newBufferedReader(path)){
List lines = CharStreams.readLines(reader);
lines.add(message);
Files.write(Paths.get("res/help.dict"), lines);
reader.close();
}
catch (Exception ex) {
ex.printStackTrace();
}}
Или лучше написать writer и вместо Files.write(Paths.get("res/help.dict"), lines); использовать writer.write или такая конструкция вообще не правильна?
Александр Дорофеев: то есть каждый раз когда я использую reader или writer я каждый раз должен закрывать потоки? Можно для удаления использовать такую конструкцию?
static void refreshDelete(String key) throws IOException {
Path path = Paths.get("res\\text.txt");
try (BufferedReader reader = Files.newBufferedReader(path);
BufferedReader writer = Files.newBufferedWriter(path)) {
String currentLine = null;
while((currentLine = reader.readLine()) != null) {
if (currentLine.startsWith(key)){
writer.write("");
}
}
writer.close()
reader.close()
}}
Но тогда я получу ConcurrentModificationException.То есть не совсем понятно, как мне перейти от reader к итератеру.Извините что заедаю вопросами но в сети я примеров не нашел.
Александр Дорофеев: То есть я могу создать к примеру writer и одновременно reader и реализовать вот так, просто не очень ясно как их правильно реализовать
static void refreshParser(String key, String info) throws IOException {
Path path = Paths.get("res\\text.txt");
try (BufferedReader reader = Files.newBufferedReader(path);
BufferedWriter writer = Files.newBufferedWriter(path)) {
String currentLine = null;
while((currentLine = reader.readLine()) != null) {
if (currentLine.startsWith(key)){
writer.write(currentLine);
}
}
writer.close()
reader.close()
}}
Александр Дорофеев: А , то есть вы считываете в reader файл файл, и в while построчно считывается каждая строка, в теории в while можно запихнуть любую проверку и так далее, например тот же самый refresh
while((currentLine = reader.readLine()) != null) {
if (currentLine.startsWith(key)){
}
Вот только можно ли использовать конструкцию Files.write для записи?(например того же метода refresh) или в этой ситуации лучше использовать одновременно reader и writer ?
Александр Дорофеев: А могу ли я сделать удаление и обновление через конструкцию try - with -resources , то есть например как вы писали в первом вашем комментарии,
try (BufferedWriter writer = Files.newBufferedWriter(path))
Я все понял что вы написали, кроме этой конструкции, могу ли я без использования Files.write, написать эту конструкцию и работать уже с writer?
Александр Дорофеев: А не нужно ли List lines=null;?
Ведь в for требуется обращение к объекту.
И еще не подскажете, удаление будет правильно так?
Path path = Paths.get("res\\text.txt");
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
int=0;
for (String line : lines) {
if (line.startsWith(key)) lines.set(i, String.format("");
i++;
}
Files.write(Paths.get("res\\text.txt"), lines);
}
И можно ли для добавления строки использовать конструкцию которая будет перебирать все строки пока не найдет пустую? или есть определенный метод который добавляет строку без перебора существующих? (Это последний вопрос который меня волнует, обещаю больше не беспокоить. Еще раз спасибо за помощь)
Александр Дорофеев: Еще вопрос, Требуется заменить определенную строку в тексте по ключевому слову в начале строки( Строки выглядят так КлючевоеСлово=Информация),будет ли этот код правильным?
// String key, String info , где key- это ключевое слово которое вводится с клавиатуры ,a info -информация на которую следует заменить предыдущую информацию//
List lines = Files.readAllLines(Paths.get("res/file.txt"));
for (String line: lines) {
String key1= key(line);
//Здесь я присваиваю переменной key1 - значение из строки первичного текста(метод key уже написан и возвращает первое слово из строки первичного текста,то есть ключ по которому нужно искать строку)//
if( key== key1){
line = key+ " = " +info;
//здесь я заменяю первичную строку , на обновленную
}
Files.write(Paths.get("res/file.txt"), lines);
Я так понял файл будет перезаписан? Ведь иначе Files.write просто добавит уже существующие строки? или Files.write следует включать в конструкцию if чтобы записывались только нужные строки? Заранее спасибо за ответ, извините что сыплю вопросами, но хотел бы детально разобраться.
Александр Дорофеев: И заключительный вопрос, если можно, чтобы уточнить, как правильно удалить элементы(или обновить например) но построчно? Заранее спасибо за ответ
String currentLine = null;
while((currentLine = reader.readLine()) != null) {
if (currentLine.startsWith(key)){
writer.write(currentLine);
}
writer.write перезаписывает файл с новыми строками или добавляет новые строки к старым? То есть мы считываем каждую строку и записываем ее в currentLine и если строка начинается с определенного ключа то мы записываем ее. Просто не очень понятно writer.write(currentLine); перезаписывает строку или добавляет новую с таким же ключом и новым сообщением?