Понимание различных систем ввода / вывода Java
Я недавно читал учебники Java на oracle.com, и я пытаюсь понять ввод-вывод. Но есть так много вещей, многие из которых выглядят одинаково, например: Потоки данных Сканер Печатный принтер Буферизованные потоки Файл Потоки ввода / вывода Фильтрованные потоки и т. Д.
в частности, например, в чем разница между сканером и потоком данных?
поначалу я мог держать все это в стороне, но было слишком много потоков и операций ввода-вывода. Кто-нибудь знает хороший учебник или веб-сайт, который может все это прояснить. мое непонимание начинает раздражать.
2 ответа
Это сложный вопрос, чтобы ответить. Я знаю предыдущий, когда я изучал сетевое программирование, у меня была такая же путаница.
Вы можете взглянуть на учебные пособия Ларса Фогеля - он пишет хороший код, который облегчает понимание: http://www.vogella.com/tutorials/JavaIO/article.html
Также, если у вас есть хорошая книга, классы Java могут иметь больше смысла после того, как вы с ними познакомитесь. Эллиот "Расти" Гарольд делает хорошую книгу о сетевом программировании на Java: сетевое программирование на Java
Вам нужно ознакомиться с классами "java.io.*" и для чего каждый из них может быть использован. Есть причина, почему их так много, поскольку вы бы использовали один конкретный класс для одного типа приложения.
Scanner
можно прикрепить к File
, Stream
, или же String
, Readable
или все, что происходит от этих классов. Думайте об этом как о потребителе. Он ест вещи, когда вы просите об этом.
Stream
это источник. Некоторые входные потоки имеют сигнал, который говорит: "Я вне ввода!" Если вы продолжаете использовать поток, который уже находится вне ввода, Java обычно ожидает большего ввода или просто выдает исключение. Важно отметить, что когда поток используется, он исчезает навсегда. У некоторых читателей есть механизмы, которые "сбрасывают" поток на более раннюю точку, но эти причудливые механизмы раскола не являются частью стандартного потока. Думайте о них как о реках. Как только вы позволите течь части реки, она исчезнет.
System.in
это один из примеров InputStream
то есть по умолчанию подключен к консоли. Представьте, что он питается прямо с клавиатуры. Вы можете подключить к нему сканер и попытаться использовать ввод от пользователя. Сканер может захватывать набираемые вами вещи, но если вы не сохраните это в переменной, ваша клавиатура не будет набирать себя снова.