2016-04-12 8 views
0

ファイルをストリーミングするバッファリングされたリーダーがあります。現在のところ2つのケースがあります:BufferedReaderが別のラインセパレータで混乱しています

1台のPCで生成されたファイルをストリーミングしています。ファイル1としましょう。 別のコンピュータで生成されたファイルをストリーミングしています。それをFile2としましょう。

私は自分の問題がEOLによって引き起こされていると仮定しています。

BufferedReaderは両方のファイルを読み込みますが、File2の場合はは改行ごとに余分な空行を読み込みます。また

、私はラインが、それは本当返さない​​であることを考えるとline.equalsIgnoreCase("abc")を、使用して線を比較します。どのように第二のファイルを印刷空行

public class JavaApplication { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException { 
    File file = new File("C:/Users/User/Downloads/html (2).htm"); 
    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); 
    String line = ""; 

    while ((line = in.readLine()) != null) { 
     System.out.println(line); 
    } 
} 

File1File2

注:

複製問題には2つのリンクに設けられた2つのファイルと一緒に使用このコードを各行の後に...

私は検索していますgを試して検索して試してみると解決策は思い付きませんでした。

これを修正する方法はありますか? (特に比較対象は?)

+0

'\ r'、CR、0x0dと' \ n'、LF、0x0aの間に混乱があると思います。 '\ n \ r'の代わりに' \ n \ r'を使うと、BufferedReaderは '\ n' = Unixスタイルと' \ r' =古いMacスタイルの2つの行を認識し、 '\ r \ n'はWindowsスタイル。 –

+0

'\ r \ n'が1行おきに空行を読むのであれば、それはもっと意味がありますが、それは' \ r'です... 私はこの答えを使って、それは完全に機能していません^^ http:// stackoverflow。com/a/13828045/3653975 – Maverick283

+0

@JoopEggenまだ問題は何ですか?私は、新しい行を取得するために使用するコードを表示するための答えを更新し、行を比較する...ヘルプは大いに感謝している – Maverick283

答えて

0

ジョープは、いくつかのより多くの研究、両方のファイルが自分のヘッダー内のUTF-16エンコーディングを指定しているにもかかわらず、のように思えるの後、一つはUTF-16でエンコードされた、正しかった、とUTF中(File1の)他-8。これは「二重線効果」につながる。 この質問に答えてくれた努力に感謝します。

+0

あなた自身の答えを正しいものとしてマークすることができると思います。これが実際の答えだったらあなたはそれをするべきです。 – markspace

+0

私はそれをやろうとしていましたが、できるまであなたは一日待つ必要があります;)あなたの助けをもう一度ありがとう! – Maverick283

1

私のために働きます。

public class CRTest 
{ 
    static StringReader test = new StringReader("Line 1\rLine 2\rLine 3\r"); 
    public static void main(String[] args) throws IOException { 
     BufferedReader buf = new BufferedReader(test); 
     for(String line = null; (line = buf.readLine()) != null;) 
     System.out.println(line); 
    } 
} 

プリント:ジョープが言ったように

run: 
Line 1 
Line 2 
Line 3 
BUILD SUCCESSFUL (total time: 1 second) 

、私はあなたが働いされていないファイルまで混合したと思います。上記のスケルトンを使用してMCVEを作成し、正確にどのファイル入力があなたにとってうまくいかないかを見せてください。


あなたが逆\r\nラインでファイルを持っているように見えるので、ここでは修正で私の最初の試みです。それを試してください、私はまだそれを試していない。 InputStreamReaderをこのクラスにラップしてから、普通のように外側にBufferedReaderをラップする必要があります。

class CRFix extends Reader 
{ 

    private final Reader reader; 
    private boolean readNL = false; 

    public CRFix(Reader reader) { 
     this.reader = reader; 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) 
      throws IOException 
    { 
     for(int i = off; i < off+len; i++) { 
     int c = reader.read(); 
     if(c == -1) 
      if(i == off) return -1; 
      else return i-off-1; 
     if(c == '\r' && readNL) { 
      readNL = false; 
      c = reader.read(); 
     } 
     if(c == '\n') 
      readNL = true; 
     else 
      readNL = false; 
     cbuf[i] = (char)c; 
     } 
     return len; 
    } 

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

} 
+0

申し訳ありませんが、私は逆の結果を返すどちらが使用するかを把握するために使用したメソッドを推測する...確かに。実際には逆であると仮定すると、行分離子が '\ r \ n'のときは2行ではなく、1行しか読み込まないようにするにはどうすればよいでしょうか? – Maverick283

+0

カスタムリーダーがそうすることができると思います。私に瞬間を与えてください... – markspace

+1

私は潜在的な修正で私の答えを更新しました。 – markspace

関連する問題