2016-03-26 9 views
0

Ich versuche, externe Merge-Sortierung zu tun. Methode: Öffnen Sie alle Dateien im Ordner 'output' und erhalten Sie die erste Zeile und sortieren Sie sie, und schreiben Sie es in die 'final' Datei und dann die zweite Zeile dieser Datei und wiederholen. Ich bekomme einen StackOverflowError. Hier ist meine Dateigröße größer als Speicher.StackOverflowError während der externen Sortierung

public class mergefile6 { 
    public static ArrayList<String> al = new ArrayList<String>(); 
    static HashMap hm = new HashMap(); 
    public static String line; 
    public static String[][] filepoint = new String[100][2]; 
    public static int fileline=1; 
    public static int i=0; 

    public static void main(String[] args) throws Exception{ 
     fileread(); 
    } 
    public static void fileread() throws Exception{  
     FileReader fileReader = null; 
     BufferedReader bufferedReader = null;  
    try { 
       File folder = new File("./output/");   
       if (folder.isDirectory()) { 
        for (File file : folder.listFiles()) { 
          fileReader = new FileReader(file); 
          bufferedReader = new BufferedReader(fileReader);   
          int lineCount = 0; 
         while ((line = bufferedReader.readLine())!=null) { 
           lineCount++; 
           if (1 == lineCount) { 
            hm.put(line,file); 
            al.add(line); 
            filepoint[i][0]=file.toString(); 
           filepoint[i][1]=Integer.toString(fileline); 
            ++i; 
           }            
          }    
        } 
       } 
       if (null != fileReader){ 
        try { 
          fileReader.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
     } 
     if (null != bufferedReader){ 
        try { 
          bufferedReader.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
     } 
     Sorting(al); 
     test(al); 
    } catch (Exception e) { 
    } finally { 
    } 
    } 
    public static void Sorting(ArrayList<String> al)throws Exception{ 
    int length = al.size(); 
    ArrayList<String> tmp = new ArrayList<String>(al); 
    mergeSort(al, tmp, 0, al.size() - 1); 
    } 
    private static void mergeSort(ArrayList<String> al, ArrayList<String> tmp, int left, int right){ 
    //sort code 
    } 

public static void test(ArrayList<String> al) throws Exception{ 
    BufferedWriter bw = null; 
    FileWriter fw = null; 
     fw = new FileWriter("final",true); 
     bw = new BufferedWriter(fw); 
     bw.write(al.get(0)+" \n"); 
     //bw.flush(); 
     bw.close(); 
     fw.close(); 
     String filename = hm.get(al.get(0)).toString(); 
     hm.remove(al.get(0)); 
     al.remove(0); 
     fileforward(filename,al); 
} 
public static void fileforward(String filename,ArrayList<String> al) throws Exception{ 
    long list; 
    FileReader fr = null; 
    BufferedReader br = null; 
    fr = new FileReader(filename); 
    br = new BufferedReader(fr); 
    for(int j=0;j<i;++j){ 
     if(filepoint[j][0] == filename){ 
      fileline = Integer.parseInt(filepoint[j][1]); 
      list = br.skip(99*fileline); 
      if((line = br.readLine())!=null){ 
       hm.put(line,filename); 
       al.add(line); 
       ++fileline; 
       filepoint[j][1]=Integer.toString(fileline); 
       br.close(); fr.close(); 
      }else{}    
     } 
    } 
    if(al.size()==3){ 
    Sorting(al); 
    test(al);  }        
} 
} 

Was kann dieser Fehler kommen verursachen?

+0

Fehler i erhalten ist: Exception in thread "main" java.lang.StackOverflowError \t bei java.util.Hashtable.hash (Hashtable.java:239) \t bei java.util.Hashtable.get (Hashtable .java-: 434) \t bei java.util.Properties.getProperty (Properties.java:951) \t bei java.lang.System.getProperty (System.java:711) \t bei sun.security.action.GetPropertyAction. run (GetPropertyAction.java:84) \t unter sun.security.action.GetPropertyAction.run (GetPropertyAction.java:49) unter java.security.AccessController.doP rivileged (Native Methode) bei java.io.BufferedWriter. (BufferedWriter.java:109) bei java.io.BufferedWriter. (BufferedWriter.java:88) –

+0

Sie sollten Ihren Kommentar als ein Update auf Ihre erste Frage platzieren. Sie können dies tun, indem Sie die Schaltfläche * edit * am Ende Ihrer Frage direkt hinter dem Abschnitt der Tags verwenden. – aribeiro

+0

Ihr Code ist ein Durcheinander. Im Test rufen Sie fileforward() auf und im Fileforward rufen Sie den Test erneut auf. Solche Rekursionen führen normalerweise zu einem Stapelüberlauf. Aber ich kann dir nicht im Detail helfen, weil ich deinen Code nicht verstehe und er nicht in meiner Eclipse läuft: test() erzeugt eine ArrayIndexOutBoundException, die nicht einmal von deinem Hauptprogramm abgefangen wird, und wenn sie erfasst würde, würde sie stillschweigend ignoriert. – Heri

Antwort

1

Es könnte ein Überlauf durch die gegenseitigen Anrufe zwischen fileforward() und test() auftreten. Ich weiß nicht versuchen, die Größe der ArrayList mit Protokollen oder Drucken zu debuggen. Wenn es immer gleich 3 ist, ist das Problem.

+0

: Ja .. Es sagt gleich 3, also was ist das Problem? Entschuldigung, ich bin neu und nicht sicher, was den Fehler verursacht. Hier habe ich 3 Eingabedateien, und die ArrayList speichert jeweils die erste Zeile, führt dann die Sortieroperation für sie aus, druckt die erste Zeile und entfernt diese Zeile aus der ArrayList und speichert Zeile2 aus dieser bestimmten Datei. Also sollte es 3 sein bis der EOF erreicht ist. –

+0

Sie rufen sich gegenseitig undefiniert auf, was zu einem Überlauf im Stack der Unterroutinen führt. Inter-Funktion Rekursion sollte nur unter kontrollierten Umgebungsbedingungen verwendet werden. Ich kann den Code nicht verstehen, daher kann ich Ihnen keinen Rat geben, wie er es schreiben soll. Versuchen Sie, das Problem zu überdenken, um es zu lösen, ohne die Interfunktionsrekursion zu verwenden. – Hellzzar

Verwandte Themen