web-dev-qa-db-fra.com

Les chaînes écrites dans le fichier ne préservent pas les sauts de ligne

J'essaie d'écrire une String (longue mais enveloppée), qui est de JTextArea. Lorsque la chaîne est imprimée sur la console, le formatage est identique à celui de Text Area, mais lorsque je les écrit dans un fichier à l’aide de BufferedWriter, il écrit cette String sur une seule ligne.

L'extrait suivant peut le reproduire:

public class BufferedWriterTest {
    public static void main(String[] args) throws IOException {
        String string = "This is lengthy string that contains many words. So\nI am wrapping it.";
        System.out.println(string);
        File file = new File("C:/Users/User/Desktop/text.txt");
        FileWriter fileWriter = new FileWriter(file);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        bufferedWriter.write(string);
        bufferedWriter.close();
    }
}

Qu'est ce qui ne s'est pas bien passé? Comment résoudre ce problème? Merci pour toute aide!

19
Ahamed

Le texte d'une JTextArea comportera des caractères \n pour les nouvelles lignes, quelle que soit la plate-forme sur laquelle il s'exécute. Vous voudrez remplacer ces caractères par la nouvelle ligne spécifique à la plate-forme lorsque vous l'écriverez dans le fichier (pour Windows, il s'agit de \r\n, comme d'autres l'ont mentionné).

Je pense que la meilleure façon de le faire est d'encapsuler le texte dans une BufferedReader, qui peut être utilisée pour parcourir les lignes, puis d'utiliser une PrintWriter pour écrire chaque ligne dans un fichier à l'aide du saut de ligne spécifique à la plate-forme. Il existe une solution plus courte impliquant string.replace(...) (voir le commentaire de Unbeli), mais elle est plus lente et nécessite plus de mémoire.

Voici ma solution - rendue encore plus simple grâce aux nouvelles fonctionnalités de Java 8:

public static void main(String[] args) throws IOException {
    String string = "This is lengthy string that contains many words. So\nI am wrapping it.";
    System.out.println(string);
    File file = new File("C:/Users/User/Desktop/text.txt");

    writeToFile(string, file);
}

private static void writeToFile(String string, File file) throws IOException {
    try (
        BufferedReader reader = new BufferedReader(new StringReader(string));
        PrintWriter writer = new PrintWriter(new FileWriter(file));
    ) {
        reader.lines().forEach(line -> writer.println(line));
    }
}
18
Kevin K

Veuillez vous reporter à la question suivante pour savoir comment gérer correctement les nouvelles lignes.

Comment obtenir un caractère de nouvelle ligne dépendant de la plate-forme?

Fondamentalement, vous voulez utiliser

String newLineChar = System.getProperty("line.separator");

puis utilisez newLineChar au lieu de "\ n"

7
jluzwick

Je viens juste de lancer votre programme, et l’ajout d’un retour chariot (\r) avant que votre nouvelle ligne (\n) ne me soit plus utile.

Si vous souhaitez obtenir un séparateur de ligne indépendant du système, vous en trouverez un dans la propriété système line.separator

String separator = System.getProperty("line.separator");
String string = "This is lengthy string that contains many words. So" + separator
            + "I am wrapping it.";
3
nicholas.hauschild

Si vous utilisez BufferedWriter, vous pouvez également utiliser la méthode .newline () pour ajouter de nouveau la nouvelle ligne en fonction de votre plate-forme.

Voir cette question connexe: Les chaînes écrites dans le fichier ne conservent pas les sauts de ligne

0
Christian Vielma

Si vous souhaitez conserver les caractères de retour chariot d'une chaîne Java dans un fichier. Il suffit de remplacer chaque caractère de ligne de rupture (reconnu en Java par:\n) conformément à la déclaration suivante: 

TempHtml = TempHtml.replaceAll ("\ n", "\ r\n");

Voici un exemple de code,

        // When Execute button is pressed
        String TempHtml = textArea.getText();
        TempHtml = TempHtml.replaceAll("\n", "\r\n");
        try (PrintStream out = new PrintStream(new FileOutputStream("C:/Temp/temp.html"))) {
            out.print(TempHtml);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(TempHtml);
0
QA Specialist