File.delete(file) geht nicht-Offener Stream aber WO?

Burny91

Mitglied
Hiho,
will eine Datei löschen. File.delete() funktioniert aber nicht weil ich anscheinend die Datei irgendwo noch geöffnet/ oder ein Stream nicht geschlossen habe... Könnt ihr mir vllt. helfen? Muss den Kram Montag abgeben. Kann mich langsam nicht mehr Konzentrieren.

Need Help Guys ;(

Java:
package Highscore;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
import java.util.ArrayList;

/**
 * 
 * @author Christian Brendes und Jacek Rzeniewicz CSVReader.java
 *Die Klasse CSVReader ist dafür da, um Einträge aus der
 *HighscoreData.csv Datei auszulesen und diese für die HighscoreTable aufzubereiten.
 */
public class CSVReader {

//    public String csvfile = "D:\\Schule\\Programmierung\\Java\\Timer_Highscore\\src\\Highscore\\highscoreData.csv";
    public String csvfile = "D:/Schule/Programmierung/Java/Timer_Highscore/src/Highscore/highscoreData.csv";
    URL myurl = this.getClass().getResource("res/test_1.csv");
    
    // Arrays für die jeweiligen Level werden erstellt
    private Object[][] easyList;
    private Object[][] mediumList;
    private Object[][] hardList;
    private Object[][] infernalList;
    private String[] split;

    /**
     *Beim Aufruf des CSVReader Objektes wird gleichzeitig die csv-Datei geladen.  
     */
    public CSVReader() {
        loadFile(csvfile);
    }
    
    /**
     * Prueft ob ein aktueller Wert in der Highscoreliste
     * @param url
     * @param level
     * @param score
     */
    public void checkMaxEntry(String url, String level, Integer newScore, String newName) {
        
        ArrayList<Integer> checkMax = searchArrayMax(csvfile);
                
        File oldCSV = new File("D:/Schule/Programmierung/Java/Timer_Highscore/src/Highscore/highscoreData.csv");
        Integer entryCounter = 0;
        Integer lineCounter = 0;
        Integer size;
        if (level.equals("EASY")) {
            size = checkMax.get(0);
        } else if (level.equals("MEDIUM")) {
            size = checkMax.get(1);
        } else if (level.equals("HARD")) {
            size = checkMax.get(2);
        } else {
            size = checkMax.get(3);
        }

        /*Wenn 10 Leveleintraege getan wurden, wird ueberprueft ob der neue Wert
         * besser ist als der schlechteste der Highscoreliste
         */
        if (size.equals(10)){
            Integer[][] levelEntries = new Integer[size][2];

            try {
                BufferedReader in = new BufferedReader(new FileReader(url));
                String zeile = null;

                //Es wird nach allen 10 Eintraegen des jeweiligen Levels gesucht
                while ((zeile = in.readLine()) != null) {
//                    System.out.println("Gelesene Zeile: " + zeile);
                    lineCounter++;
                    split = zeile.split(";");
                    
                    if (split[0].equals(level)) {
                        levelEntries[entryCounter][0] = lineCounter;
                        levelEntries[entryCounter][1] = new Integer(split[(2)]);
                        entryCounter++;
                    }
                }
                //
                Bubblesort mySortetArray = new Bubblesort();
                Integer[][] sortedLevelEntries = mySortetArray.bubbleSort(levelEntries);
                in.close();
                //Neuer Eintrag wird an der Stelle des Schlechtesten ueberschrieben
                if (sortedLevelEntries[0][1] > newScore){
                    lineReplace(url, level, newName, newScore.toString(), sortedLevelEntries);
                    
                //Ist der Wert schlechter erhaelt man keinen Eintrag in die Highscoreliste 
                }else{
                    System.out.println("Sorry zu schlecht!");
                }
                
                System.out.println("sortierteListe Eintrag [0][0]"+sortedLevelEntries[0][0]);
            
            in.close();
            // HighscoreDatei loschen
            deleteOldHighscore(oldCSV);
            
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            writeFile(csvfile, level, newName, newScore.toString());
        }
    }

    /**
     * searchArrayMax wird benötigt um die gesamten Einträge eines jeweiligen Levels zu berechnen.
     * Die wird für die maximale Arraygröße benötigt.
     * @param url
     * @return
     */
    public ArrayList<Integer> searchArrayMax(String url) {

        ArrayList<Integer> myLevelCount = new ArrayList<Integer>();

        try {
            BufferedReader in = new BufferedReader(new FileReader(url));
            String zeile = null;
            Integer lineCounter = 0;
            Integer easyC = 0;
            Integer mediumC = 0;
            Integer hardC = 0;
            Integer infernalC = 0;

            while ((zeile = in.readLine()) != null) {
                lineCounter++;
//                System.out.println("Gelesene Zeile:"+lineCounter+" "+zeile);
                split = zeile.split(";");

                if (split[0].equals("EASY")) {
                    easyC++;
                } else if (split[0].equals("MEDIUM")) {
                    mediumC++;
                } else if (split[0].equals("HARD")) {
                    hardC++;
                } else if (split[0].equals("INFERNAL")) {
                    infernalC++;
                }
            }
            myLevelCount.add(easyC);
            myLevelCount.add(mediumC);
            myLevelCount.add(hardC);
            myLevelCount.add(infernalC);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return myLevelCount;
    }

    /**
     * loadFile lädt die Highscoreeinträge aus der CSV-Datei und speichert sie in dem dazugehörigem LevelArray. 
     * @param url
     */
    public void loadFile(String url) {
        try {
            BufferedReader in = new BufferedReader(new FileReader(url));
            String zeile = null;
            
            // Da wir die maximalen Einträge eines Levels wissen wollen, wurden Counter angelegt
            int easyCount = 0;
            int mediumCount = 0;
            int hardCount = 0;
            int infernalCount = 0;
            
            // searchArrayMax wir einem Array hinzugefügt mit man danach die einzelnen maximalen Leveleinträge erhalten.
            ArrayList<Integer> maxCounts = searchArrayMax(url);
            Integer easyObj = (Integer) maxCounts.get(0);
            Integer mediumObj = (Integer) maxCounts.get(1);
            Integer hardObj = (Integer) maxCounts.get(2);
            Integer infernalObj = (Integer) maxCounts.get(3);

            /* Die LevelArray werden mit der richtigen Größe erstellt. Die zweite Dimension hat nur eine Größe von 2,
             * weil dort nur ein String Name und Integer Score benötigt.
            */
            easyList = new Object[easyObj][2];
            mediumList = new Object[mediumObj][2];
            hardList = new Object[hardObj][2];
            infernalList = new Object[infernalObj][2];

            //Datei wird Zeilenweise eingelsen
            while ((zeile = in.readLine()) != null) {
//                System.out.println("Gelesene Zeile: " + zeile);
                //Eingelesener String wird nach einem Semikolon getrennt.
                split = zeile.split(";");

                /*Eingelesene Zeilen werden nach Level untersucht. Dies ist der Erste Eintrag,
                 * der Zweite ist der Name und der Dritte ist die Punktzahl.
                 */
                if (split[0].equals("EASY")) {
                    easyList[easyCount][0] = split[(1)];
                    easyList[easyCount][1] = new Integer(split[(2)]);
                    easyCount++;
                } else if (split[0].equals("MEDIUM")) {
                    mediumList[mediumCount][0] = split[1];
                    mediumList[mediumCount][1] = new Integer(split[2]);
                    mediumCount++;
                } else if (split[0].equals("HARD")) {
                    hardList[hardCount][0] = split[1];
                    hardList[hardCount][1] = new Integer(split[2]);
                    hardCount++;
                } else if (split[0].equals("INFERNAL")) {
                    infernalList[infernalCount][0] = split[1];
                    infernalList[infernalCount][1] = new Integer(split[2]);
                    infernalCount++;
                }
            }
            
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void deleteOldHighscore( File file){
//        System.out.println(file.);
          if(file.exists()){
                file.delete();
                System.out.println("File deleted");
            }
    }
    
    public void lineReplace(String myurl, String level, String newName, String newTime, Integer[][] sortedList) {
        File oldCSV = new File("D:/Schule/Programmierung/Java/Timer_Highscore/src/Highscore/highscoreData.csv");
        String csvFileName = "highscoreData.csv";
        String tempFile = "D:\\Schule\\Programmierung\\Java\\Timer_Highscore\\src\\Highscore\\tmpFile.csv";
        Integer replaceLine = sortedList[0][0];
        Integer lineCounter = 0;
        BufferedWriter tmpFW;

        try {
            BufferedReader in = new BufferedReader(new FileReader(myurl));
            tmpFW = new BufferedWriter(new FileWriter(tempFile, true));
            String zeile = null;

            //Ersetzt folgende replaceLine mit neuer Zeile
            while ((zeile = in.readLine()) != null) {
                tmpFW.write(zeile);
                tmpFW.newLine();
                
                lineCounter++;
                System.out.println("----"+lineCounter+"----"+zeile);
                if (lineCounter == replaceLine-1){
                    zeile = in.readLine();
                } 
            }
            tmpFW.write(level.toUpperCase()+";"+newName+";"+newTime);
            tmpFW.newLine();
            
            tmpFW.close();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * writeFile schreibt einen Highscoreeintrag in die Highscoredatei.
     * Dieser Eintrag sieht wie folgt aus: Level;Name;Time\n
     * @param myurl
     * @param level
     * @param name
     * @param time
     */
    public void writeFile(String myurl, String level, String name, String time) {
        Writer f1;
        BufferedWriter f2;

        try {
            f1 = new FileWriter(myurl, true);
            f2 = new BufferedWriter(f1);
            f2.write(level.toUpperCase() + ";" + name + ";" + time);
            f2.newLine();

            f2.close();
            f1.close();
        } catch (IOException e) {
            System.out.println("Fehler beim Anhängen der Datei");
        }
    }
    
    /**
     * Gibt das zweidimensionale-Object-Array easyList zurück.
     * @return
     */
    public Object[][] getEasyList() {
        return easyList;
    }

    /**
     * Gibt das zweidimensionale-Object-Array mediumList zurück.
     * @return
     */
    public Object[][] getMediumList() {
        return mediumList;
    }

    /**
     * Gibt das zweidimensionale-Object-Array hardList zurück.
     * @return
     */
    public Object[][] getHardList() {
        return hardList;
    }

    /**
     * Gibt das zweidimensionale-Object-Array infernalList zurück.
     * @return
     */
    public Object[][] getInfernalList() {
        return infernalList;
    }

    public static void main(String args[]) {
        CSVReader r = new CSVReader();
//        r.writeFile(r.csvfile, "HARD", "hgg", "27183");
        r.checkMaxEntry(r.csvfile, "HARD", new Integer(22), "Slowenien");
    }
}
 
Du schließt nur den BufferedReader, der FileReader bleibt offen. Du musst es überall so umschreiben:

Java:
FileReader file_in = new FileReader(url);
BufferedReader in = new BufferedReader(file_in);
// Code ...
in.close();
file_in.close();

Slawa
 
Hab das hoffentlich so gemacht wie du es meintest, aber die Datei scheint immernoch offen zu sein.

=/

Java:
package Highscore;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
import java.util.ArrayList;

/**
 * 
 * @author Christian Brendes und Jacek Rzeniewicz CSVReader.java
 *Die Klasse CSVReader ist dafür da, um Einträge aus der
 *HighscoreData.csv Datei auszulesen und diese für die HighscoreTable aufzubereiten.
 */
public class CSVReader {

//    public String csvfile = "D:\\Schule\\Programmierung\\Java\\Timer_Highscore\\src\\Highscore\\highscoreData.csv";
    public String csvfile = "D:/Schule/Programmierung/Java/Timer_Highscore/src/Highscore/highscoreData.csv";
    URL myurl = this.getClass().getResource("res/test_1.csv");
    
    // Arrays für die jeweiligen Level werden erstellt
    private Object[][] easyList;
    private Object[][] mediumList;
    private Object[][] hardList;
    private Object[][] infernalList;
    private String[] split;

    /**
     *Beim Aufruf des CSVReader Objektes wird gleichzeitig die csv-Datei geladen.  
     */
    public CSVReader() {
        loadFile(csvfile);
    }
    
    /**
     * Prueft ob ein aktueller Wert in der Highscoreliste
     * @param url
     * @param level
     * @param score
     */
    public void checkMaxEntry(String url, String level, Integer newScore, String newName) {
        
        ArrayList<Integer> checkMax = searchArrayMax(csvfile);
                
        File oldCSV = new File("D:/Schule/Programmierung/Java/Timer_Highscore/src/Highscore/highscoreData.csv");
        Integer entryCounter = 0;
        Integer lineCounter = 0;
        Integer size;
        if (level.equals("EASY")) {
            size = checkMax.get(0);
        } else if (level.equals("MEDIUM")) {
            size = checkMax.get(1);
        } else if (level.equals("HARD")) {
            size = checkMax.get(2);
        } else {
            size = checkMax.get(3);
        }

        /*Wenn 10 Leveleintraege getan wurden, wird ueberprueft ob der neue Wert
         * besser ist als der schlechteste der Highscoreliste
         */
        if (size.equals(10)){
            Integer[][] levelEntries = new Integer[size][2];

            try {
                FileReader file_in = new FileReader(url);
                BufferedReader in = new BufferedReader(file_in);
                String zeile = null;

                //Es wird nach allen 10 Eintraegen des jeweiligen Levels gesucht
                while ((zeile = in.readLine()) != null) {
//                    System.out.println("Gelesene Zeile: " + zeile);
                    lineCounter++;
                    split = zeile.split(";");
                    
                    if (split[0].equals(level)) {
                        levelEntries[entryCounter][0] = lineCounter;
                        levelEntries[entryCounter][1] = new Integer(split[(2)]);
                        entryCounter++;
                    }
                }
                //
                Bubblesort mySortetArray = new Bubblesort();
                Integer[][] sortedLevelEntries = mySortetArray.bubbleSort(levelEntries);
                file_in.close();
                in.close();
                //Neuer Eintrag wird an der Stelle des Schlechtesten ueberschrieben
                if (sortedLevelEntries[0][1] > newScore){
                    lineReplace(url, level, newName, newScore.toString(), sortedLevelEntries);
                    
                //Ist der Wert schlechter erhaelt man keinen Eintrag in die Highscoreliste 
                }else{
                    System.out.println("Sorry zu schlecht!");
                }
                
                System.out.println("sortierteListe Eintrag [0][0]"+sortedLevelEntries[0][0]);
            
            file_in.close();
            in.close();
            // HighscoreDatei loschen
            deleteOldHighscore(oldCSV);
            
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            writeFile(csvfile, level, newName, newScore.toString());
        }
    }

    /**
     * searchArrayMax wird benötigt um die gesamten Einträge eines jeweiligen Levels zu berechnen.
     * Die wird für die maximale Arraygröße benötigt.
     * @param url
     * @return
     */
    public ArrayList<Integer> searchArrayMax(String url) {

        ArrayList<Integer> myLevelCount = new ArrayList<Integer>();

        try {
            FileReader file_in = new FileReader(url);
            BufferedReader in = new BufferedReader(file_in);
            String zeile = null;
            Integer lineCounter = 0;
            Integer easyC = 0;
            Integer mediumC = 0;
            Integer hardC = 0;
            Integer infernalC = 0;

            while ((zeile = in.readLine()) != null) {
                lineCounter++;
//                System.out.println("Gelesene Zeile:"+lineCounter+" "+zeile);
                split = zeile.split(";");

                if (split[0].equals("EASY")) {
                    easyC++;
                } else if (split[0].equals("MEDIUM")) {
                    mediumC++;
                } else if (split[0].equals("HARD")) {
                    hardC++;
                } else if (split[0].equals("INFERNAL")) {
                    infernalC++;
                }
            }
            myLevelCount.add(easyC);
            myLevelCount.add(mediumC);
            myLevelCount.add(hardC);
            myLevelCount.add(infernalC);

            /* Muss ich hier nicht die Datei schließn??
             * 
             * in.close();
             * file_in.close();
             */
            
        } catch (IOException e) {
            e.printStackTrace();
        }

        return myLevelCount;
    }

    /**
     * loadFile lädt die Highscoreeinträge aus der CSV-Datei und speichert sie in dem dazugehörigem LevelArray. 
     * @param url
     */
    public void loadFile(String url) {
        try {
            FileReader file_in = new FileReader(url);
            BufferedReader in = new BufferedReader(file_in);
            String zeile = null;
            
            // Da wir die maximalen Einträge eines Levels wissen wollen, wurden Counter angelegt
            int easyCount = 0;
            int mediumCount = 0;
            int hardCount = 0;
            int infernalCount = 0;
            
            // searchArrayMax wir einem Array hinzugefügt mit man danach die einzelnen maximalen Leveleinträge erhalten.
            ArrayList<Integer> maxCounts = searchArrayMax(url);
            Integer easyObj = (Integer) maxCounts.get(0);
            Integer mediumObj = (Integer) maxCounts.get(1);
            Integer hardObj = (Integer) maxCounts.get(2);
            Integer infernalObj = (Integer) maxCounts.get(3);

            /* Die LevelArray werden mit der richtigen Größe erstellt. Die zweite Dimension hat nur eine Größe von 2,
             * weil dort nur ein String Name und Integer Score benötigt.
            */
            easyList = new Object[easyObj][2];
            mediumList = new Object[mediumObj][2];
            hardList = new Object[hardObj][2];
            infernalList = new Object[infernalObj][2];

            //Datei wird Zeilenweise eingelsen
            while ((zeile = in.readLine()) != null) {
//                System.out.println("Gelesene Zeile: " + zeile);
                //Eingelesener String wird nach einem Semikolon getrennt.
                split = zeile.split(";");

                /*Eingelesene Zeilen werden nach Level untersucht. Dies ist der Erste Eintrag,
                 * der Zweite ist der Name und der Dritte ist die Punktzahl.
                 */
                if (split[0].equals("EASY")) {
                    easyList[easyCount][0] = split[(1)];
                    easyList[easyCount][1] = new Integer(split[(2)]);
                    easyCount++;
                } else if (split[0].equals("MEDIUM")) {
                    mediumList[mediumCount][0] = split[1];
                    mediumList[mediumCount][1] = new Integer(split[2]);
                    mediumCount++;
                } else if (split[0].equals("HARD")) {
                    hardList[hardCount][0] = split[1];
                    hardList[hardCount][1] = new Integer(split[2]);
                    hardCount++;
                } else if (split[0].equals("INFERNAL")) {
                    infernalList[infernalCount][0] = split[1];
                    infernalList[infernalCount][1] = new Integer(split[2]);
                    infernalCount++;
                }
            }
            file_in.close();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void deleteOldHighscore( File file){
//        System.out.println(file.);
          if(file.exists()){
                file.delete();
                System.out.println("File deleted");
            }
    }
    
    public void lineReplace(String myurl, String level, String newName, String newTime, Integer[][] sortedList) {
        File oldCSV = new File("D:/Schule/Programmierung/Java/Timer_Highscore/src/Highscore/highscoreData.csv");
        String csvFileName = "highscoreData.csv";
        String tempFile = "D:\\Schule\\Programmierung\\Java\\Timer_Highscore\\src\\Highscore\\tmpFile.csv";
        Integer replaceLine = sortedList[0][0];
        Integer lineCounter = 0;
        BufferedWriter tmpFW;

        try {
            FileReader file_in = new FileReader(myurl);
            BufferedReader in = new BufferedReader(file_in);
            tmpFW = new BufferedWriter(new FileWriter(tempFile, true));
            String zeile = null;

            //Ersetzt folgende replaceLine mit neuer Zeile
            while ((zeile = in.readLine()) != null) {
                tmpFW.write(zeile);
                tmpFW.newLine();
                
                lineCounter++;
                System.out.println("----"+lineCounter+"----"+zeile);
                if (lineCounter == replaceLine-1){
                    zeile = in.readLine();
                } 
            }
            tmpFW.write(level.toUpperCase()+";"+newName+";"+newTime);
            tmpFW.newLine();
            
            tmpFW.close();
            file_in.close();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * writeFile schreibt einen Highscoreeintrag in die Highscoredatei.
     * Dieser Eintrag sieht wie folgt aus: Level;Name;Time\n
     * @param myurl
     * @param level
     * @param name
     * @param time
     */
    public void writeFile(String myurl, String level, String name, String time) {
        Writer f1;
        BufferedWriter f2;

        try {
            f1 = new FileWriter(myurl, true);
            f2 = new BufferedWriter(f1);
            f2.write(level.toUpperCase() + ";" + name + ";" + time);
            f2.newLine();

            f2.close();
            f1.close();
        } catch (IOException e) {
            System.out.println("Fehler beim Anhängen der Datei");
        }
    }
    
    /**
     * Gibt das zweidimensionale-Object-Array easyList zurück.
     * @return
     */
    public Object[][] getEasyList() {
        return easyList;
    }

    /**
     * Gibt das zweidimensionale-Object-Array mediumList zurück.
     * @return
     */
    public Object[][] getMediumList() {
        return mediumList;
    }

    /**
     * Gibt das zweidimensionale-Object-Array hardList zurück.
     * @return
     */
    public Object[][] getHardList() {
        return hardList;
    }

    /**
     * Gibt das zweidimensionale-Object-Array infernalList zurück.
     * @return
     */
    public Object[][] getInfernalList() {
        return infernalList;
    }

    public static void main(String args[]) {
        CSVReader r = new CSVReader();
//        r.writeFile(r.csvfile, "HARD", "hgg", "27183");
        r.checkMaxEntry(r.csvfile, "HARD", new Integer(22), "Slowenien");
    }
}
 
Hab den Fehler gefunden. hab in der Methode searchArrayMax() das gemacht was du gesagt hast und schwuppst meine Datei wurde gelöscht! 🙂
das ist gut. Noch ein Hinweis. Man sollte verschachtelte Streams in der umgekehrten Reihenfolge schließen, wie man sie aufgemacht hat. Beispiel:

Stream 1 öffnen
Stream 2 öffnen
Stream 3 öffnen
...
Stream 3 schließen
Stream 2 schließen
Stream 1 schließen

Ansonsten könnte Datenverlust entstehen und man muss stundenlang nach dem Fehler suchen. Das selbe Vorgehen empfehle ich auch bei BufferedWriter bzw. FileWriter. Wenn man diese nicht bewusst in der richtigen Reihenfolge schließt, können beim Beenden des Programms Daten in der Ausgabedatei fehlen.

Slawa
 

Zurück
Oben