Java предоставляет различные Streams в своём I/O package, которые помогают выполнять все операции ввода-вывода. Эти потоки поддерживают работу со всеми типами объектов, типами данных, символами, файлами и т.д., что позволяет полностью реализовывать операции ввода-вывода.
Ниже изображена схема, показывающая поток данных от источника к приёмнику.
Стандартные или дефолтные потоки в Java
Прежде чем рассматривать различные потоки ввода и вывода, рассмотрим три стандартных или дефолтных потока, которые предоставляет Java и которые используются чаще всего:
-
System.in:
Это стандартный поток ввода (standard input stream, System.in), который используется для чтения символов с клавиатуры или другого стандартного устройства ввода. - System.out:
Это стандартный поток вывода (standard output stream, System.out), который используется для вывода результата работы программы на устройство вывода, например на экран компьютера.
Ниже представлен список основных функций вывода, которые мы используем для отображения сообщений:
Функции вывода Java, используемые с System.out
Теперь рассмотрим основные функции вывода, используемые с System.out:
1. print():
Этот метод в Java выводит текст в консоль. Текст передаётся в метод в виде строки (String). При этом курсор остаётся в конце выведенного текста, и следующий вывод начнётся именно с этого места.
Синтаксис:
System.out.print(parameter);
Пример:
// Java program to illustrate print()
import java.io.*;
class Geeks {
public static void main(String[] args) {
// использование print()
// все выводы будут в одной строке
System.out.print("GfG! ");
System.out.print("GfG! ");
System.out.print("GfG! ");
}
}
Вывод:
GfG! GfG! GfG!
2. println():
Этот метод также выводит текст в консоль. После вывода курсор перемещается на начало следующей строки, и следующий вывод будет с новой строки.
Синтаксис:
System.out.println(parameter);
Пример:
// Java program to illustrate println()
import java.io.*;
class Geeks {
public static void main(String[] args) {
// использование println()
// каждый вывод на новой строке
System.out.println("GfG! ");
System.out.println("GfG! ");
System.out.println("GfG! ");
}
}
Вывод:
GfG!
GfG!
GfG!
3. printf():
Это самый простой из всех методов, так как он похож на printf в C. Обратите внимание, что System.out.print() и System.out.println() принимают один аргумент, тогда как printf() может принимать несколько аргументов. Этот метод используется для форматирования вывода.
Пример:
// Пример работы printf() в Java
class Geeks {
public static void main(String[] args) {
int x = 100;
// Вывод простого целого числа
System.out.printf("Printing simple integer: x = %d%n", x);
// Вывод числа с плавающей точкой с точностью
System.out.printf("Formatted with precision: PI = %.2f%n", Math.PI);
float n = 5.2f;
// Форматирование числа с 4 знаками после запятой
System.out.printf("Formatted to specific width: n = %.4f%n", n);
n = 2324435.3f;
// Выравнивание по правому краю и форматирование по ширине 20 символов
System.out.printf("Formatted to right margin: n = %20.4f%n", n);
}
}
Вывод:
Printing simple integer: x = 100
Formatted with precision: PI = 3.14
Formatted to specific width: n = 5.2000
Formatted to right margin: n = 2324435.2500
Пример использования System.err
Этот поток используется для отображения сообщений об ошибках. Он работает аналогично System.out с методами print(), println() и printf().
Пример:
// Пример использования System.err
public class Geeks {
public static void main(String[] args) {
// Использование print()
System.err.print("This is an error message using print().\n");
// Использование println()
System.err.println("This is another error message using println().");
// Использование printf()
System.err.printf("Error code: %d, Message: %s%n", 404, "Not Found");
}
}
Вывод:
This is an error message using print().
This is another error message using println().
Error code: 404, Message: Not Found
Типы потоков (Streams)
В зависимости от типа операций потоки можно разделить на два основных класса:
1. Input Stream:
Потоки, используемые для чтения данных с источника, например, из массива, файла или любого периферийного устройства ввода. Например: FileInputStream, BufferedInputStream, ByteArrayInputStream и др.
2. Output Stream:
Потоки, которые записывают данные в массив, файл или устройство вывода. Например: FileOutputStream, BufferedOutputStream, ByteArrayOutputStream и др.
Типы потоков в зависимости от типа файла
В зависимости от типа файла потоки можно разделить на два основных подтипа, которые далее делятся на классы (см. схему ниже) и описаны далее.
1. ByteStream:
Используется для обработки данных по байтам (8 бит). Среди множества классов наиболее популярны FileInputStream (для чтения) и FileOutputStream (для записи).
Ниже перечислены основные классы ByteStream:
Stream class | Описание |
---|---|
BufferedInputStream | Используется для буферизированного ввода |
DataInputStream | Содержит методы для чтения стандартных типов Java |
FileInputStream | Используется для чтения из файла |
InputStream | Абстрактный класс, описывающий поток ввода |
PrintStream | Содержит наиболее используемые print() и println() |
BufferedOutputStream | Используется для буферизированного вывода |
DataOutputStream | Содержит методы для записи стандартных типов Java |
FileOutputStream | Используется для записи в файл |
OutputStream | Абстрактный класс, описывающий поток вывода |
Пример:
// Java-программа, демонстрирующая ByteStream для копирования содержимого одного файла в другой.
import java.io.*;
public class Geeks {
public static void main(String[] args) throws IOException {
FileInputStream sourceStream = null;
FileOutputStream targetStream = null;
try {
sourceStream = new FileInputStream("sorcefile.txt"); // путь к исходному файлу
targetStream = new FileOutputStream("targetfile.txt"); // путь к целевому файлу
// Чтение исходного файла и посимвольная запись в целевой файл
int temp;
while ((temp = sourceStream.read()) != -1)
targetStream.write((byte) temp);
}
finally {
if (sourceStream != null)
sourceStream.close();
if (targetStream != null)
targetStream.close();
}
}
}
Вывод:
Показывает содержимое файла test.txt (или копирует содержимое между файлами).
2. CharacterStream:
В Java символы хранятся в формате Unicode. CharacterStream позволяет читать и записывать данные посимвольно. Наиболее популярные классы — FileReader (чтение) и FileWriter (запись).
Ниже приведён список основных классов CharacterStream:
Stream class | Описание |
---|---|
BufferedReader | Используется для буферизированного ввода |
FileReader | Поток ввода, читающий данные из файла |
InputStreamReader | Поток ввода, преобразующий байты в символы |
OutputStreamReader | Поток вывода, преобразующий символы в байты |
Reader | Абстрактный класс, определяющий поток ввода символов |
PrintWriter | Содержит часто используемые методы print() и println() |
Writer | Абстрактный класс, определяющий поток вывода символов |
BufferedWriter | Используется для буферизированного вывода |
FileWriter | Поток вывода, записывающий данные в файл |
Пример:
// Java-программа, демонстрирующая чтение файла в человекочитаемом формате с помощью FileReader
// Подключение FileReader, FileWriter и IOException
import java.io.*;
public class Geeks {
public static void main(String[] args) throws IOException {
FileReader sourceStream = null;
try {
sourceStream = new FileReader("test.txt"); // убедитесь, что файл test.txt находится в той же директории и содержит нужный текст
// Чтение файла и вывод содержимого посимвольно
int temp;
while ((temp = sourceStream.read()) != -1)
System.out.println((char) temp);
}
finally {
// Закрытие потока после использования
if (sourceStream != null)
sourceStream.close();
}
}
}
Примечание:
Убедитесь, что файл test.txt находится в той же директории, что и программа, и содержит текст, который необходимо прочитать.
🔑 Ключевые моменты:
- В Java стандартные потоки ввода/вывода — это System.in, System.out и System.err, которые используются для взаимодействия с пользователем и системы.
- Основные функции вывода System.out: print() (без перехода на новую строку), println() (с переходом) и printf() (форматированный вывод).
- Потоки в Java делятся на два типа: по направлению — Input Stream и Output Stream, и по типу — ByteStream для обработки байтов и CharacterStream для обработки символов.
- Классы ByteStream работают с необработанными байтами, а CharacterStream используют Unicode и позволяют работать с текстовыми данными символ за символом.
- При работе с файлами важно корректно закрывать потоки для освобождения ресурсов и предотвращения возможных ошибок.
Если у вас возникнут вопросы по работе с потоками в Java или по оптимальному выбору типа потока — обращайтесь!