Java - Файлы и ввод-вывод
Пакет java.io содержит почти все классы, которые могут когда-либо понадобиться для выполнения ввода и вывода (ввода-вывода) в Java. Все эти потоки представляют собой источник ввода и место назначения вывода. Поток в пакете java.io поддерживает множество данных, таких как примитивы, объект, локализованные символы и т. Д.
Поток
Поток можно определить как последовательность данных. Есть два вида потоков -
InPutStream - InputStream используется для чтения данных из источника.
OutPutStream - OutputStream используется для записи данных в место назначения.
Java обеспечивает сильную, но гибкую поддержку ввода-вывода, относящегося к файлам и сетям, но в этом руководстве рассматриваются очень базовые функции, связанные с потоками и вводом-выводом. Мы рассмотрим наиболее часто используемые примеры один за другим -
Байтовые потоки
Потоки байтов Java используются для ввода и вывода 8-битных байтов. Хотя есть много классов, связанных с байтовыми потоками, но наиболее часто используемые классы:FileInputStream и FileOutputStream. Ниже приведен пример, в котором эти два класса используются для копирования входного файла в выходной файл.
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Теперь у нас есть файл input.txt со следующим содержанием -
This is test for copy file.
В качестве следующего шага скомпилируйте указанную выше программу и выполните ее, в результате чего будет создан файл output.txt с тем же содержанием, что и в input.txt. Итак, давайте поместим приведенный выше код в файл CopyFile.java и сделаем следующее:
$javac CopyFile.java
$java CopyFile
Потоки персонажей
Ява Byte потоки используются для ввода и вывода 8-битных байтов, тогда как Java Characterпотоки используются для выполнения ввода и вывода для 16-битного Unicode. Хотя есть много классов, связанных с символьными потоками, но наиболее часто используемые классы:FileReader и FileWriter. Хотя внутри FileReader использует FileInputStream, а FileWriter использует FileOutputStream, но здесь главное отличие состоит в том, что FileReader читает два байта за раз, а FileWriter записывает два байта за раз.
Мы можем переписать приведенный выше пример, в котором эти два класса используются для копирования входного файла (имеющего символы Unicode) в выходной файл -
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Теперь у нас есть файл input.txt со следующим содержанием -
This is test for copy file.
В качестве следующего шага скомпилируйте указанную выше программу и выполните ее, в результате чего будет создан файл output.txt с тем же содержанием, что и в input.txt. Итак, давайте поместим приведенный выше код в файл CopyFile.java и сделаем следующее:
$javac CopyFile.java
$java CopyFile
Стандартные потоки
Все языки программирования обеспечивают поддержку стандартного ввода-вывода, при котором программа пользователя может принимать ввод с клавиатуры, а затем выводить данные на экран компьютера. Если вы знакомы с языками программирования C или C ++, то должны знать три стандартных устройства: STDIN, STDOUT и STDERR. Точно так же Java предоставляет следующие три стандартных потока:
Standard Input - Это используется для передачи данных в программу пользователя, и обычно клавиатура используется в качестве стандартного потока ввода и представлена как System.in.
Standard Output - Это используется для вывода данных, созданных программой пользователя, и обычно экран компьютера используется для стандартного потока вывода и представлен как System.out.
Standard Error - Это используется для вывода данных об ошибках, созданных программой пользователя, и обычно экран компьютера используется для стандартного потока ошибок и представлен как System.err.
Ниже приводится простая программа, которая создает InputStreamReader для чтения стандартного потока ввода, пока пользователь не наберет «q» -
Example
import java.io.*;
public class ReadConsole {
public static void main(String args[]) throws IOException {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Enter characters, 'q' to quit.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while(c != 'q');
}finally {
if (cin != null) {
cin.close();
}
}
}
}
Сохраним приведенный выше код в файле ReadConsole.java и попробуем скомпилировать и выполнить его, как показано в следующей программе. Эта программа продолжает читать и выводить тот же символ, пока мы не нажмем 'q' -
$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q
Чтение и запись файлов
Как описано ранее, поток можно определить как последовательность данных. ВInputStream используется для чтения данных из источника и OutputStream используется для записи данных в место назначения.
Вот иерархия классов для работы с потоками ввода и вывода.
Два важных потока: FileInputStream и FileOutputStream, которые будут обсуждаться в этом руководстве.
FileInputStream
Этот поток используется для чтения данных из файлов. Объекты можно создавать с помощью ключевого словаnew и доступно несколько типов конструкторов.
Следующий конструктор принимает имя файла в виде строки для создания объекта входного потока для чтения файла:
InputStream f = new FileInputStream("C:/java/hello");
Следующий конструктор принимает объект файла для создания объекта входного потока для чтения файла. Сначала мы создаем файловый объект с помощью метода File () следующим образом:
File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);
Когда у вас есть объект InputStream , появляется список вспомогательных методов, которые можно использовать для чтения в поток или для выполнения других операций с потоком.
Sr. No. | Метод и описание |
---|---|
1 | public void close() throws IOException{} Этот метод закрывает поток вывода файла. Освобождает все системные ресурсы, связанные с файлом. Выдает исключение IOException. |
2 | protected void finalize()throws IOException {} Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает исключение IOException. |
3 | public int read(int r)throws IOException{} Этот метод считывает указанный байт данных из InputStream. Возвращает int. Возвращает следующий байт данных, и -1 будет возвращено, если это конец файла. |
4 | public int read(byte[] r) throws IOException{} Этот метод считывает байты r.length из входного потока в массив. Возвращает общее количество прочитанных байтов. Если это конец файла, будет возвращено -1. |
5 | public int available() throws IOException{} Указывает количество байтов, которое можно прочитать из входного потока этого файла. Возвращает int. |
Доступны и другие важные входные потоки, для получения более подробной информации вы можете обратиться к следующим ссылкам -
ByteArrayInputStream
DataInputStream
FileOutputStream
FileOutputStream используется для создания файла и записи в него данных. Поток создаст файл, если он еще не существует, прежде чем открыть его для вывода.
Вот два конструктора, которые можно использовать для создания объекта FileOutputStream.
Следующий конструктор принимает имя файла в виде строки для создания объекта входного потока для записи файла:
OutputStream f = new FileOutputStream("C:/java/hello")
Следующий конструктор принимает объект файла для создания объекта потока вывода для записи файла. Сначала мы создаем файловый объект с помощью метода File () следующим образом:
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
Когда у вас есть объект OutputStream , появляется список вспомогательных методов, которые можно использовать для записи в поток или для выполнения других операций с потоком.
Sr. No. | Метод и описание |
---|---|
1 | public void close() throws IOException{} Этот метод закрывает поток вывода файла. Освобождает все системные ресурсы, связанные с файлом. Выдает исключение IOException. |
2 | protected void finalize()throws IOException {} Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает исключение IOException. |
3 | public void write(int w)throws IOException{} Эти методы записывают указанный байт в выходной поток. |
4 | public void write(byte[] w) Записывает байты w.length из указанного байтового массива в OutputStream. |
Доступны и другие важные выходные потоки, для получения более подробной информации вы можете обратиться к следующим ссылкам -
ByteArrayOutputStream
DataOutputStream
Example
Ниже приведен пример, демонстрирующий InputStream и OutputStream.
import java.io.*;
public class fileStreamTest {
public static void main(String args[]) {
try {
byte bWrite [] = {11,21,3,40,5};
OutputStream os = new FileOutputStream("test.txt");
for(int x = 0; x < bWrite.length ; x++) {
os.write( bWrite[x] ); // writes the bytes
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for(int i = 0; i < size; i++) {
System.out.print((char)is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}
}
Приведенный выше код создаст файл test.txt и запишет заданные числа в двоичном формате. То же самое будет вывод на экран stdout.
Файловая навигация и ввод-вывод
Есть еще несколько классов, которые мы пройдем, чтобы познакомиться с основами файловой навигации и ввода-вывода.
Класс файла
FileReader класс
FileWriter Класс
Каталоги на Java
Каталог - это файл, который может содержать список других файлов и каталогов. Ты используешьFileобъект для создания каталогов, чтобы перечислить файлы, доступные в каталоге. Для получения полной информации просмотрите список всех методов, которые вы можете вызвать для объекта File, и методов, связанных с каталогами.
Создание каталогов
Есть два полезных File служебные методы, которые можно использовать для создания каталогов -
В mkdir( )создает каталог, возвращая истину в случае успеха и ложь в случае неудачи. Ошибка указывает на то, что путь, указанный в объекте File, уже существует или что каталог не может быть создан, так как весь путь еще не существует.
В mkdirs() создает как каталог, так и все его родители.
В следующем примере создается каталог «/ tmp / user / java / bin» -
Example
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
// Create directory now.
d.mkdirs();
}
}
Скомпилируйте и выполните приведенный выше код, чтобы создать "/ tmp / user / java / bin".
Note- Java автоматически заботится о разделителях путей в UNIX и Windows в соответствии с соглашениями. Если вы используете косую черту (/) в версии Java для Windows, путь все равно будет разрешен правильно.
Листинговые каталоги
Вы можете использовать list( ) метод, предоставленный File объект, чтобы перечислить все файлы и каталоги, доступные в каталоге, следующим образом:
Example
import java.io.File;
public class ReadDir {
public static void main(String[] args) {
File file = null;
String[] paths;
try {
// create new file object
file = new File("/tmp");
// array of files and directory
paths = file.list();
// for each name in the path array
for(String path:paths) {
// prints filename and directory name
System.out.println(path);
}
} catch (Exception e) {
// if any error occurs
e.printStackTrace();
}
}
}
Это даст следующий результат на основе каталогов и файлов, доступных в вашем /tmp каталог -
Output
test1.txt
test2.txt
ReadDir.java
ReadDir.class