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?
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) –
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
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