何が起こっているかは次のとおりだと思います
^L (ff) を含むすべての行は、^L の前のすべてを削除するように変更されますが、さらに、すべての \r (cr) も削除されるという副作用が 1 にあります。ただし、cr が ^L の前に表示される場合、nextLine() はそれも行として扱います。以下の出力ファイルでは、入力ファイルの cr + nl の数が 6 であり、cr + nl の数も 6 ですが、それらはすべて nl であることに注意してください。したがって、c を含む行は処理されているため保持されます。 ^L とは異なる行です。おそらくあなたが望むものではありません。下記参照。
いくつかの観察
\r\n を使用して新しい行を定義するシステムでソース ファイルが生成されており、それを使用しないシステムでプログラムが実行されています。このため、出現する 0xd はすべて削除されます。これにより、^L がない場合でも、2 つのファイルのサイズが異なります。
しかし、おそらく #1 を見落としていると思われます。これは、vim がファイルを開くときに読み取る内容に応じて、DOS モード (\r\n を改行区切りとして認識する) または非 DOS モード (\n のみ) で動作するためです。できればユーザー。実際、テストするには、 Linux で vim more hereを使用して編集していたため、^v^m を使用して \r でブルート フォースする必要がありました。
テストする手段は、おそらく od -x (16 進数の場合) を使用することですか? しかし、それはあなたが望むものではないintを出力します。次の入力ファイルと出力ファイルを考えてみましょう。プログラムの実行後。vi で表示
入力ファイル
a
b^M
c^M^M ^L
d^L
出力ファイル
a
b
c
多分それは正しいです、od が何を言わなければならないか見てみましょう
od -x の入力ファイル
0a61 0d62 630a 0d0d 0c20 640a 0a0c
od -x の出力ファイル
0a61 0a62 0a63 0a0a 000a
え、そのヌルはどこから来たの?しかし、odのmanページから待ってください
-t type Specify the output format. type is a string containing one or more of the following kinds of type specifiers:
q a Named characters (ASCII). Control characters are displayed using the following names:
-h, -x Output hexadecimal shorts. Equivalent to -t x2.
-a Output named characters. Equivalent to -t a.
ああ、わかりましたので、代わりに -a オプションを使用してください
入力の od -a
a nl b cr nl c cr cr sp ff nl d ff nl
od -a の出力
a nl b nl c nl nl nl nl
java に強制的に無視させる \r
そして最後に、ドキュメントに反していても、 \r が行を区切るというJavaの暗黙の理解を実際に克服する必要があります。\r 無視パターンを使用するようにスキャナーを明示的に設定しても、ドキュメントに反して動作するため、区切り文字を設定して再度オーバーライドする必要があります (以下を参照)。Unix の行のセマンティクスを主張することで、おそらく次のようにするとうまくいくことがわかりました。また、空白行を出力しないようにいくつかのロジックを追加しました。
public static void repl(File original,File file) throws IOException
{
Scanner fileScanner = new Scanner(original);
Pattern pattern1 = Pattern.compile("(?d).*");
fileScanner.useDelimiter("(?d)\\n");
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF8"));
while(fileScanner.hasNext(pattern1))
{
String next = fileScanner.next(pattern1);
next = next.replaceAll("(?d)(.*\\x0C)|(\\x0D)","");
if(next.length() != 0)
{
out.write(next);
out.newLine();
}
}
out.flush();
out.close();
}
この変更により、上記の出力は次のように変わります。
入力の od -a
a nl b cr nl c cr cr sp ff nl d ff nl
od -a の出力
a nl b nl