删除最后一个空白行

时间:2019-05-17 20:11:43

标签: java file io

我对某些Java代码有疑问。 我要从.txt文件中的方法返回文本。然后,我将该文本存储到变量“文本”中,并将其写入另一个.txt文件中。但是问题是:这个新的.txt文件在底部有一个新的空白行。那是因为在我读取的方法中,变量“ 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 :(得分:0)

请尝试以下操作:

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";
    }
}

答案 1 :(得分:0)

解决这类问题的一种好方法是在您编写每条附加行之前,在 之前添加换行符:

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

这样,您只需为所写的其他每行添加换行符(末尾没有多余的行)。请注意while循环中的分配(加上空检查)。

答案 2 :(得分:0)

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

这将删除最后一个字符,即写入前的/ n。

答案 3 :(得分:0)

仅在最后一行之前不要添加\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();

答案 4 :(得分:0)

将所有字符串存储在列表中,然后加入换行符

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() );
    }
}

答案 5 :(得分:0)

String.trim()

  

公共字符串trim()

     

返回字符串的副本,并带有前导和   尾随空白省略。如果此String对象表示一个空   字符序列,或字符的第一个和最后一个字符   此String对象表示的序列均具有更大的代码   而不是'\ u0020'(空格字符),然后引用此String   对象被返回。

     

否则,如果没有字符的代码大于“ \ u0020”   在字符串中,然后是一个新的String对象,表示一个空字符串   创建并返回。

     

否则,令k为字符串中第一个字符的索引   其代码大于“ \ u0020”,并让m为   字符串中代码大于'\ u0020'的最后一个字符。一种   创建了新的String对象,表示该对象的子字符串   以索引k处的字符开始并以   索引m处的字符,即this.substring(k,m + 1)的结果。

     

此方法可用于从空格中修剪空格(如上定义)。   字符串的开头和结尾。

     

返回值:该字符串的副本,带有前导和尾随空白   已删除;如果没有开头或结尾的空格,则返回此字符串。

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

在将字符串从读取中返回之前,只需对其进行修剪。

Dictionary