我对某些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”。
这是 一个文本文件。
这是 文本文件。 (空行)
答案 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