web-dev-qa-db-ja.com

ファイルに書き込まれた文字列は改行を保持しません

私はStringからのJTextArea(長いがラップされている)を書き込もうとしています。文字列がコンソールに出力されるとき、書式設定はText Areaと同じですが、BufferedWriterを使用してファイルに書き込むと、そのStringが1行で書き込まれます。

次のスニペットで再現できます。

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

何が悪かったのか?これを解決する方法は?助けてくれてありがとう!

19
Ahamed

JTextAreaのテキストには、実行しているプラ​​ットフォームに関係なく、改行用の_\n_文字が含まれます。ファイルに書き込むときに、これらの文字をプラットフォーム固有の改行で置き換えます(Windowsの場合、これは_\r\n_です。他の人が言及しています)。

これを行う最善の方法は、テキストをBufferedReaderにラップし、行を反復処理することで、PrintWriterを使用して、プラットフォーム固有の改行を使用して各行をファイルに書き込むことだと思います。 string.replace(...)(Unbeliのコメントを参照)を含む短いソリューションがありますが、それは遅く、より多くのメモリを必要とします。

ここに私の解決策があります-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

改行を適切に処理する方法については、次の質問を参照してください。

プラットフォームに依存する改行文字を取得するにはどうすればよいですか?

基本的に使用したい

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

そして、「\ n」の代わりにnewLineCharを使用します

7
jluzwick

プログラムを実行し、キャリッジリターン(\r)改行の前(\n)トリックをしてくれました。

システムに依存しない行区切り文字を取得する場合は、システムプロパティ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

BufferedWriterを使用している場合は、 。newline() メソッドを使用して、プラットフォームに基づいて改行を再追加することもできます。

この関連質問を参照してください: ファイルに書き込まれた文字列は改行を保持しません

0

Java文字列からの復帰文字をファイルに保存したい場合は、各改行文字を置き換えてください(Javaで認識されます:\ n)次のステートメントに従って:

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

以下にコード例を示します。

        // 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