2016-07-06 3 views
1

以下のコードは、2つのファイルをとり、重複しない値を見つけて別のファイルに出力するように記述されています。問題は静的メソッドreadFileのである読み込み中のファイルの行がArrayListに追加されないのはなぜですか?

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 

//keeps only uniques 
//remove all values that are duplicates 
public class dupeCleaner { 
    public static void main(String[]args){ 
     String fileA = "Testing1.txt"; 
     String fileB = "Testing2.txt"; 
     String[] uniques=clean(fileA,fileB); 
     writeFile("file.txt",uniques); 
    } 
    public static String[] clean(String fileA, String fileB){ 
     String line; 
     ArrayList<String> cleaned = new ArrayList<>(); 
     String[] list1 = readFile(fileA); 
     String[] list2 = readFile(fileB); 
     boolean[] firstList = new boolean[list1.length]; 
     for(int k = 0; k < list1.length;k++){ 
      firstList[k]=checkDupe(list1[k],list2); 
     } 
     for(int k = 0; k< list1.length;k++){ 
      if(firstList[k]){ 
       cleaned.add(list1[k]); 
       System.out.println(list1[k]); 
      } 
     } 
     String[] finalList = new String[cleaned.size()]; 
     finalList=cleaned.toArray(new String[cleaned.size()]); 
     return finalList; 
    } 
    public static void writeFile(String fileName, String[] list){ 
     try{ 
     BufferedWriter bw = new BufferedWriter(new FileWriter(fileName,true)); 
     for(String k: list){ 
      bw.write(k+"\r\n"); 
      bw.close(); 
     } 
     }catch(IOException e){ 
     } 
    } 
    public static boolean checkDupe(String var, String[] list){ 
     for(String k : list){ 
      if(k.equals(var)){ 
       System.out.println("true"); 
       return true; 
      } 
     } 
     System.out.println("false"); 
     return false; 
    } 
    public static String[] readFile(String fileName){ 
     ArrayList<String> vars = new ArrayList<>(); 
     String line; 
     try { 
      FileReader fr = new FileReader(fileName); 
      BufferedReader br = new BufferedReader(fr); 
      line = br.readLine(); 
      while (line != null) { 
       vars.add(line); 
       line = br.readLine(); 
      } 
     } catch (IOException e) { 

     } 
     System.out.println(vars.get(5)); 
     String[] list = vars.toArray(new String[vars.size()]); 
     return list; 
    } 
} 

、私は理解していない理由のSystem.out.println(vars.get(5)); IndexOutOfBoundsExceptionを返します。すべてのコードが意味を持ち、ファイルが確実に読み込まれています(たとえば、最初のファイルに100行あり、文字列を出力しただけではすべてがコンソールに出力されます)。

誰でも私の問題を明らかにすることができますか?

+1

、デバッガでコードを強化している:writeFile()にループからbw.close()文を削除しますか? – OldProgrammer

+3

私は99.9%のファイルが存在しないこと、 'new FileReader(fileName)'がその結果に対して 'IOException'をスローしたこと、そしてあなたのコードが**その例外をキャッチし**無視する'vars'は空のリストです。 **あなたのコードが正しく動作していない* – Andreas

答えて

1

bw.closeループをforループの外に含める必要があります。あなたがしているのは、ファイルに行を書き込んで、ファイルに最初の文字列だけを書き込むWriterを閉じることです。

try(BufferedWriter bw = new BufferedWriter(new FileWriter(fileName,true));){ 

    for(String k: list){ 
     bw.write(k+"\r\n");  
    } 
}catch(IOException e){ 
    //Handle exception 
} 
+1

'close()'呼び出しは、 'catch'の中に属していません。ブロック。 – VGR

+1

しかし、初期化を分割するという習慣があります。一つは 'FileWriter'、もう一つは' BufferedWriter'です。囲みオブジェクトが初期化中に失敗した場合、ラップされたオブジェクトは閉じられない可能性があります( 'BufferedWriter'や' FileWriter'のようなものではありません)。 –

+0

ああ、それは良いことです、ありがとう、それは仲間に感謝します。しかし、私が今取り組んでいる問題はあまりありません。私の問題は今ArrayListに変数を追加するときです。全く追加していないようです:/書くときに\t \t System.out。 println(vars.get(5));インデックス例外が発生しました – Vic

0

最初の問題は、コードが一意の値を保持していないことです。重複していることです。あなたのテキストファイルは重複していない可能性があります。そのため、IndexOutOfBoundsExceptionが届いています。 clean()方法で条件を変更して:あなたはforeachループでそれを閉じているために発生するだろう

if (!firstList[k]) 

第二の問題は、あなたが閉じられたファイルへの書き込みをしようとしているということです。まあ

for (String k : list) { 
    bw.write(k + "\r\n");  
} 
関連する問題