Удалить последнюю пустую строку - PullRequest
0 голосов
/ 17 мая 2019

У меня проблема с некоторым кодом Java.Я возвращаю текст из метода, который находится в файле .txt.Затем я сохраняю этот текст в переменной «text» и записываю его в другой файл .txt.Но проблема в том, что этот новый .txt файл получает новую пустую строку внизу.Это потому, что в моем методе read переменная "text" получает "\ n".Как я могу решить эту проблему?PS: Я делаю это в образовательных целях.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.FileReader;
import java.io.FileWriter;

public class Arquivo {
    public static void main(String[] args) {
        String text = read("in.txt");
        write(text, "out.txt");
        System.out.println("Text created!");
    }

    public static String read(String arquivo) {
        String text = "";
        try (BufferedReader br = new BufferedReader(new FileReader(arquivo))) {

            String line = br.readLine();
            while (line != null) {
                text += line + "\n";
                line = br.readLine();
            }

        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
        return text;
    }

    public static void write(String text, String arquivo) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter(arquivo))) {
            bw.write(text);
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
    }
}

Мои два созданных файла "in.txt" и "out.txt".

это текстовый файл.

это текстовый файл.(пустая строка)

Ответы [ 6 ]

0 голосов
/ 17 мая 2019

String.trim ()

общедоступная строка ()

Возвращает копию строки с начальным и завершающий пробел пропущен. Если этот объект String представляет собой пустой последовательность символов или первый и последний символы последовательность, представленная этим объектом String, имеет оба кода больше чем «\ u0020» (символ пробела), то ссылка на эту строку объект возвращается.

В противном случае, если нет символа с кодом больше, чем '\ u0020' в строке, затем новый объект String, представляющий пустую строку создан и возвращен.

В противном случае, пусть k будет индексом первого символа в строке чей код больше, чем '\ u0020', и пусть m будет индексом последний символ в строке, код которого больше, чем '\ u0020'. Создается новый объект String, представляющий подстроку этого Строка, которая начинается с символа с индексом k и заканчивается символ с индексом m, то есть результат этой строки (k, m + 1).

Этот метод может использоваться для обрезки пробелов (как определено выше) из начало и конец строки.

Возвращает: копия этой строки с пробелом в начале и в конце удаляется или эта строка, если она не имеет начальных или конечных пробелов.

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim()

Просто обрежьте строку, прежде чем вернуть ее из чтения.

public static String read(String arquivo) {
        String text = "";
        try (BufferedReader br = new BufferedReader(new FileReader(arquivo))) {

            String line = br.readLine();
            while (line != null) {
                text += line + "\n";
                line = br.readLine();
            }

        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
        return text.trim();
    }
0 голосов
/ 17 мая 2019

Сохраните все строки в списке, затем присоединитесь к переводу строки

public static void main( String[] args ) {
    String text = read( "in.txt" );
    write( text, "out.txt" );
    System.out.println( "Text created!" );
}

public static String read( String arquivo ) {
    List<String> texts = new ArrayList<>();
    try ( BufferedReader br = new BufferedReader( new FileReader( arquivo ) ) ) {

        String line = br.readLine();
        while ( line != null ) {
            texts.add( line );
            line = br.readLine();
        }

    } catch ( IOException e ) {
        System.err.println( e.getMessage() );
    }
    return texts.stream().collect( Collectors.joining( "\n" ) );
}

public static void write( String text, String arquivo ) {
    try ( BufferedWriter bw = new BufferedWriter( new FileWriter( arquivo ) ) ) {
        bw.write( text );
    } catch ( IOException e ) {
        System.err.println( e.getMessage() );
    }
}
0 голосов
/ 17 мая 2019

Только не добавляйте \n перед последней строкой:

    String text = "";
    ...
        String line = br.readLine();
        boolean addNewLine = false; 
        while (line != null) {
            if (addNewLine) {
                text += "\n";
            } else {
                addNewLine = true;
            }
            text += line;
            line = br.readLine();
        }

Кроме того, для повышения производительности рассмотрите возможность использования StringBuilder вместо конкатенации строк:

    StringBuilder sb = new StringBuilder();
    ...
        String line = br.readLine();
        boolean addNewLine = false; 
        while (line != null) {
            if (addNewLine) {
                sb.append('\n');
            } else {
                addNewLine = true;
            }
            sb.append(line);
            line = br.readLine();
        }
    ...
    String text = sb.toString();
0 голосов
/ 17 мая 2019

замените write(text, "out.txt"); на

write(text.substring(0,text.length()-1), "out.txt");

, который удалит последний символ, то есть / n перед записью.

0 голосов
/ 17 мая 2019

Хорошим решением проблемы такого типа является добавление новой строки перед тем, как вы напишите каждую дополнительную строку:

String line = br.readLine();
text += line;
while ((line = br.readLine()) != null) {
    text = "\n" + line;
}

Таким образом, вы добавляете новую строку только для каждой дополнительной строки, которую вы пишете (никаких посторонних в конце). Обратите внимание на присваивание (плюс проверка нуля) в цикле while).

0 голосов
/ 17 мая 2019

Пожалуйста, попробуйте это:

String line = br.readLine();
while (line != null) {
    text += line;
    line = br.readLine();
    if (line!=null){
        text +=  "\n";
    }
}

Вы можете попробовать этот вариант:

String line;
while((line = br.readLine()) != null) {
    text += line;
    if (line!=null){
        text +=  "\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...