Other/Java/InputOutput
From EduOmich
Как оказалось, что-то считать из консоли в Java на первый взгляд немного сложнее, чем в C++.
Рассмотрим такой пример:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
class Main
{
public static void main(String [] arg)
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
System.out.print(s);
}
catch (IOException ioe)
{
System.out.print("Line can't be read");
}
}
}
Напомню, что вход в вашу программу - это функция main. Оттуда программка начинает выполняться, а потом последовательно сверху вниз выполняет все записанные там команды, пока функция main не закончится. Когда закончится, ваша программка завершается.
Давайте начнём разбирать непонятные слова:
Contents |
Разбор примера
Слово import.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException;
эти строчки подключают всякие штуки, которые потом будут использоваться в программе. Дело в том, что в Java очень много разных классов, и компилятор не хочет заранее забивать ими голову. Кроме того, иногда бывает, что разные классы имеют одинаковые названия. Поэтому мы используем строчки import, чтобы сказать компилятору, что он должен забить себе голову конкретным классом. Название класса - это последнее слово, а перед ним через точки записан путь до него. Т.е. в строке
import java.io.BufferedReader;
| import | - | это ключевое слово, которое говорит, что надо подключить класс. |
| java.io | - | это путь до класса, пакет в котором он находится. Чтобы компилятор не спутал его с каким-нибудь другим классом. |
| BufferedReader | - | это название класса. |
Чтение из консоли.
Строчка
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
создаёт читалку из консоли. Из этой читалки можно читать строчки:
String str = br.realLine();
Запись в консоль.
Тут всё просто:
System.out.print(str);
выводит строчку str на экран.
Хитрые слова try, catch.
Это такой метод обработки ошибок, про который я расскажу чуть позднее. Но суть в том, что операция readLine может сгенерировать ошибку. То есть ввод с клавиатуры не состоялся, поэтому может оказаться так, что все дальнейшие действия не имеют смысла. То есть, если ввод произошёл успешно, то программа работает как работала. А если нет, то она генерирует ошибку и дальше не идёт.
Конструкцией try{....} мы говорим, что мы готовы к ошибкам, и словами catch мы указываем к каким именно ошибкам мы готовы, это указывается в круглых скобках. А в фигурных скобках мы пишем те действия, которые надо сделать, если мы поймали именно ту ошибку, которую хотели, мы там сейчас пишем сообщение, что строчка с клавиатуры не читается. Дальше программа будет выполняться как обычно (с места, где заканчивается последний catch).
Ну, наверное, непонятно объяснил, но тема рассуждений сейчас другая. Кто хочет лучще разобраться в такой обработке ошибок, можете начать с этой статьи в википедии и поискать что-нибудь по теме в Гугле (кстати, если найдёте хорошую и понятную статью, то скажите мне, пожалуйста. Буду её рекомендовать другим).
Вывод так же как у файлов.
Вы, наверное, заметили, что вывод в файлы немного отличается от вывода на консоль.
Давайте рассмотрим такой пример:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamReader;
import java.io.IOException;
class Main
{
public static void main(String [] arg)
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
br.close();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(s);
bw.close();
}
catch (IOException ioe)
{
System.out.print("Line can't be read");
}
}
}
Обратим внимание на строки:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); bw.write(s); bw.close();
Здесь создаётся писалка, которая привязывается к консольному выводу. Записывается туда прочитанная строчка. Писалка закрывается.
На первый взгляд может показаться, что мы усложнили, используем три строчки вместо одной. Но очень важно заметить, что команды
bw.write(s); bw.close();
здесь точно такие же, как для файлов. Это позволяет создавать алгоритмы, которые не зависят от того, куда именно мы записываем и откуда именно мы читаем. Просто записываем куда-то и всё. Тогда объект вывода мы можем легко подменять, не меняя остальной программы. Захотели - вывели в файл, захотели - на экран, легко.
Подробнее о механизмах ввода-вывода читайте тут: http://java.sun.com/j2se/1.5.0/docs/api/java/io/package-summary.html
Ввод-вывод чисел
Считать или записать вы можете только строки или символы. А чтобы получить числа, или записать их, вам следует превратить строки в числа и наоборот.
Пусть вы считали строку str, как тогда получать числа:
String str = "12"; int a1 = Integer.valueOf(str); str = "3.14159"; double b2 = Double.valueOf(str); double answer = b2 + a1; String str2 = Double.toString(answer);
Как-то так.