Как записать число в файл java
Перейти к содержимому

Как записать число в файл java

  • автор:

Как правильно считывать из файла и записывать в файл числа (I/O)?

Записать в файл numbers поочерёдно 100 положительных и 100 отрицательных случайных целых чисел, перечислив их через пробел. Затем прочитать этот файл и раскидать прочитанные числа в 2 файла: positive_numbers и negative_numbers, с положительными и отрицательными числами соответственно.
Какая причина незаписи в файл numbers_positive именно положительных чисел?
И как можно аналогично записать отрицательные?

public static void main(String[] args) < File file = new File("D:/numbers.txt"); try (FileWriter fw = new FileWriter(file, true)) < for (int i = 0; i for (int i = 0; i > catch (IOException e) < e.printStackTrace(); >try (FileReader fr = new FileReader("D:/numbers.txt"); FileWriter fwnp = new FileWriter("D:/numbers_positive.txt"); FileWriter fwnn = new FileWriter("D:/numbers_negative.txt")) < int c = fr.read(); while (c >0) < c = fr.read(); fwnp.write(c); fwnp.flush(); >> catch (IOException e) < e.printStackTrace(); >> private static int getRandomNumber(int a, int b) < if (b < a) return getRandomNumber(b, a); return a + (int) ((1 + b - a) * Math.random()); >>
  • Вопрос задан более двух лет назад
  • 257 просмотров

Запись чисел в файл Java

Проблема в том, что в исходном файле » Letter.txt » вместо чисел непонятные знаки. Может как-то при записи чисел указывать кодировку ?

Отслеживать
3,011 1 1 золотой знак 17 17 серебряных знаков 38 38 бронзовых знаков
задан 13 янв 2016 в 13:44
83 2 2 золотых знака 3 3 серебряных знака 11 11 бронзовых знаков

Ваш код вызывает метод (write)[docs.oracle.com/javase/7/docs/api/java/io/…, который записывает символы по их аски кодам. Поэтому и непонятные символы.

13 янв 2016 в 13:56
Вы записали в файл не число. А байт который кроме как байта может иметь и -1 поэтому там тип Int.
4 апр 2017 в 21:41

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Метод java.io.FileWriter.write записывает в файл не строковое представление числа, а символ с кодом, содержащимся в этом числе. Естественно, что в файле появляются непонятные знаки. Чтобы правильно записать строковое представление чисел в файл, необходимо вначале это строковое представление получить. Для этого можно использовать метод Integer.toString . Нижеследующий код иллюстрирует применение этой техники.

import java.io.*; import java.util.Random; class Main < public static void main(String[] args) < int[] array = new int[10]; final Random random = new Random(); for (int i = 0; i < array.length; ++i) array[i] = random.nextInt(); try (final FileWriter writer = new FileWriter("C:/Temp/Letter.txt", false)) < for (int i = 0; i < array.length; ++i) < final String s = Integer.toString(array[i]); writer.write(s); writer.write(System.lineSeparator()); System.out.println(s); >> catch(IOException e) < System.out.println(e.getMessage()); >> > 

Отслеживать
ответ дан 13 янв 2016 в 14:26
user194374 user194374

Вот так будет правильно записывать:

public static void main(String[] args) < try < File fileDir = new File("c:\\temp\\test.txt"); Writer out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(fileDir), "UTF8")); out.append("some UTF-8 text").append("\r\n"); out.flush(); out.close(); >catch (UnsupportedEncodingException e) < System.out.println(e.getMessage()); >catch (IOException e) < System.out.println(e.getMessage()); >catch (Exception e) < System.out.println(e.getMessage()); >> 

Отслеживать
ответ дан 13 янв 2016 в 13:55
Мстислав Павлов Мстислав Павлов
6,777 2 2 золотых знака 19 19 серебряных знаков 40 40 бронзовых знаков

package javaapplication2; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; public class JavaApplication2 < public static void main(String[] args) < ArrayListlist = new ArrayList<>(); list.add(13); list.add(44); try(FileOutputStream out = new FileOutputStream("file")) < int max = list.size(); if(max >0) < // size >0 out.flush(); //Чистка файла, если надо оставляем int i = 0; int a; while(i 0) < out.write(10); // /n //Выйдет цепочка //13 //44 //ВНИМАНИЕ! В КОНЦЕ ЛИШНЕГО /N НЕТ >a = list.get(i); out.write(Integer.toString(a).getBytes()); i = i + 1; > > > catch (FileNotFoundException ex) < Logger.getLogger(JavaApplication2.class.getName()).log(Level.SEVERE, null, ex); >catch (IOException ex) < Logger.getLogger(JavaApplication2.class.getName()).log(Level.SEVERE, null, ex); >//Чтение try(FileInputStream in = new FileInputStream("file")) < //Проще некуда, но на больших файлах это самый плохой вариант byte[] buff = new byte[in.available()]; in.read(buff); System.out.write(buff); System.out.print(".END. "); //В конце закрывающий .END. >catch (FileNotFoundException ex) < Logger.getLogger(JavaApplication2.class.getName()).log(Level.SEVERE, null, ex); >catch (IOException ex) < Logger.getLogger(JavaApplication2.class.getName()).log(Level.SEVERE, null, ex); >> > 
13 44.END. 

Отслеживать
ответ дан 4 апр 2017 в 21:53
Denis Kotlyarov Denis Kotlyarov
2,862 3 3 золотых знака 27 27 серебряных знаков 56 56 бронзовых знаков

  • java
  • кодировка
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.5.3.8609

Как записать число в файл java

Хотя с помощью ранее рассмотренных классов можно записывать текст в файлы, однако они предназначены прежде всего для работы с бинарными потоками данных, и их возможностей для полноценной работы с текстовыми файлами недостаточно. И для этой цели служат совсем другие классы, которые являются наследниками абстрактных классов Reader и Writer .

Запись файлов. Класс FileWriter

Класс FileWriter является производным от класса Writer. Он используется для записи текстовых файлов.

Чтобы создать объект FileWriter, можно использовать один из следующих конструкторов:

FileWriter(File file) FileWriter(File file, boolean append) FileWriter(FileDescriptor fd) FileWriter(String fileName) FileWriter(String fileName, boolean append)

Так, в конструктор передается либо путь к файлу в виде строки, либо объект File, который ссылается на конкретный текстовый файл. Параметр append указывает, должны ли данные дозаписываться в конец файла (если параметр равен true), либо файл должен перезаписываться.

Запишем в файл какой-нибудь текст:

import java.io.*; public class Program < public static void main(String[] args) < try(FileWriter writer = new FileWriter("notes3.txt", false)) < // запись всей строки String text = "Hello Gold!"; writer.write(text); // запись по символам writer.append('\n'); writer.append('E'); writer.flush(); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >

В конструкторе использовался параметр append со значением false — то есть файл будет перезаписываться. Затем с помощью методов, определенных в базовом классе Writer производится запись данных.

Чтение файлов. Класс FileReader

Класс FileReader наследуется от абстрактного класса Reader и предоставляет функциональность для чтения текстовых файлов.

Для создания объекта FileReader мы можем использовать один из его конструкторов:

FileReader(String fileName) FileReader(File file) FileReader(FileDescriptor fd)

А используя методы, определенные в базом классе Reader, произвести чтение файла:

import java.io.*; public class Program < public static void main(String[] args) < try(FileReader reader = new FileReader("notes3.txt")) < // читаем посимвольно int c; while((c=reader.read())!=-1)< System.out.print((char)c); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >

Также мы можем считывать в промежуточный буфер из массива символов:

import java.io.*; import java.util.Arrays; public class Program < public static void main(String[] args) < try(FileReader reader = new FileReader("notes3.txt")) < char[] buf = new char[256]; int c; while((c = reader.read(buf))>0) < if(c < 256)< buf = Arrays.copyOf(buf, c); >System.out.print(buf); > > catch(IOException ex) < System.out.println(ex.getMessage()); >> >

В данном случае считываем последовательно символы из файла в массив из 256 символов, пока не дойдем до конца файла в этом случае метод read возвратит число -1.

Поскольку считанная порция файла может быть меньше 256 символов (например, в файле всего 73 символа), и если количество считанных данных меньше размера буфера (256), то выполняем копирование массива с помощью метода Arrays.copy. То есть фактически обрезаем массив buf, оставляя в нем только те символы, которые считаны из файла.

  • Глава 1. Введение в Java
    • Язык программирования Java
    • Установка Java
    • Первая программа на Java
    • Первая программа в IntelliJ IDEA
    • Первая программа в NetBeans
    • Первая программа в Eclipse
    • Структура программы
    • Переменные и константы
    • Типы данных
    • Консольный ввод/вывод в Java
    • Арифметические операции
    • Поразрядные операции
    • Условные выражения
    • Операции присваивания и приоритет операций
    • Преобразования базовых типов данных
    • Условные конструкции
    • Циклы
    • Массивы
    • Методы
    • Параметры методов
    • Оператор return. Результат метода
    • Перегрузка методов
    • Рекурсивные функции
    • Введение в обработку исключений
    • Классы и объекты
    • Пакеты
    • Модификаторы доступа и инкапсуляция
    • Статические члены и модификатор static
    • Объекты как параметры методов
    • Внутренние и вложенные классы
    • Наследование
    • Абстрактные классы
    • Иерархия наследования и преобразование типов
    • Интерфейсы
    • Интерфейсы в механизме обратного вызова
    • Перечисления enum
    • Класс Object и его методы
    • Обобщения (Generics)
    • Ограничения обобщений
    • Наследование и обобщения
    • Ссылочные типы и клонирование объектов
    • Records
    • Оператор throws
    • Классы исключений
    • Создание своих классов исключений
    • Типы коллекций. Интерфейс Collection
    • Класс ArrayList и интерфейс List
    • Очереди и класс ArrayDeque
    • Класс LinkedList
    • Интерфейс Set и класс HashSet
    • SortedSet, NavigableSet, TreeSet
    • Интерфейсы Comparable и Comporator. Сортировка
    • Интерфейс Map и класс HashMap
    • Интерфейсы SortedMap и NavigableMap. Класс TreeMap
    • Итераторы
    • Потоки ввода-вывода
    • Чтение и запись файлов. FileInputStream и FileOutputStream
    • Закрытие потоков
    • Классы ByteArrayInputStream и ByteArrayOutputStream
    • Буферизованные потоки BufferedInputStream и BufferedOutputStream
    • Форматируемый вывод. PrintStream и PrintWriter
    • Классы DataOutputStream и DataInputStream
    • Чтение и запись текстовых файлов
    • Буферизация символьных потоков. BufferedReader и BufferedWriter
    • Сериализация объектов
    • Класс File. Работа с файлами и каталогами
    • Работа с ZIP-архивами
    • Класс Console
    • Введение в строки. Класс String
    • Основные операции со строками
    • StringBuffer и StringBuilder
    • Регулярные выражения
    • Введение в лямбда-выражения
    • Лямбды как параметры и результаты методов
    • Встроенные функциональные интерфейсы
    • Класс Thread
    • Создание и выполнение потоков
    • Завершение и прерывание потока
    • Синхронизация потоков. Оператор synchronized
    • Взаимодействие потоков. Методы wait и notify
    • Семафоры
    • Обмен между потоками. Класс Exchanger
    • Класс Phaser
    • Блокировки. ReentrantLock
    • Условия в блокировках
    • Введение в Stream API
    • Создание потока данных
    • Фильтрация, перебор элементов и отображение
    • Сортировка
    • Получение подпотока и объединение потоков
    • Методы skip и limit
    • Операции сведения
    • Метод reduce
    • Тип Optional
    • Метод collect
    • Группировка
    • Параллельные потоки
    • Параллельные операции над массивами
    • Создание модуля
    • Зависимые модули
    • Взаимодействие между модулями
    • Математические вычисления и класс Math
    • Большие числа BigInteger и BigDecimal
    • Работа с датами. LocalDate

    Как записать число в файл java

    Класс FileOutputStream предназначен для записи байтов в файл. Он является производным от класса OutputStream, поэтому наследует всю его функциональность.

    Через конструктор класса FileOutputStream задается файл, в который производится запись. Класс поддерживает несколько конструкторов:

    FileOutputStream(String filePath) FileOutputStream(File fileObj) FileOutputStream(String filePath, boolean append) FileOutputStream(File fileObj, boolean append)

    Файл задается либо через строковый путь, либо через объект File. Второй параметр — append задает способ записи: eсли он равен true, то данные дозаписываются в конец файла, а при false — файл полностью перезаписывается

    Например, запишем в файл строку:

    import java.io.*; public class Program < public static void main(String[] args) < String text = "Hello world!"; // строка для записи try(FileOutputStream fos=new FileOutputStream("notes.txt")) < // перевод строки в байты byte[] buffer = text.getBytes(); fos.write(buffer, 0, buffer.length); System.out.println("The file has been written"); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >

    Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Если такого файла нет, то он автоматически создается при записи. Так как здесь записываем строку, то ее надо сначала перевести в массив байтов. И с помощью метода write строка записывается в файл.

    Для автоматического закрытия файла и освобождения ресурса объект FileOutputStream создается с помощью конструктции try. catch.

    При этом необязательно записывать весь массив байтов. Используя перегрузку метода write() , можно записать и одиночный байт:

    fos.write(buffer[0]); // запись первого байта

    Чтение файлов и класс FileInputStream

    Для считывания данных из файла предназначен класс FileInputStream , который является наследником класса InputStream и поэтому реализует все его методы.

    Для создания объекта FileInputStream мы можем использовать ряд конструкторов. Наиболее используемая версия конструктора в качестве параметра принимает путь к считываемому файлу:

    FileInputStream(String fileName) throws FileNotFoundException

    Если файл не может быть открыт, например, по указанному пути такого файла не существует, то генерируется исключение FileNotFoundException .

    Считаем данные из ранее записанного файла и выведем на консоль:

    import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt")) < int i; while((i=fin.read())!=-1)< System.out.print((char)i); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >

    В данном случае мы считываем каждый отдельный байт в переменную i:

    while((i=fin.read())!=-1)
    

    Когда в потоке больше нет данных для чтения, метод возвращает число -1.

    Затем каждый считанный байт конвертируется в объект типа char и выводится на консоль.

    Подобным образом можно считать данные в массив байтов и затем производить с ним манипуляции:

    import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt")) < byte[] buffer = new byte[256]; System.out.println("File data:"); int count; while((count=fin.read(buffer))!=-1)< for(int i=0; i> > catch(IOException ex) < System.out.println(ex.getMessage()); >> >

    В данном случае с помощью метода read() считываем данные в массив buffer длиной 256 байтов. Метод возвращает количество считанных байтов.

    Поскольк файл может быть больше 256 байтов, то считываем в цикле while до конца файла. Когда больше не останется файлов для считывания, то метод возвратит -1.

    while((count=fin.read(buffer))!=-1)
    

    Поскольку количество считанных байтов/размер файла могут быть меньше 256 байт, то реальное количество считанных байт сохраняем в переменную count. Затем выводим считанное количество данных на консоль в цикле for.

    for(int i=0; i

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

    import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt"); FileOutputStream fos=new FileOutputStream("notes_new.txt")) < byte[] buffer = new byte[256]; int count; // считываем буфер while((count=fin.read(buffer))!=-1)< // записываем из буфера в файл fos.write(buffer, 0, count); >System.out.println("File has been written"); > catch(IOException ex) < System.out.println(ex.getMessage()); >> >

    Классы FileInputStream и FileOutputStream предназначены прежде всего для записи двоичных файлов, то есть для записи и чтения байтов. И хотя они также могут использоваться для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.

    • Глава 1. Введение в Java
      • Язык программирования Java
      • Установка Java
      • Первая программа на Java
      • Первая программа в IntelliJ IDEA
      • Первая программа в NetBeans
      • Первая программа в Eclipse
      • Структура программы
      • Переменные и константы
      • Типы данных
      • Консольный ввод/вывод в Java
      • Арифметические операции
      • Поразрядные операции
      • Условные выражения
      • Операции присваивания и приоритет операций
      • Преобразования базовых типов данных
      • Условные конструкции
      • Циклы
      • Массивы
      • Методы
      • Параметры методов
      • Оператор return. Результат метода
      • Перегрузка методов
      • Рекурсивные функции
      • Введение в обработку исключений
      • Классы и объекты
      • Пакеты
      • Модификаторы доступа и инкапсуляция
      • Статические члены и модификатор static
      • Объекты как параметры методов
      • Внутренние и вложенные классы
      • Наследование
      • Абстрактные классы
      • Иерархия наследования и преобразование типов
      • Интерфейсы
      • Интерфейсы в механизме обратного вызова
      • Перечисления enum
      • Класс Object и его методы
      • Обобщения (Generics)
      • Ограничения обобщений
      • Наследование и обобщения
      • Ссылочные типы и клонирование объектов
      • Records
      • Оператор throws
      • Классы исключений
      • Создание своих классов исключений
      • Типы коллекций. Интерфейс Collection
      • Класс ArrayList и интерфейс List
      • Очереди и класс ArrayDeque
      • Класс LinkedList
      • Интерфейс Set и класс HashSet
      • SortedSet, NavigableSet, TreeSet
      • Интерфейсы Comparable и Comporator. Сортировка
      • Интерфейс Map и класс HashMap
      • Интерфейсы SortedMap и NavigableMap. Класс TreeMap
      • Итераторы
      • Потоки ввода-вывода
      • Чтение и запись файлов. FileInputStream и FileOutputStream
      • Закрытие потоков
      • Классы ByteArrayInputStream и ByteArrayOutputStream
      • Буферизованные потоки BufferedInputStream и BufferedOutputStream
      • Форматируемый вывод. PrintStream и PrintWriter
      • Классы DataOutputStream и DataInputStream
      • Чтение и запись текстовых файлов
      • Буферизация символьных потоков. BufferedReader и BufferedWriter
      • Сериализация объектов
      • Класс File. Работа с файлами и каталогами
      • Работа с ZIP-архивами
      • Класс Console
      • Введение в строки. Класс String
      • Основные операции со строками
      • StringBuffer и StringBuilder
      • Регулярные выражения
      • Введение в лямбда-выражения
      • Лямбды как параметры и результаты методов
      • Встроенные функциональные интерфейсы
      • Класс Thread
      • Создание и выполнение потоков
      • Завершение и прерывание потока
      • Синхронизация потоков. Оператор synchronized
      • Взаимодействие потоков. Методы wait и notify
      • Семафоры
      • Обмен между потоками. Класс Exchanger
      • Класс Phaser
      • Блокировки. ReentrantLock
      • Условия в блокировках
      • Введение в Stream API
      • Создание потока данных
      • Фильтрация, перебор элементов и отображение
      • Сортировка
      • Получение подпотока и объединение потоков
      • Методы skip и limit
      • Операции сведения
      • Метод reduce
      • Тип Optional
      • Метод collect
      • Группировка
      • Параллельные потоки
      • Параллельные операции над массивами
      • Создание модуля
      • Зависимые модули
      • Взаимодействие между модулями
      • Математические вычисления и класс Math
      • Большие числа BigInteger и BigDecimal
      • Работа с датами. LocalDate

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *