[Java] Input/OutputStream und CSVPrinter

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Flyde, 25. Januar 2011 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 25. Januar 2011
    Input/OutputStream und CSVPrinter

    Hi, ich stürze mich seit gestern für ein Projekt in der FH in Java rein, komm an sich schon ganz gut klar damit und wollte jetzt eine CSV-Klasse schreiben, um eine CSV als Datenbank nutzen zu können.

    Als CSVParser und CSVPrinter nutze ich OstermillerUtils Java Utilities - Comma Separated Values (CSV)

    Mein momentanes Problem ist, das ich glaube ich noch nicht so ganz mit dem Stream klar komme, ich überschreibe mir ständig den alten Inhalt meiner CSV-Datei mit meinem CSVPrinter anstatt das er einfach eine weitere Zeile hinzufügt.

    Habe auch schon versucht vorher die Datei mit dem CSVParser in einen String[][] zu laden und diesen dann an den CSVWriter vor dem eintragen einer Zeile zu übergeben, gab aber eine null-Pointer exception (Code wurde entfernt)

    Hier mal die wichtigsten Methoden:


    UNIT-TEST -> Ist erfolgreich, test.csv wird erstellt, dennoch jedes mal neu überschrieben
    Code:
     public void testAddRow() {
     // Csv Objekt erzeugen
     /*
     * Fügt 2 Spalten in ein Objekt mit vorgabe 2 Spalten ein
     * Erwartet true
     */
     Csv csv1 = new Csv("test.csv", 2);
     assertEquals(true, csv1.addRow(new String[]{"foo", "bar,,, test"}));
    
     /*
     * Fügt 3 Spalten in ein Objekt mit vorgabe 2 Spalten ein
     * Erwartet false
     */
     Csv csv2 = new Csv("test.csv", 2);
     assertEquals(false, csv2.addRow(new String[]{"foo", "bar,,, test", "Test"}));
    
     }


    2 Methoden zum laden der CSV-File
    Code:
     /**
     *
     * Liest eine CSV-Datei in einen Input-Stream ein
     *
     * @return
     * <b>True</b>, wenn Datei erfolgreich in Stream geladen wurde.
     */
     private boolean readCsvFile()
     {
     // Return: Wenn Datei erfolgreich gelesen = true
     boolean isRead = false;
    
     this.csvFile = new File(this.path);
     isRead = true;
    
     if(!this.checkCsvFile(csvFile)) {
     isRead = false;
     }
    
     return isRead;
     }
    }
    Code:
     /**
     *
     * Prüft, ob File bereits existiert.
     * Falls nicht, wird diese erstellt.
     *
     * @param csvFile File-handle
     * @return
     * <b>True</b>, wenn Datei erfolgreich in Inputstream geladen wurde
     */
     private boolean checkCsvFile(File csvFile)
     {
     // Return: Wenn File erfolgreich in Stream geladen wurde = true
     boolean isFileLoaded = false;
    
     // Falls Datei nicht existiert, erstelle Datei
     try {
     if(!csvFile.exists())
     csvFile.createNewFile();
     }
     catch(IOException e) {
     e.printStackTrace();
     }
    
     /*
     * Datei in InputStream laden
     *
     * Stream wird später für den CSVParser benötigt
     */
     try
     {
     csvInputStream = new FileInputStream(csvFile);
     csvOutputStream = new FileOutputStream(csvFile);
    
     isFileLoaded = true;
     }
     catch(FileNotFoundException e)
     {
     e.printStackTrace();
     isFileLoaded = false;
     }
    
     return isFileLoaded;
     }
    Schließen des Streams
    Code:
     /**
     * Schließt die Filestreams
     */
     private void closeCsvFile() {
     try
     {
     this.csvInputStream.close();
     this.csvOutputStream.close();
     }
     catch(IOException e)
     {
     e.printStackTrace();
     }
    
     }
    Hinzufügen einer Zeile
    Code:
     /**
     * Fügt eine Zeile in die angegebene CSV-Datei hinzu
     *
     * @param data String-Array, Anzahl von data[] muss Anzahl der angegebenen Spalten entsprechen
     */
     public boolean addRow(String[] data)
     {
     // Return: Wenn Row added, dann true
     boolean isAdded = false;
    
     // Array muss = Anzahl der angegebenen Spalten groß sein
     if(data.length == this.colCount)
     {
     // Datei laden
     this.readCsvFile();
    
     // CSV-Printer
     CSVPrinter csvp = new CSVPrinter(this.csvOutputStream);
    
     // Zeile in Datei schreiben
     try
     {
     csvp.writeln(data);
     }
     catch(IOException e)
     {
     e.printStackTrace();
     }
    
     // Datei schließen
     this.closeCsvFile();
     isAdded = true;
     }
    
     return isAdded;
     }
     
  2. 26. Januar 2011
    AW: Input/OutputStream und CSVPrinter

    Ohne Gewähr aber teste mal

    csvOutputStream = new FileOutputStream(csvFile, true);

    statt

    csvOutputStream = new FileOutputStream(csvFile);

    der boolean wert gibt an, ob man den angegeben stream "erweitern" will
    (siehe http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html)
     
  3. 27. Januar 2011
    AW: Input/OutputStream und CSVPrinter

    hat funktioniert vielen dank!
    Hätte mir noch jahre gedanken drüber gemacht!
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.