Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > фильтрованные потоки


Автор: Sherst 29.4.2006, 23:56
Привет всем!

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

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


Хотелось бы узнать зачем конструктору класса передавать так много объектов, какая нам от этого польза. Честно говоря не совсем понятно что происходит в той строке.  

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

Автор: Sherst 30.4.2006, 10:43
В таком случае получается что создается 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 

Автор: garm 30.4.2006, 11:21
Цитата(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() возвращает ссылку на созданный объект, и, если её ничему не присвоить объект окажется недоступным. 

Автор: Sherst 30.4.2006, 11:57
Цитата

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


И какой же ?

 

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

Sherst, и вообще, а какая разница? ты все равнво может работать только с объектом потока на который у тебя ссылка есть остальные объекты для тебя не доступны. как только ты закроеш доступный для тебя объект, все объекты с ним связанные будут тоже закрыты и сборщик мусора их зачистит при ближайшем запуске. тебя собственно это заботить не должно. 

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

Автор: Sherst 30.4.2006, 12:26
Мне кажется такие тяжелые строки встречаются только при работе с потоками ...

garm, ALKS, LSD спасибо за разъяснения. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)