Java. Байтовые потоки. Классы DataInputStream, DataOutputStream, FileInputStream, FileOutputStream. Примеры использования
Байтовые потоки. Классы DataInputStream , DataOutputStream , FileInputStream , FileOutputStream . Примеры использования
В данной теме продемонстрировано использование средств языка Java для работы с байтовыми потоками. Приведены примеры распространенных задач для решения которых используются классы DataInputStream , DataOutputStream , FileInputStream , FileOutputStream .
Поиск на других ресурсах:
1. Запись и чтение одномерного массива типа int[] в байтовый файловый поток. Пример
Пусть задан одномерный массив типа int[] , который нужно:
Для решения данной задачи хорошо подойдутклассы:
- DataInputStream – поток ввода, который содержит методы для чтения данных стандартных типов Java, к которым принадлежит тип int ;
- DataOutputStream – поток вывода, который содержит методы для записи данных стандартных типов, определенных в Java;
- FileInputStream – поток ввода, который содержит методы, читающие данные из файла;
- FileOutputStream – поток вывода, который содержит методы, записывающие данные в файл.
Чтобы организовать запись данных в файл нужно:
- создать файловый поток типа FileOutputStream ;
- созданный файловый поток поместить в конструктор DataOutputStream ;
- использовать методы класса DataOutputStream для записи данных в файл.
Чтобы организовать чтение данных из файла нужно:
- создать файловый поток типа FileInputStream ;
- новосозданный файловый поток поместить в конструктор DataInputStream ;
- использовать методы класса DataInputStream для чтения данных из файла.
import java.io.*; . public static void main(String[] args) throws IOException < // Исходные данные - некоторый массив целых чисел int[] arrInt = < 2, 5, -1, 100, 33 >; // 1. Записать массив arrInt в байтовый файл "integers.bin" // 1.1. Создать файловый байтовый поток, связанный с именем "integers.bin" FileOutputStream fs = new FileOutputStream("integers.bin"); // 1.2. Создать байтовый поток, содержащий методы чтения данных примитивных типов DataOutputStream ds = new DataOutputStream(fs); // 1.3. Записать количество элементов в массиве - используется метод write() ds.writeInt(arrInt.length); // 1.4. Записать массив целых чисел for (int i=0; iint)arrInt[i]); // 1.5. Закрыть файл "integers.bin" fs.close(); // ----------------------------------------------------------------- // 2. Считать массив целых чисел из байтового файла "integers.bin" int[] arrInt2; // массив, в который будут считаны данные из файла "integers.bin" // 2.1. Создать файловый поток, связанный с именем "integers.bin" FileInputStream fs2 = new FileInputStream("integers.bin"); // 2.2. Создать поток данных, связанный с файловым потоком fs2 DataInputStream ds2 = new DataInputStream(fs2); // 2.3. Считать количество целочисленных элементов, которые записаны в файле int count = ds2.readInt(); // 2.4. Выделить память для массива arrInt2 arrInt2 = new int[count]; // 2.5. Цикл чтения данных из ds2 и копирование их в массив arrInt2 for (int i=0; i // 2.6. Закрыть поток ds2 ds2.close(); // -------------------------------------------------------------- // 3. Вывести массив arrInt2 для контроля System.out.println("Array arrInt2: "); for (int i=0; iout.println(arrInt2[i]); >
Результат выполнения программы
Array arrInt2: 2 5 -1 100 33
2. Запись и чтение данных разных типов ( double , int , char ). Пример
- записать в файл последовательно значения переменных типов double , int , char ;
- прочитать значение переменных типов double , int , char .
import java.io.*; . public static void main(String[] args) throws IOException < // Исходные данные - значения double, int, char // 1. Запись данных // 1.1. Создать файловый байтовый поток, связанный с именем "data.bin" FileOutputStream fs = new FileOutputStream("data.bin"); // 1.2. Создать байтовый поток, содержащий методы чтения данных примитивных типов DataOutputStream ds = new DataOutputStream(fs); // 1.3. Записать число типа double ds.writeDouble(5.85); // 1.4. Записать число типа int ds.writeInt(2000); // 1.5. Записать символ типа char ds.writeChar('Z'); // 1.6. Закрыть файл "data.bin" fs.close(); // ---------------------------------------------------------------- // 2. Считать данные из байтового файла "data.bin" в переменные doubleData, intData, charData double doubleData; int intData; char charData; // 2.1. Создать файловый поток, который связан с именем "data.bin" FileInputStream fs2 = new FileInputStream("data.bin"); // 2.2. Создать поток данных, связанный с файловым потоком fs2 DataInputStream ds2 = new DataInputStream(fs2); // 2.3. Считать число типа double doubleData = ds2.readDouble(); // 2.4. Считать число типа int intData = ds2.readInt(); // 2.5. Считать число типа char charData = ds2.readChar(); // 2.6. Закрыть поток ds2 ds2.close(); // ------------------------------------------------------------- // 3. Вывести данные для контроля System.out.println("doubleData color: #0000ff;">out.println("intData color: #0000ff;">out.println("charData color: #333300;">⇑3. Запись и чтение массива вещественных чисел в байтовый файл. Пример
В примере сначала в файл записывается массив чисел типа double, затем этот массив читается во внутренние структуры данных и выводится на экран. Используются классы FileOutputStream, DataOutputStream, FileInputStream, DataInputStream.
import java.io.*; . public static void main(String[] args) throws IOException < // Запись массива вещественных чисел в байтовый файл // 1. Подготовить массив вещественных чисел AD double AD[] = new double[5]; for (int i=0; i // 2. Создать экземпляр класса FileOutputStream FileOutputStream fOut = new FileOutputStream("array.bin"); // 3. Использовать класс DataOutputStream для вывода в файл DataOutputStream dOut = new DataOutputStream(fOut); // связать с файлом // 4. Запись данных о массиве в байтовый файл // 4.1. Сначала нужно записать количество элементов в массиве dOut.writeInt(AD.length); // 4.2. Цикл записи массива в файл for (int i=0; i // 5. Закрыть поток dOut dOut.close(); // 6. Вывести в консоль массив AD для контроля System.out.println("Array AD:"); for (int i=0; iout.println(AD[i]); // ---------------------------------- // Чтение вещественных чисел из файла в массив AD2[] // 7. Объявить результирующий массив double AD2[]; // 8. Создать экземпляр файла FileInputStream FileInputStream fIn = new FileInputStream("array.bin"); // 9. Создать экземпляр класса DataInputStream и связать его с файлом fIn DataInputStream dIn = new DataInputStream(fIn); // 10. Прочитать количество чисел в массиве int count; count = dIn.readInt(); // 11. Выделить память для массива AD2[] AD2 = new double[count]; // 12. Считать числа из файла в массив AD2[] for (int i=0; i // 13. Закрыть поток DataInputStream dIn.close(); // 14. Вывести массив AD2[] для контроля System.out.println("\nArray AD2:"); for (int i=0; iout.println(AD2[i]); >Результат выполнения программы
Array AD: 1.0 3.5 6.0 8.5 11.0 Array AD2: 1.0 3.5 6.0 8.5 11.04. Пример копирования файлов с использованием байтового потока
В примере приводится фрагмент кода, который осуществляет копирование файлов. Используются средства классов FileInputStream и FileOutputStream .
import java.io.*; . public static void main(String[] args) throws IOException < // Копирование файлов. // Файл "inputFile.txt" копируется в файл "outputFile.txt" FileInputStream fi = null; FileOutputStream fo = null; try < // Попытка открыть файлы fi = new FileInputStream("inputFile.txt"); // исходный файл fo = new FileOutputStream("outputFile.txt"); // результирующий файл // Цикл копирования int d; do < // считать байты с fi d = fi.read(); // записать байты в fo if (d != -1) fo.write(d); > while (d != -1); System.out.println("Ok!"); > catch (IOException e) < // Если один из файлов не открыт, то вывести сообщение System.out.println("I/O error: " + e); > finally < try < // Если первый файл открыт, то закрыть его if (fi != null) fi.close(); > catch (IOException e2) < System.out.println("Cannot close file \"inputFile.txt\""); > try < // Если другой файл открыт, то закрыть его if (fo != null) fo.close(); > catch (IOException e2) < System.out.println("Cannot close file \"outputFile.txt\""); > > >Связанные темы
Как прочитать числа из файла java
Для чтения чисел из файла можно воспользоваться классом Scanner и методом nextInt() .
Пусть у нас есть файл numbers.txt содержащий числа :
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class App public static void main(String[] args) String fileName = "numbers.txt"; File file = new File(fileName); try Scanner scanner = new Scanner(file); while (scanner.hasNextInt()) int number = scanner.nextInt(); System.out.print(number + " "); // => 1 2 3 4 5 6 > scanner.close(); > catch (FileNotFoundException e) System.out.println("Ошибка чтения файла " + filaName); > > >