Как int автоматически конвертируется в char при работе с FileInputStream в java

Вот пример кода для копирования файла в java.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

class FileCopy {

    public static void main(String[] args) throws IOException {
        String in = "D:\\test.txt";
        String out = "D:\\test_dup.txt";
        int i = 0;
        try (FileInputStream fis = new FileInputStream(in);
                FileOutputStream fos = new FileOutputStream(out)) {
            int b;
            while ((b = fis.read()) != -1) {
                System.out.println(b + "....." + (char) b);
                fos.write(b);
                i++;
            }

        } catch (Exception e) {
            System.out.print(e);
        } finally {
            System.out.println("done" + i);
        }
    }
}

Содержимое файла "test.txt" - "Добро пожаловать". Когда я запускаю программу, контекст копируется во второй файл, а вывод программы

87.....W
101.....e
108.....l
99.....c
111.....o
109.....m
101.....e

Мы используем целое число, чтобы запугать результат, как происходит автоматическое преобразование из int в символ, когда мы пишем int в FileOutpurtStream? или где задокументировано это автоматическое преобразование типа char в int при чтении и int в char при записи.

если метод FileInputStream.read читает байт данных за раз, то почему тип возвращаемого значения - int, а не byte.

это значение ascii символа

Scary Wombat 01.06.2018 09:17

Файлы на диске - это просто последовательности 8-битных целых чисел (которые мы называем байтами). Если вы откроете этот файл с помощью программы, которая интерпретирует эти байты как символы ASCII, вы увидите их как символы ASCII (независимо от того, должны ли они восприниматься как таковые, или нет)

Erwin Bolwidt 01.06.2018 09:31

@anna насчет вашего редактирования, это совершенно другой вопрос. Предлагаю вам открыть новую по этому поводу.

Federico klez Culloca 01.06.2018 09:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
124
1

Ответы 1

write записывает байты. Так что это ожидалось.

Когда он записывает, например, 87, он не записывает символы 8 и 7, он записывает байт со значением 87, который оказывается ASCII W.

Другие вопросы по теме