hubert
41 уровень

Уровень 18: план уровня и доп. материалы

Пост из группы Архив info.javarush.ru
3681 участников
План уровня:
  • Знакомство с потоками: InputStream/OutputStream, FileInputStream, FileOutputStream
  • Знакомство с потоками
  • Знакомство с InputStream, OutputStream, Reader, Writer
  • Примеры работы с FileInputStream, FileOutputStream
  • BufferedInputStream, ByteArrayInputStream
  • Шаблон проектирования «Обертка» (Wrapper/Decorator)
  • Буфер и буферизация
  • Знакомство с StringBuilder
На этом уровне потоки ввода-вывода рассматриваются выборочно. Дополнительное углубленное изучение будет на 31-32 уровнях.
Курс Java Что еще можно посмотреть на досуге: Декоратор или Wrapper/Обёртка Ввод и вывод в Java Обязательно прочтите еще раз мотивирующую статью http://kharkovitcourses.blogspot.de/2012/08/module-java-io.html
Нашли классную ссылку к материалу данной темы? Добавьте ее сюда в виде комментария. Возможно, именно Ваша ссылка поможет другому человеку стать программистом и улучшить свою жизнь!

Вернуться к плану обучения
Вернуться к обучению
java онлайн
на JavaRush
Комментарии (36)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизироваться
alexeyfrei 34 уровень, Минск
27 января 2017, 18:49
Вернулся назад почитать про IO и накнулся на такую вещь, которую в первый раз наверное даже не заметил. В части 6. код показывающий пример обертки:
class Cat
{
 private String name;
 public Cat(String name)
 {
  this.name = name;
 }
 public String getName()
 {
  return this.name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
}

И класс наследник от Cat

class CatWrapper extends Cat
{
 private Cat original;
 public CatWrapper (Cat cat)
 {
  this.original = cat;
 }

 public String getName()
 {
  return "Кот по имени " + original.getName();
 }

 public void setName(String name)
 {
  original.setName(name);
 }
}


Здесь, похоже, либо нужно явно описать конструктор без параметров в классе Cat либо в конструктор CatWrapper добаить super(cat.getName).
JuriMik 26 уровень, Харьков
27 января 2017, 20:08
Мы передаём уже созданный экземпляр класса Cat в CatWrapper
alexeyfrei 34 уровень, Минск
27 января 2017, 22:09
что-то я все равно не понимаю. Ведь конструктор базового класса вызывается автоматически, а т.к. в базовом классе определен конструктор с параметром, то и из наследника должен передаться параметр.
Я попробовал скомпилировать код в IDE и не вышло по выше озвученой причине. Что я делаю не так?
boyarskiy 21 уровень
24 января 2017, 21:34
Друзья, кто в курсе, подскажите как поступить. Вот ранее была дана ссылка не видеолекции Ивана Головоча по потокам. Она за 2013 год. Здесь дана ссылка на лекции по вводу-выводу, они за 2012 год. Как известно, у Ивана выложены записи курсов с одинаковой программой за разные периоды. Можно ли просматривать все темы из одного периода курсов, чтоб не скакать, или они по качесту отличаются, поэтому здесь и выкладывают из разных годов?
anshelen 36 уровень, Москва
24 января 2017, 14:07
Вот есть перевод хорошей статьи про кодировки (иногда помогает при работе с Reader, Writer)
Статья про кодировки
boyarskiy 21 уровень
20 января 2017, 21:36
Систематизация ввода-вывода Java.io.
mrANDERSON 26 уровень, Харьков
28 июля 2016, 19:19
Из лекции
flush при этом вызывается автоматически.
Но в спеке не сказано что flush() вызывется автоматически при вызове close(). К тому же Головач говорит что не вызывается — youtu.be/6YkGh8i2-go?t=1597. Подскажите, пожалуйста, кто точно знает(!) вызывается flush() автоматически при вызове close() или нет!??
Спасибо!

P.S. Спека — public void close()
throws IOException

Closes this output stream and releases any system resources associated with this stream. The general contract of close is that it closes the output stream. A closed stream cannot perform output operations and cannot be reopened.
boyarskiy 21 уровень
21 января 2017, 09:41
Походу лишним не будет. Согласно официальному оракловскому туториалу, какие-то классы вызывают flush() автоматически, а какие-то нет. Чтобы постоянно не лезть в мануал, думаю лучше взять за правило самому его вызывать перед close().

Flushing Buffered Streams

It often makes sense to write out a buffer at critical points, without waiting for it to fill. This is known as flushing the buffer.

Some buffered output classes support autoflush, specified by an optional constructor argument. When autoflush is enabled, certain key events cause the buffer to be flushed. For example, an autoflush PrintWriter object flushes the buffer on every invocation of println or format. See Formatting for more on these methods.

To flush a stream manually, invoke its flush method. The flush method is valid on any output stream, but has no effect unless the stream is buffered.

То есть PrintStream сам вызывает flush при каждом вызове println(), следоветельно его flush-ить перед закрытием нет смысла.
Что касается вопроса об автоматическом вызове flush после close, то явного ответа в документации лично я не нашёл (смотрел с JDK5 по JDK8), некотрые люди такое находили судя по записям со stackoverflow за 2012 год. Но тем не менее, на этом форуме отвечают, что вызов flush() перед close() это правила хорошего тона.
Есть
rhanza 27 уровень, Москва
8 июля 2016, 13:41
Здравствуйте. Возник вопрос по материалам 18 уровня, а конкретно по главе 4 «InputStream/OutputStream».
Приведу кусок кода и текст урока:

public static void main(String[] args) throws Exception
{

 //Создаем поток-чтения-байт-из-файла

 FileInputStream inputStream = newFileInputStream("c:/data.txt");

 // Создаем поток-записи-байт-в-файл

 FileOutputStream outputStream = newFileOutputStream("c:/result.txt");


  byte[] buffer = new byte[1000];

 while (inputStream.available() >0) //пока есть еще непрочитанные байты

 {

  // прочитать очередной блок байт в переменную buffer и реальное количество в count

  int count =inputStream.read(buffer);

  outputStream.write(buffer, 0, count); //записать блок(часть блока) во второй поток

 }


 inputStream.close(); //закрываем оба потока. Они больше не нужны.

 outputStream.close();
}


Конкретнее вот эта часть:

outputStream.write(buffer, 0, count); //записать блок(часть блока) во второй поток


Получается, что мы получаем в int count — реальное количество прочитанных байт (например 328). Следовательно, для записи необходимо взять именно эту часть массива (т.е. buffer [0] — buffer [327]). С учетом нуля получается 328 элементов, которые нам и надо прочитать.
В итоге часть когда, мне кажется, должна выглядеть следующим образом:

outputStream.write(buffer, 0, count-1);


Прав ли я? Возможно я что-то не понимаю, прошу ответить.
igor_kr 30 уровень
8 июля 2016, 14:33
Неправ!
Здесь:
from — номер ячейки, с которой нужно начинать читать
count — количество ячеек, которые нужно прочитать.
Не номер последней ячейки, а количество ячеек!!!
rhanza 27 уровень, Москва
8 июля 2016, 14:36
Благодарю. Впредь буду читать javadoc :)
mrANDERSON 26 уровень, Харьков
17 июля 2016, 14:41
from — номер ячейки, с которой нужно начинать читать
точнее индекс массива.

При решении 3й задачи 5го уровня все сразу становится ясно. Тем более если предварительно заглянуть джавадок (но этот метод стандартно реализован, тут можно и не заглядывать).
Alejandro_Kolio 30 уровень, Санкт-Петербург
18 февраля 2016, 16:59
Друзья, хочу поделиться с вами еще одной ссылкой на видеолекцию.
Очень нравится как объясняет, да другие лекции из этой серии тоже бомба
Java. Работа с файловой системой (лекция 6)
Inspiron 32 уровень
15 апреля 2016, 09:59
не сказал бы что прям бобма, Головач, на мой взгляд лучше объясняет и примеры даёт более понятные
eNdiD 23 уровень
23 февраля 2015, 23:12
В самом начале 6 лекции 18 уровня:

Однако:

Как же так?
eNdiD 23 уровень
24 февраля 2015, 01:24
Дошло. В начале лекции имеется в виду наследование в более широком смысле.
eNdiD 23 уровень
24 февраля 2015, 04:03
Однако, все же считаю, что задачи на применение декораторов неудачные. В них предлагается наследовать декорируемый класс, что в корне не соответствует паттерну декоратора. Декоратор может наследовать абстрактный класс, либо интерфейс, объединяющие декоратор с целевым классом. В случае же наследования класса, прийдется реализовывать конструктор суперкласса, что приведет к созданию лишнего экземпляра класса. Зачем? Я понимаю, что вы даете базу и предполагаете самостоятельное дальнейшее углубление в тему, но прошу, не стоит изначально давать некорректные примеры.
napeHb 21 уровень, Санкт-Петербург
17 апреля 2015, 16:08
Голову себе сломал с этими примерами и задачами из курса. Про этот паттерн пишут, что используется вместо наследования. А в этом курсе вместе с наследованием. Хотел тут уточнять уже, увидел ответ, который все разъяснил, спасибо.
eger 37 уровень, Санкт-Петербург
20 февраля 2015, 01:57
Вторая ссылка: «Ввод и вывод в Java» — не рабочая.
404 Not Found
MindIbniM 41 уровень
4 декабря 2014, 15:19
Не вполне понятно как согласуется утверждение
Декоратор предусматривает расширение функциональности объекта без определения подклассов.
с примером из лекции. CatWrapper банально наследует Cat, тем самым позволяя расширять функциональность за счет полиморфизма — через переопределение методов. Тот же getName() можно вызвать с помощью super. Таким образом и кода получится меньше.
P.S. Оправданным остается вариант из Вики, то есть работа на уровне интерфейсов.
napeHb 21 уровень, Санкт-Петербург
17 апреля 2015, 16:11
Очень неудачная лекция и задачи в ней. Запутали совсем меня, пока тут не почитал. Во всех источниках, где читал, этот шаблон используется вместо наследования, а тут вместе — отсюда путаница в голове.