2010-11-28 18 views
0

Ich lerne die Grundlagen des Lesens aus Textdateien. Ich habe Code, der gut funktioniert, wenn alles in der Hauptmethode ist. Für diese Übung werde ich jedoch gebeten, die Methoden zum Öffnen und Schließen in separate Methoden zu integrieren. Die Methode open verwendet ein Argument (den Dateinamen) und die Methode close benötigt keine Argumente.Öffnen und Schließen von Dateien - separate Methoden

Die offene Methode funktioniert gut. Die enge Methode ist mein Problem.

import java.io.*; 
class EmpInFile 
{ 
    public static void main(String[] args) throws IOException { 
     EmpInFile myFile = new EmpInFile() ; 
     myFile.openFile("payslip.txt") ; 
     myFile.closeFile() ; 
    } // end main 

public void openFile(String filename) throws IOException { 
    String line ; 
    int numLines ; 
    // open input file 
    FileReader reader = new FileReader(filename) ; 
    BufferedReader in = new BufferedReader(reader) ; 
    numLines = 0 ; 
    // read each line from the file 
    line = in.readLine() ; // read first 
    while (line != null) 
    { 
     numLines++ ; 
     System.out.println(line) ; // print current 
     line = in.readLine() ; // read next line 
    } 
    System.out.println(numLines + "lines read from file") ; 
} // end openFile 

public void closeFile() throws IOException { 
    in.close() ; 
    System.out.println("file closed") ; 
    } // end closeFile 
} // end class 

Antwort

3

Um openFile und closeFile Daten gemeinsam nutzen zu können, müssen Sie diese Daten als Feld in die Klasse aufnehmen.

import java.io.*; 
class EmpInFile 
{ 
    // shared data here. 
    BufferedReader in; 

    public void openFile() { 
    ... set something in "in" 
    } 

    public void closeFile() { 
    ... close "in" 
    } 
+0

Er hat etwas in der offenen Methode eingestellt - es ist eine lokale Variable, keine Notwendigkeit, es zu übergeben. – duffymo

+0

Hallo Martin, vielen Dank. es funktioniert jetzt gut! Danke nochmal für deine Hilfe! – raoulbia

2

Sie müssen in ein Feld auf Klassenebene machen.

+0

Sie sollten wissen, wie dies aus der Klasse zu tun. – SLaks

4

Ich denke, das ist schlechtes Design. Ihre openFile() -Methode macht viel mehr als das - sie liest den kompletten Inhalt und gibt sie an die Konsole zurück (nutzlos, aber das ist es, was Sie tun).

Ich sehe nicht, welchen Wert Ihre close() -Methode bietet. Sie sollten besser eine Datei zum Schließen übergeben. Was haben Sie getan, als Sie die Methode einfach von java.io.File umschlossen haben? Behandeln Sie die Ausnahme zumindest, damit Benutzer dies nicht tun müssen.

Ich würde nicht empfehlen, Klassenvariablen zu verwenden. Sie können drei Methoden schreiben, die statisch sind, dass viel mehr von Nutzen sein wird:

package utils; 

public class FileUtils 
{ 
    public static Reader openFile(String fileName) throws IOException 
    { 
     return new FileReader(new File(fileName)); 
    } 

    public static List<String> readFile(String fileName) throws IOException 
    { 
     List<String> contents = new ArrayList<String>(); 

     BufferedReader br = null; 

     try 
     { 
      br = new BufferedReader(openFile(fileName)); 
      while ((String line = br.readLine()) != null) 
      { 
       contents.add(line); 
      } 
     } 
     finally 
     { 
      close(br); 
     } 


     return contents; 
    } 

    public static void close(Reader r) 
    { 
     try 
     { 
      if (r != null) 
      { 
       r.close(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Obwohl ich völlig zustimme, glaube ich, dass deine Antwort für einen Anfänger von geringem Wert ist. Zu kryptisch für jemanden, der nicht in das Thema involviert ist. –

+0

Code hinzugefügt - wie geht das? – duffymo

+0

IMHO definitiv besser. –

0

Ihr Dateizeiger nicht sichtbar in der close Methode. Um die Methoden open und close verwenden zu können, muss Ihre FileReader eine Mitgliedsvariable sein.

0

Ich möchte hier nur etwas hinzufügen. Es ist keine Antwort, sondern eine nützliche Information für Sie. Sie müssen BuffuredReader und FileReader nicht schließen. Es genügt, einen von BufferedReader zu schließen. Vorherige Frage wurde beantwortet here

Verwandte Themen