Форум программистов, компьютерный форум, киберфорум
Наши страницы

Java SE (J2SE)

Войти
Регистрация
Восстановить пароль
 
dskon
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 4
#1

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

24.10.2014, 11:16. Просмотров 1394. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как правильно закрывать потоки ввода/вывода (Java SE):

Потоки ввода/вывода - Java SE
Подскажите, пожалуйста, как мне переписать задачу, используя потоки ввода/вывода InputStream и OutputStream, обрабатывая при этом...

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

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

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

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

Потоки ввода/вывода - Java
System.out, System.err, System.in это всё переменные ссылки на объект типа InputStream и PrintStream? То есть неявно создается объект типа...

6
1ds
43 / 43 / 15
Регистрация: 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
890 / 641 / 149
Регистрация: 28.04.2013
Сообщений: 1,832
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
4004 / 3739 / 467
Регистрация: 18.05.2010
Сообщений: 9,316
Записей в блоге: 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 / 31
Регистрация: 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
Привет! Вот еще темы с ответами:

Потоки: как правильно работать с wait(), notify() и synchronized() на примере задачи? - Java SE
Задача: Есть производитель машин - Factory. Есть потребитель - Dealer. Они работают в двух потоках над общим складом. Factory производит и...

Начинающий. Операторы ввода вывода. - Java SE
Хотел бы узнать об операторах ввода-вывода на java и как они работают. Хочу ещё знать значения каждого слова System, out, println и...

Закрытие потока ввода/вывода - Java
Здравствуйте! Прошу не ругаться, если вопрос слишком простой и я отнял ваше время( Имеется метод InputString(), который считывает строку с...

Система ввода/вывода и сериализация - Java
Здравствуйте! Я начинаю программировать на JAVA и хотелось бы узнать такую вещь: У меня есть класс Person, который содержит разные...


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

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

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