1

次のtxtを含むtext.txtファイルがあります。

 Kontagent Announces Partnership with Global Latino Social Network Quepasa

 Released By Kontagent

このテキスト ファイルを文字列 documentText に読み込みます。

documentText.subString(0,9)を与えますKontagent。これは良いことです。

ただし、Windows(IntelliJ Idea)で提供documentText.subString(87,96)し 、Unix環境で提供します。ファイル内の空白行が原因で発生していると推測しています(その後、オフセットがねじ込まれました)。しかし、なぜ2つの異なる結果が得られるのか理解できません。両方の環境で 1 つの結果を取得する必要があります。y KontageKontagent

ファイルを文字列として読み取るには、ここで説明したすべての関数を使用しまし た ファイルの内容から Java 文字列を作成するにはどうすればよいですか? . ただし、関数を使用した後でも同じ結果が得られます。

現在、この関数を使用してファイルを documentText 文字列に読み込みます。

public static String readFileAsString(String fileName)
{

    File file = new File(fileName);
    StringBuilder fileContents = new StringBuilder((int)file.length());
    Scanner scanner = null;
    try {
        scanner = new Scanner(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    String lineSeparator = System.getProperty("line.separator");

    try {
        while(scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine() + lineSeparator);
        }
        return fileContents.toString();
    } finally {
        scanner.close();
    }
}

編集: Windows 環境と UNIX 環境の両方で機能する一般的な関数を作成する方法はありますか。ファイルがテキストモードでコピーされた場合でも。残念ながら、このプロジェクトに取り組んでいる全員が常にバイナリ モードでファイルをコピーするとは保証できません。

4

3 に答える 3

2

Windows では、改行文字の\n先頭に\rまたはキャリッジ リターン文字が追加されます。これは Linux には存在しません。あるオペレーティング システムから別のオペレーティング システムにファイルを転送しても、そのような文字は除去または追加されませんが、場合によっては、テキスト エディターがそれらを自動フォーマットします。

ファイルには文字が含まれていないため\r(おそらく Linux から直接転送されたもの)、存在しない文字System.getProperty("line.separator")が返さ\r\nれ、考慮されます\r。これが、出力が 2 文字遅れている理由です。

幸運を!

于 2012-07-13T17:10:43.007 に答える
2

Unix ファイルはおそらくネイティブの Unix EOL char:\nを使用しますが、Windows ファイルはネイティブの Windows EOL シーケンス: を使用します\r\n。ファイルに 2 つの EOL があるため、2 文字の違いがあります。必ずバイナリ ファイル転送を使用してください。すべてのバイトが保持され、すべてが両方の OS で同じように実行されます。

編集: 実際、各行の末尾にOS 固有の EOL ( ) を追加するのはあなたです。System.getProperty("line.separator")Reader を使用してファイルを char 配列として読み取るだけで、すべて問題ありません。または、あなたのためにそれを行うグアバの方法を使用してください:

String s = CharStreams.toString(new FileReader(fileName)); 
于 2012-07-13T17:11:33.303 に答える
0

皆さんが提供した入力に基づいて、私はこのようなものを書きました

documentText  = CharStreams.toString(new FileReader("text.txt"));
documentText = this.documentText.replaceAll("\\r","");

ファイルに \r がある場合、余分な \r を取り除きます。

今、私はWindows環境とUNIXで期待される結果を得ています。問題が解決しました!!!

どのモードのファイルがコピーされたかに関係なく、正常に動作します。

:) 私はあなたの答えの両方を選ぶことができたらいいのにと思いますが、スタックオーバーフローは許可しません。

于 2012-07-13T18:51:21.810 に答える