web-dev-qa-db-ja.com

Javaのキャリッジリターン\ラインフィード

Unix環境でJavaコードを使用してテキストファイルを作成しました。

テキストファイルを記述するために、Java.io.FileWriterBufferedWriterを使用しています。各行の後の改行には、bw.newLine()メソッドを使用しています(bwBufferedWriterのオブジェクトです)。

そして、Unix環境自体からメールで添付することにより、そのテキストファイルを送信しています(Unixコマンドを使用して自動化されています)。

私の問題は、Windowsシステムでメールからテキストファイルをダウンロードした後、そのテキストファイルを開くと、データが適切に整列されないことです。 newline()文字が機能しない、そう思う。

Windows環境でもテキストファイルを開いた場合、Unix環境と同じテキストファイルの配置が必要です。

問題を解決するにはどうすればよいですか?

参考のための以下のJavaコード(Unix環境で実行):

File f = new File(strFileGenLoc);
BufferedWriter bw = new BufferedWriter(new FileWriter(f, false));
rs = stmt.executeQuery("select * from jpdata");
while ( rs.next() ) {
    bw.write(rs.getString(1)==null? "":rs.getString(1));
    bw.newLine();
}
50
Manu

Javaは現在実行中のプラットフォームのみを認識しているため、そのプラットフォーム上でプラットフォームに依存する出力のみを提供できます(bw.newLine()を使用)。 Windowsシステムで開くという事実は、使用する前にファイルを変換する必要があることを意味します(作成したものを使用するか、 nix2dos などのプログラムを使用する)か、出力する必要があります元々JavaプログラムでWindows形式のキャリッジリターンを含むファイル。したがって、ファイルが常にWindowsマシンで開かれることがわかっている場合は、出力する必要があります。

bw.write(rs.getString(1)==null? "":rs.getString(1));
bw.write("\r\n");

使用しているプレーンテキストの場合、両方のプラットフォームで正しく表示されるファイルを出力できないことに注意する価値があります。電子メールの場合はhtmlを、それの場合はxmlを使用することを検討してください。データです。または、データを読み取り、ビューアが使用しているプラ​​ットフォーム用にフォーマットするクライアントの種類が必要になる場合があります。

59
James B

メソッドnewLine()は、プラットフォーム互換の新しい行が追加されるようにします(DOSの場合は0Dh 0Ah、古いMacの場合は0Dh、Unix/Linuxの場合は0Ah)。 Javaには、テキストを送信するプラットフォームを知る方法がありません。この変換は、メール送信エンティティによって処理される必要があります。

7
nc3b

誰がファイルを見るのかわかりませんが、メモ帳ではなくワードパッドで開くと、改行が正しく表示されます。特別なファイル拡張子を使用している場合は、ワードパッドに関連付けて完了です。または、他のより高度なテキストエディタを使用します。

4
Axel

私があなたを正しく理解していれば、テキストファイルの添付ファイルについて話します。メールの本文である場合は、 http://www.faqs.org/rfcs/rfc822.html を参照して、常に「\ r\n」を使用できるため、これは残念です

ただし、添付ファイルなので、システムの違いに対応する必要があります。私があなたの靴を履いているなら、私はそれらのオプションの一つを選ぶでしょう:

a)行末として「\ r\n」を使用して、Windowsクライアントのみをサポートします。

b)2つの添付ファイルを提供します。1つはLinux形式、もう1つはWindows形式です。

c)添付ファイルを人と機械のどちらで読むかはわかりませんが、人である場合はプレーンテキストではなくHTMLファイルを添付することを検討します。より移植性が高く、よりきれいです:)

2
rompetroll

bw.newLine();は、すべてのシステムとの互換性を保証できません。

Windowsで開くことが確実な場合は、Windowsの改行にフォーマットできます。

既にネイティブUNIXコマンドを使用している場合は、unix2dosを試して、既に生成されているファイルをWindows形式に変換してからメールを送信してください。

UNIXコマンドを使用しておらず、Javaで実行する場合は、「bw.write( "\ r\n")」を使用し、プログラムが複雑にならない場合は、オペレーティングシステムを見つけて書き込むメソッドを用意します。適切な改行。

2
Vaishak Suresh

ライターをカプセル化して、次のように文字の置換を提供します。

public class WindowsFileWriter extends Writer {

    private Writer writer;

    public WindowsFileWriter(File file) throws IOException {
        try {
            writer = new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-15");
        } catch (UnsupportedEncodingException e) {
            writer = new FileWriter(logfile);
        }
    }

    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        writer.write(new String(cbuf, off, len).replace("\n", "\r\n"));
    }

    @Override
    public void flush() throws IOException {
        writer.flush();
    }

    @Override
    public void close() throws IOException {
        writer.close();
    }

}
0
The Felis Leo