Quiero poder eliminar líneas en blanco de un archivo de texto, por ejemplo:

Average Monthly Disposable Salary
1
Switzerland 
$6,301.73 
2014

2
Luxembourg 
$4,479.80 
2014

3
Zambia 
$4,330.98 
2014

--A esto:

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

Todo el código que tengo está a continuación:

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

    }

}

El problema es que el archivo de texto está vacío una vez que vuelvo y miro el archivo nuevamente.

No estoy seguro de por qué esto actúa de esta manera, ya que todos parecen ser caracteres en blanco, \ n mostrando saltos de línea

1
Nicholas Dry 25 ene. 2016 a las 21:47

3 respuestas

Esta pieza de código me resolvió este problema

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
    }

}

Como se mencionó en los comentarios, del bloque de código, su muestra tenía el escritor de impresión declarado después de su escáner, lo que significa que el programa ya había sobrescrito su archivo actual con el mismo nombre. Por lo tanto, su escáner no tenía código para leer y, por lo tanto, el programa le dio un archivo en blanco

La

System.lineSeparator()

Sin embargo, solo agrega un espacio adicional, esto no impide que el programa continúe escribiendo en ese espacio, por lo que todo está bien

0
EliasJR 1 nov. 2019 a las 03:44

Puede copiarlo en un archivo temporal y cambiarle el nombre.

String name = "src/data.txt";
try(BufferedWriter bw = new BufferedWriter(name+".tmp)) {
    Files.lines(Paths.get(name))
         .filter(v -> !v.trim().isEmpty())
         .forEach(bw::println);
}
new File(name+".tmp").renameTo(new File(name));
1
Peter Lawrey 9 mar. 2017 a las 11:30

Pruebe org.apache.commons.io y el Iterator

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();
}
4
user3826636 25 ene. 2016 a las 19:51