Наследник для FileInputStream Java

266
09 ноября 2017, 03:43

Задача написать класс, который в конструкторе будет принимать имя файла, если файл с расширением .txt, то создавать объект FileInputStream, если нет - выбрасывать исключение. Я попытался в самом начале сделать проверку на расширение, если txt, то вызывать конструктор суперкласса, ежели нет, то выбрасывать исключение, но ide ругается, что я обязательно должен вызвать конструктор суперкласса первой же строчкой.

public class TxtInputStream extends FileInputStream {
    FileInputStream fileInputStream;
    public TxtInputStream(String fileName) throws FileNotFoundException, UnsupportedFileNameException, IOException {
        String [] fileNameArray = fileName.split(" ");
        if (fileNameArray[fileNameArray.length].equals("txt"))
            this.fileInputStream = new FileInputStream(fileName);
        else {
            throw new UnsupportedFileNameException();
            super.close();
        }
    }
    public static void main(String[] args) {
    }
}

UPD добавлю требования к задаче:

1. Класс TxtInputStream должен наследоваться от класса FileInputStream.

2. Если в конструктор передан txt-файл, TxtInputStream должен вести себя, как обычный FileInputStream.

3. Если в конструктор передан не txt-файл, должно быть выброшено исключение UnsupportedFileNameException.

4. В случае выброшенного исключения, так же должен быть вызван super.close().

Answer 1
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class TxtReader {
    private final String FILE_NAME;
    public TxtReader(String fileName) {
        this.FILE_NAME=fileName;
    }
    private boolean checkName() {
        try {
            return ".txt".equals(FILE_NAME.substring(FILE_NAME.length() - 4));
        } catch (NullPointerException | StringIndexOutOfBoundsException e) {
            return false;
        }
    }
    public FileInputStream createFileInputStream() throws IOException, UnsupportedFileNameException {
        if (checkName()==false) throw new UnsupportedFileNameException();
        return new FileInputStream(FILE_NAME);
    }
    public List <String> loadTxtFile(FileInputStream fileInputStream) throws IOException{
        List <String>list = new ArrayList <>();
        try (BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream))) {
            String strLine;
            while ((strLine = br.readLine()) != null) list.add(strLine);
            return list;
        }
    }
    //for testing
    public static void main(String[] args) throws IOException {
        String fileName  = "catalog/file.txt";
        TxtReader txtReader = new TxtReader(fileName);
        FileInputStream inputStream = txtReader.createFileInputStream();
        List<String> loadTxtFile = txtReader.loadTxtFile(inputStream);
        for (String s : loadTxtFile) System.out.println(s);
    }
}

методом лоад можете даже прочитать построчно и получить соответсвующую коллекцию

Answer 2

Если наследник, то удалите переменную FileInputStream fileInputStream;

и конструктор будет выглядеть так:

 public TxtInputStream(String fileName) throws FileNotFoundException, UnsupportedFileNameException, IOException {
    super(fileName);
    if(!fileName.endsWith("txt")){
        throw new UnsupportedFileNameException();
    }
}

Если надо сделать как обертку:

тогда удаляем наследование и оставляем переменную FileInputStream fileInputStream;, только делаем её приватной.

тогда конструктор выглядит так:

public TxtInputStream(String fileName) throws FileNotFoundException, UnsupportedFileNameException, IOException {
    if(fileName.endsWith("txt"))
        fileInputStream = new FileInputStream(fileName);
    else{
        throw new UnsupportedFileNameException();
    }
}

но в этом случае необходимо создать нужные вам методы и перенаправить их в объект fileInputStream.

READ ALSO
Как получить список всех аудио-файлов? (Android)

Как получить список всех аудио-файлов? (Android)

Наткнулся на решение этой проблемы через Cursor, но насколько я понимаю, его состояние нужно обновлять принудительно, тк

258
Как подключить yandex speech api к xamarin forms(к кросс-платформенной)?

Как подключить yandex speech api к xamarin forms(к кросс-платформенной)?

Я пытаюсь написать голосового помощника, и решил для этого использовать yandex speech api, но тут возникла проблема, инструкция по настройке и установки...

253
Таблица из Excel в Word

Таблица из Excel в Word

Подскажите пожалуйста, как экспортировать таблицу из excel в wordПробовал вот так

367
Awesomium IWebView в WebView

Awesomium IWebView в WebView

Как преобразовать IWebView (WebCoreViews) в обычное WebView?

320