Java - 如何从文本文件中删除空行

时间:2016-01-25 18:47:21

标签: java

我希望能够从文本文件中删除空白行,例如:

Average Monthly Disposable Salary
1
Switzerland 
$6,301.73 
2014

2
Luxembourg 
$4,479.80 
2014

3
Zambia 
$4,330.98 
2014

- 致:

Average Monthly Disposable Salary
1
Switzerland 
$6,301.73 
2014
2
Luxembourg 
$4,479.80 
2014
3
Zambia 
$4,330.98 
2014

我所拥有的所有代码如下:

public class Driver {

    public static void main(String[] args) 
    throws Exception {

        Scanner file = new Scanner(new File("src/data.txt"));

        PrintWriter write = new PrintWriter("src/data.txt");

        while(file.hasNext()) {
            if (file.next().equals("")) {
                continue;
            } else {
                write.write(file.next());
            }
        }
        print.close();
        file.close();

    }

}

问题是,一旦我返回并再次查看该文件,文本文件就会为空。

我不知道为什么这样做会这样,因为它们似乎都是空白字符,\ n显示换行符

4 个答案:

答案 0 :(得分:4)

尝试org.apache.commons.io和迭代器

try
{
    String name = "src/data.txt";
    List<String> lines = FileUtils.readLines(new File(name));

    Iterator<String> i = lines.iterator();
    while (i.hasNext())
    {
        String line = i.next();
        if (line.trim().isEmpty())
            i.remove();
    }

    FileUtils.writeLines(new File(name), lines);
}
catch (IOException e)
{
    e.printStackTrace();
}

答案 1 :(得分:3)

您的代码几乎是正确的,但有一些错误:

  • 您必须使用 .nextLine()而不是 .next()
  • 您必须在阅读原始文件时写入其他文件
  • 您的 print.close(); 应为 write.close();
  • 您忘记在每行写完后添加新行
  • 您不需要 continue; 指令,因为它是多余的。

    public static void main(String[] args) {
    
            Scanner file;
            PrintWriter writer;
    
            try {
    
                file = new Scanner(new File("src/data.txt"));
                writer = new PrintWriter("src/data2.txt");
    
                while (file.hasNext()) {
                    String line = file.nextLine();
                    if (!line.isEmpty()) {
                        writer.write(line);
                        writer.write("\n");
                    }
                }
    
                file.close();
                writer.close();
    
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    

如果您想保留原始名称,可以执行以下操作:

File file1 = new File("src/data.txt");
File file2 = new File("src/data2.txt");

file1.delete();
file2.renameTo(file1);

答案 2 :(得分:1)

您可以复制到临时文件并重命名。

ids = b_associate.split(',')
for id in ids:
    b_obj = B.objects.get(id=id)
    A.b_associate.add(b_obj)

答案 3 :(得分:0)

这段代码为我解决了这个问题

package linedeleter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class LineDeleter {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        File oldFile = new File("src/data.txt"); //Declares file variable for location of file
        Scanner deleter = new Scanner(oldFile); //Delcares scanner to read file
        String nonBlankData = ""; //Empty string to store nonblankdata
        while (deleter.hasNextLine()) { //while there are still lines to be read 
            String currentLine = deleter.nextLine(); //Scanner gets the currentline, stories it as a string
            if (!currentLine.isBlank()) { //If the line isn't blank
                nonBlankData += currentLine + System.lineSeparator(); //adds it to nonblankdata
            }
        }
        PrintWriter writer = new PrintWriter(new FileWriter("src/data.txt"));
        //PrintWriter and FileWriter are declared, 
        //this part of the code is when the updated file is made, 
        //so it should always be at the end when the other parts of the 
        //program have finished reading the file
        writer.print(nonBlankData); //print the nonBlankData to the file
        writer.close(); //Close the writer
    }

}

如代码块的注释中所述,您的示例在扫描仪之后声明了打印编写器,这意味着该程序已经覆盖了您的同名当前文件。因此,没有任何代码可供扫描仪读取,因此该程序为您提供了一个空白文件

System.lineSeparator()

只需添加一个额外的空间,但这不会阻止程序继续在该空间上写入,因此,一切都很好