Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> фильтрованные потоки 
:(
    Опции темы
Sherst
Дата 29.4.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Привет всем!

Такая строка нагоняет тоску :
Код

DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("file.txt")));


Хотелось бы узнать зачем конструктору класса передавать так много объектов, какая нам от этого польза. Честно говоря не совсем понятно что происходит в той строке.  
PM MAIL   Вверх
garm
Дата 30.4.2006, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.3.2006

Репутация: 2
Всего: 2



На самом деле конструктору класса ты передаёшь только один объект. Просто здесь этих конструкторов три штуки.
Давай по порядку:
Сначала ты создаешь поток, который берёт данные из файла(FileInputStream), соответственно указываешь имя этого файла.
Потом ты создаёшь фильтрующий поток, обеспечивающий тебе буферизацию ввода и некоторые другие возможноси(BufferedInputStream), ему в конструктор передаётся тот поток, для которого нужно сделать буферизацию.
И наконец ты создаёшь поток для чтения данных - DataInputStream. Он занимаеться тем, что полученные байты превращает в примитивные типы данных. Соответственно ему в конструктор передаётся поток, откуда эти байты брать.
А польза нам от всего этого такая, что, во-первых, мы сможем читать не сырые байты, а сразу нужные числа. И, во-вторых, будет использоваться буферизация. 
PM   Вверх
Sherst
Дата 30.4.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



В таком случае получается что создается 3 потока:
- файловый поток FileInputStream;
- фильтрующий поток BufferedInputStream;
- поток чтения данных DataInputStream;
Выходит, что объект здесь один - класса DataInputStream ?


Меня конечно смущает, что строка new FileInputStream("sd") не создает безымянный объект. Как-то это не понятно.

Приведу примерный класс:

Код

import java.io.*;

class Main {
  Main() {
    System.out.println("Main class...");
  }
}

class T extends Main{
  T() {
    System.out.println("T class...");
  }
}

class F1 extends Main{
  F1(Main u) {
    System.out.println("F1...");
  }
}

class F2 extends Main{
  F2(Main u) {
    System.out.println("F2...");
  }
}

public class Hello2 {
  public static void main(String[] args) {
    F1 g = new F1(new F2(new T()));
  }
}


Разве в последней строке не создаются безымянные объекты типов T, F2 ?
Никак не могу привыкнуть, что строка new ClassName() не создает никакого объекта smile 
PM MAIL   Вверх
garm
Дата 30.4.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.3.2006

Репутация: 2
Всего: 2



Цитата(Sherst @  30.4.2006,  14:43 Найти цитируемый пост)
В таком случае получается что создается 3 потока:

Нет, поток здесь будет один. Объекта для чтения из него - три.
Цитата(Sherst @  30.4.2006,  14:43 Найти цитируемый пост)
Выходит, что объект здесь один - класса DataInputStream ?

Как я уже сказал, объекта будет три, но ссылка у нас останется только на один объект - класса DataInputStram. На два остальных объекта ссылки тоже будут, только нам они не доступны.
Цитата(Sherst @  30.4.2006,  14:43 Найти цитируемый пост)
строка new FileInputStream("sd") не создает безымянный объект

Не совсем понял что есть безымянный объект. Объект, на который не указывает ни одна ссылка?
Цитата(Sherst @  30.4.2006,  14:43 Найти цитируемый пост)
Разве в последней строке не создаются безымянные объекты типов T, F2 ?

Создаются. Только существовать они будут до следующей сборки мусора.
Цитата(Sherst @  30.4.2006,  14:43 Найти цитируемый пост)
Никак не могу привыкнуть, что строка new ClassName() не создает никакого объекта

На самом деле создаёт. Другой разговор, что new ClassName() возвращает ссылку на созданный объект, и, если её ничему не присвоить объект окажется недоступным. 
PM   Вверх
Sherst
Дата 30.4.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Цитата

Нет, поток здесь будет один.


И какой же ?

 
PM MAIL   Вверх
ALKS
Дата 30.4.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 354
Регистрация: 22.3.2006

Репутация: 1
Всего: 11



создаеться 3 объекта-потока, а не 3 потока. грубо говоря, ссылаясь друг на друга они  в конце концов доходят до того единственного "на самом деле потока" FileInputStream который что-то делает. два остальных просто оберки, реализющие некоторый дополнительный функционал.

Sherst, и вообще, а какая разница? ты все равнво может работать только с объектом потока на который у тебя ссылка есть остальные объекты для тебя не доступны. как только ты закроеш доступный для тебя объект, все объекты с ним связанные будут тоже закрыты и сборщик мусора их зачистит при ближайшем запуске. тебя собственно это заботить не должно. 
PM   Вверх
LSD
Дата 30.4.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Тут будет 3 объекта которые расширяют InputStream, но только один из них будет связан с файловыми потоками ОС. Что считать потоком, а что нет, это вопрос терминологии. По мне так тут 3 потока. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Sherst
Дата 30.4.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Мне кажется такие тяжелые строки встречаются только при работе с потоками ...

garm, ALKS, LSD спасибо за разъяснения. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0834 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.