открывать и закрывать файлы - отдельные методы - PullRequest
0 голосов
/ 28 ноября 2010

Я изучаю основы чтения из текстовых файлов. У меня есть код, который работает нормально, если все в основном методе. Однако для этого упражнения меня просят разделить методы open и close на отдельные методы. Метод open принимает один аргумент (имя файла), а метод close - без аргументов.

Открытый метод работает отлично. Метод close - моя проблема.

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

Ответы [ 5 ]

4 голосов
/ 28 ноября 2010

Я думаю, что это плохой дизайн. Ваш метод openFile () делает гораздо больше - он читает все содержимое и выводит его на консоль (бесполезно, но вы это делаете).

Я не вижу, какое значение предоставляет ваш метод close (). Вам лучше передать файл, чтобы закрыть. Что вы сделали, когда просто обернули метод из java.io.File? По крайней мере, обработайте исключение, чтобы пользователи не должны были это делать.

Я бы не рекомендовал использовать переменные класса. Вы можете написать три статических метода, которые будут намного полезнее:

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();
        }
    }
}
2 голосов
/ 28 ноября 2010

Чтобы openFile и closeFile могли совместно использовать некоторые данные, вам нужно поместить эти данные в виде поля в классе.

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

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

   public void closeFile() {
     ... close "in"
   }
1 голос
/ 28 ноября 2010

Вам нужно сделать in полем уровня класса.

0 голосов
/ 29 ноября 2010

Я просто хочу добавить кое-что здесь. Это не ответ, а полезная информация для вас. Вам не нужно закрывать как BuffuredReader, так и FileReader. Достаточно закрыть любой из BufferedReader. Ответ на предыдущий вопрос здесь

0 голосов
/ 28 ноября 2010

Ваш указатель файла не виден в методе close. Чтобы иметь методы open и close, ваш FileReader должен быть переменной-членом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...