# Datei zeilenweise einlesen



## Shadow (10. Oktober 2004)

Hallo !

Hoffentlich kann mir jemand bei meinem Problem helfen:
Ich muss aus einer kompremierten Datei zeilenweise auslesen.
Leider kenne ich nur die Methode readLine(), aber diese Idee klappt nicht.

Andere Methoden habe ich auch schon probiert, aber diese lesen nicht zeilenweise ein....

Bitte um Hilfe.

```
/**
   * Methode die die erste Zeile einer Dateil als Bookshop erkennt, und alle folgenden Zeilen
   * als Books. Es wird zuallerest die Zeilenanzahl ueberprueft, da es schon vorher zu einem
   * Abbruch kommen kann.
   * @param source Quelldatei
   * @return true, bei erfolgreichem Lesen
   */
  public static BookStore readBookStore(boolean unZip, String source) {
    BookStore bookStore=null;
    int lineCounter=0; // Variable fuer Anzahl der Lines in der Datei

    try {
      // da es passieren kann, dass eine Zeile leer ist, sieht man zuerst nach,
      // wie viele Zeilen die Date hat - könnte schon vorher abbrechen !
      lineCounter=0;

      Object inDataStream=null;
      GZIPInputStream readUnzip=null;
      if (unZip==true)
      {
        readUnzip =
            new GZIPInputStream( new FileInputStream( source+".gz" ) );
        inDataStream=readUnzip;
        lineCounter=readNrOfItems(source+".gz");
      }
      else
      {
        // Liest die Datei zeilenweise ein. Öffen, Befüllen eines BufferedReaders
        DataInputStream read =
            new DataInputStream(
            new BufferedInputStream(
// aus Datei:
            new FileInputStream(source)));
        inDataStream=read;
        lineCounter=readNrOfItems(source);
      }

      BookStore newBookStore=null;
      Vector newBooks=null;
      Book newBook=null;

      for (int i = 0; i < lineCounter; i++)
      {
        String line = inDataStream.readLine(); // hier ist der fehler
        if ( (line != null) && (line.length() > 0))
        {
          // parsing line
          if (i==0) // erste Zeile in der Datei -> bekanntlich die BookStore Daten....
          {
            String[] array = line.split(" "); // Array durch Leerzeichen erstellen lassen
            double id = Double.parseDouble(array[0]); // String in double umwandeln, damit man einen neuen Bookstore aufmachen kann
            int postalCode = Integer.parseInt(array[2]); // String in int umwandeln, damit man einen neuen Bookstore aufmachen kann

            newBookStore = new BookStore(id);
            newBookStore.setName(array[1]);
            newBookStore.setPostalCode(postalCode);
            System.out.print(newBookStore);
          }

          else // Regal des Shops mit Büchern befüllen
          {
            String[] array = line.split(" ## "); // alle Eingaben durch Leerzeichen trennen und in Array speichern

            for (int j=0; j<array.length; j++)
            {
              switch (j) // feld des arrays bestimmen - ab dem 3ten feld sind autoren vorzufinden
              {
                case 0:
                  newBook=new Book(array[j]);
                  System.out.println(newBook.getIsbn());
                  break;

                case 1:
                  newBook.setTitle(array[j]);
                  System.out.println(newBook.getTitle());
                  break;

                case 2:
                  double price = Double.parseDouble(array[j]);
                  newBook.setPrice(price);
                  System.out.println(newBook.getPrice());
                  break;

                default:
                  String [] newAuthors=new String[array.length-3]; // weil die ersten drei Felder keine Autoren sind
                  for (int x=3; x<array.length; x++)
                  {
                    newAuthors[x-3]=array[x];
                    System.out.print(" "+newAuthors[x-3]);
                  }
                  newBook.setAuthors(newAuthors);
                  newBookStore.addBook(newBook); // jetzt einfach das Bücherregal füllen
                  break;
              } // end switch
            } // end for Restarray mit Autoren durcharbeiten
          } // end else wenn die erste zeile kontrolliert wurde
        } // end if
      } // end for
      inDataStream.close(); // Datei zumachen !
      return newBookStore;
    }
    catch (Exception e)
    {
      // Input-Exceptions auffangen
      System.err.println("Dateizugriffsfehler: " + e.getLocalizedMessage());
      return null;
    }
  }
```


mfg
shadow


----------



## soa (10. Oktober 2004)

Durch Verschachtelung der beiden Eingabeströme ZipInputStream und FileInputStream können die Bytes der einzelnen Dateien, die in die Zip-Datei gepackt worden sind, gelesen werden. 

ZipInputStream zin = new ZipInputStream (new FileInputStream(args[0]));
StringBuffer br = new StringBuffer();
ZipEntry entry;
while ((entry = zin.getNextEntry()) != null){
	BufferedReader in = newBufferedReader(new InputStreamReader(zin));
	String line;
	while ((line = in.readLine()) != null){
		br.append(line);
	}
}


So könnte man das in etwa machen..

Gruß
soa


----------



## Shadow (10. Oktober 2004)

vielen dank !

habs aber ein wenig anders gelöst 

FileInputStream -> GZIPInputStream -> DataInputStream...

trotzdem danke 
mfg
shadow


----------

