Учебники

Java — Файлы и ввод / вывод

Пакет java.io содержит почти все классы, которые вам могут понадобиться для ввода и вывода (ввода / вывода) в Java. Все эти потоки представляют собой источник ввода и назначение вывода. Поток в пакете java.io поддерживает много данных, таких как примитивы, объекты, локализованные символы и т. Д.

Поток

Поток может быть определен как последовательность данных. Есть два вида потоков —

  • InPutStream — InputStream используется для чтения данных из источника.

  • OutPutStream — OutputStream используется для записи данных в пункт назначения.

InPutStream — InputStream используется для чтения данных из источника.

OutPutStream — OutputStream используется для записи данных в пункт назначения.

Streams

Java обеспечивает мощную, но гибкую поддержку ввода / вывода, относящуюся к файлам и сетям, но в этом руководстве рассматриваются базовые функции, связанные с потоками и вводом / выводом. Мы увидим наиболее часто используемые примеры один за другим —

Байтовые потоки

Потоки байтов Java используются для ввода и вывода 8-битных байтов. Хотя существует много классов, связанных с потоками байтов, но наиболее часто используемые классы — FileInputStream и FileOutputStream . Ниже приведен пример, который использует эти два класса для копирования входного файла в выходной файл:

пример

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

Потоки персонажей

Потоки байтов Java используются для ввода и вывода 8-битных байтов, тогда как потоки символов Java используются для ввода и вывода 16-битных юникодов. Хотя есть много классов, связанных с символьными потоками, но наиболее часто используемые классы — FileReader и FileWriter . Хотя внутренне FileReader использует FileInputStream, а FileWriter использует FileOutputStream, но здесь основное отличие состоит в том, что FileReader читает два байта за раз, а FileWriter записывает два байта за раз.

Мы можем переписать приведенный выше пример, в котором эти два класса используются для копирования входного файла (содержащего символы Юникода) в выходной файл —

пример

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 предоставляет следующие три стандартных потока:

  • Стандартный ввод — используется для подачи данных в пользовательскую программу, и обычно клавиатура используется в качестве стандартного потока ввода и представлена ​​как System.in .

  • Стандартный вывод — используется для вывода данных, созданных программой пользователя, и обычно для стандартного потока вывода используется экран компьютера, представленный как System.out .

  • Стандартная ошибка — используется для вывода данных об ошибках, созданных программой пользователя, и обычно для стандартного потока ошибок используется экран компьютера, представленный как System.err .

Стандартный ввод — используется для подачи данных в пользовательскую программу, и обычно клавиатура используется в качестве стандартного потока ввода и представлена ​​как System.in .

Стандартный вывод — используется для вывода данных, созданных программой пользователя, и обычно для стандартного потока вывода используется экран компьютера, представленный как System.out .

Стандартная ошибка — используется для вывода данных об ошибках, созданных программой пользователя, и обычно для стандартного потока ошибок используется экран компьютера, представленный как System.err .

Ниже приведена простая программа, которая создает InputStreamReader для чтения стандартного потока ввода, пока пользователь не введет «q» —

пример

Live Demo

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 используется для записи данных в место назначения.

Вот иерархия классов для работы с потоками ввода и вывода.

Файлы IO

Двумя важными потоками являются 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 () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

2

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

3

public int read (int r) выдает IOException {}

Этот метод читает указанный байт данных из InputStream. Возвращает int. Возвращает следующий байт данных, и -1 будет возвращено, если это конец файла.

4

public int read (byte [] r) выдает IOException {}

Этот метод считывает байты r.length из входного потока в массив. Возвращает общее количество прочитанных байтов. Если это конец файла, -1 будет возвращено.

5

public int available () выдает IOException {}

Дает количество байтов, которые могут быть прочитаны из этого потока ввода файла. Возвращает int.

public void close () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

public int read (int r) выдает IOException {}

Этот метод читает указанный байт данных из InputStream. Возвращает int. Возвращает следующий байт данных, и -1 будет возвращено, если это конец файла.

public int read (byte [] r) выдает IOException {}

Этот метод считывает байты r.length из входного потока в массив. Возвращает общее количество прочитанных байтов. Если это конец файла, -1 будет возвращено.

public int available () выдает 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 () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

2

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

3

public void write (int w) выдает IOException {}

Этот метод записывает указанный байт в выходной поток.

4

public void write (byte [] w)

Записывает байты w.length из упомянутого байтового массива в OutputStream.

public void close () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

public void write (int w) выдает IOException {}

Этот метод записывает указанный байт в выходной поток.

public void write (byte [] w)

Записывает байты w.length из упомянутого байтового массива в OutputStream.

Доступны и другие важные выходные потоки, более подробно вы можете обратиться к следующим ссылкам —

ByteArrayOutputStream

DataOutputStream

пример

Ниже приведен пример для демонстрации 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 и запишет заданные числа в двоичном формате. То же самое будет вывод на экране стандартного вывода.

Навигация по файлам и ввод / вывод

Есть несколько других классов, которые мы пройдем, чтобы познакомиться с основами файловой навигации и ввода-вывода.

Класс файла

Класс FileReader

Класс FileWriter

Каталоги на Java

Каталог — это файл, который может содержать список других файлов и каталогов. Вы используете объект File для создания каталогов, чтобы перечислить файлы, доступные в каталоге. Для получения полной информации, проверьте список всех методов, которые вы можете вызвать в объекте File, и что связано с каталогами.

Создание каталогов

Существует два полезных метода служебных файлов , которые можно использовать для создания каталогов:

  • Метод mkdir () создает каталог, возвращая true в случае успеха и false в случае ошибки. Ошибка указывает, что путь, указанный в объекте File, уже существует или что каталог не может быть создан, поскольку еще не существует полного пути.

  • Метод mkdirs () создает каталог и всех его родителей.

Метод mkdir () создает каталог, возвращая true в случае успеха и false в случае ошибки. Ошибка указывает, что путь, указанный в объекте File, уже существует или что каталог не может быть создан, поскольку еще не существует полного пути.

Метод mkdirs () создает каталог и всех его родителей.

Следующий пример создает каталог «/ tmp / user / java / bin» —

пример

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».

Примечание. Java автоматически позаботится о разделителях путей в UNIX и Windows в соответствии с соглашениями. Если вы используете косую черту (/) в версии Java для Windows, путь все равно будет корректным.

Каталоги листинга

Вы можете использовать метод list (), предоставленный объектом File, чтобы вывести список всех файлов и каталогов, доступных в каталоге, следующим образом:

пример

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

Выход