Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
dskon
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 4
#1

Как правильно закрывать потоки ввода/вывода

24.10.2014, 11:16. Просмотров 1516. Ответов 6
Метки нет (Все метки)

Приветствую,

Разбираюсь с потоками ввода вывода, в частности с их закрытием, смотрю примеры и удивляюсь - везде пишут по разному. Где то закрывают и InputStreamReader и BufferedReader, где то только BufferedReader. Кто то делает try... catch вокруг reader. close(), кто то нет. В связи с этим подскажите, уважаемые гуру, вот такой код правильный или в нем есть проблемы? Надо ли все таки в finally делать try...catch или достаточно просто написать if (reader!=null) reader.close()?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private static  class ConnectionHandler implements Runnable{
        Socket socket;
        ConnectionHandler(Socket clientSocket) {
            socket=clientSocket;
        }
 
        @Override
        public void run() {
            BufferedReader reader=null;           
            try {
                reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String line=reader.readLine();
                System.out.println(line);
                OpenOption[] options = {StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.APPEND};
                Files.write(Paths.get("./myfile.log"), line.concat("\r\n").getBytes(), options);
 
            } catch (IOException e) {
                System.out.println("Read/write error");
 
            } finally {
                try {
                    if (reader!=null) reader.close();
                } catch (IOException e) {
                    System.out.println("Reader closing error");
                }
            }
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2014, 11:16
Ответы с готовыми решениями:

Потоки ввода/вывода
Проблема в том, что я не могу прочитать текстовый файл дважды, т.е. в первом...

Потоки ввода/вывода
Подскажите, пожалуйста, как мне переписать задачу, используя потоки...

Потоки ввода/вывода
Подскажите, пожалуйста! Решаю задачу И возникла проблема. Когда ввожу...

Буферизованные потоки ввода/вывода
Всем привет, помогите решить задачу с объяснением. Организовать построчное...

Буферизованные потоки ввода/вывода
Тема 5. (1) Буферизованные потоки ввода/вывода (2 часа) 1. Реализовать...

6
1ds
43 / 43 / 37
Регистрация: 11.12.2012
Сообщений: 200
Записей в блоге: 2
24.10.2014, 11:39 #2
Java
1
2
3
4
5
6
7
8
9
10
public void writeFile(){
        try(PrintWriter pw = new PrintWriter("filename.txt")) {
            pw.println("Некоторый текст");
            pw.close();
        } catch (FileNotFoundException e) {
            System.err.println(e.getMessage());
            System.exit(0);
        }
    
    }
0
reisal78
894 / 645 / 218
Регистрация: 28.04.2013
Сообщений: 1,842
24.10.2014, 11:55 #3
dskon, лучше проверить через if чем ловить очередное исключение.
0
dskon
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 4
24.10.2014, 12:46  [ТС] #4
1ds, чем в данном случае PrintWriter лучше чем Files.write?

Добавлено через 51 секунду
Цитата Сообщение от reisal78 Посмотреть сообщение
dskon, лучше проверить через if чем ловить очередное исключение.
то есть либо if, либо try... catch, обе конструкции не имеют смысла? Или Вы имеете ввиду что то другое?
0
turbanoff
Эксперт Java
4015 / 3750 / 741
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
24.10.2014, 16:24 #5
dskon, товарищ 1ds хотел показать, что нужно использовать try-with-resources, вместо try-catch-finally.

Добавлено через 54 секунды
Код, соответствующий try-with-resources можно посмотреть например здесь - http://stackoverflow.com/questions/7860137/what-is-the-java-7-try-with-resources-bytecode-equivalent-using-try-catch-finall
0
RatreX
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 2
25.01.2017, 22:55 #6
Господа, у меня такой вопрос. Как правильно закрывать поток в случае, когда метод вызывается не однократно ?
В классе Main метод checkPin вызывается дважды, так вот после успешной отработки 1го вызова и при попытке вызвать его второй раз выдаёт ошибку:
java.io.IOException: Stream closed

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public void checkPin() {
        System.out.print("Введите пинкод: ");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        Integer pin = 0;
        try {
            String pinTemp = reader.readLine();
            pin = Integer.parseInt(pinTemp);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        if (pin != 0 && currentCard.getPin() == (pin.hashCode())) {
            System.out.println(pin);
            System.out.println(currentCard.getPin());
        } else {
            System.out.println("Пинкод неверен");
            ejectCard();
        }
    }
0
Любопытный
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
26.01.2017, 08:15 #7
System.in не нужно закрывать.
1
26.01.2017, 08:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2017, 08:15

Стандартные потоки ввода и вывода
На стандартном потоке ввода задаётся последовательность целых чисел. Каждое...

Запись данных в файл(потоки ввода и вывода)
Всем привет, попробовал написать программу записи данных(ввод с клавиатуры) в...

Потоки ввода/вывода
System.out, System.err, System.in это всё переменные ссылки на объект типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru