Что хранит переменная «данные» в этой Java-программе?

Мой код работает. Мне просто нужно знать о роли конкретной переменной в коде.

Я попытался напечатать значение в переменной «данные», но это дает мне некоторые числа, которые я не могу понять.

public static void main(String[] args) throws IOException {

    FileInputStream fileinputstream = new FileInputStream ("c:\\Users\\USER\\Desktop\\read.TXT");

    FileOutputStream fileoutputstream = new FileOutputStream("c:\\Users\\USER\\Desktop\\write.TXT");

    while (fileinputstream.available() > 0) {
        int data = fileinputstream.read();                                                       
        fileoutputstream.write(data);
    }

    fileinputstream.close();
    fileoutputstream.close();
}
fileinputstream.available() здесь определенно используется неправильно.
markspace 03.06.2019 18:49

Просто прочитайте Javadoc этого метода. Он читает следующий байт из потока, интерпретируемый как int, от 0 до 255. Вот что data хранит.

Zabuzard 03.06.2019 18:50
for( int data; (data = fileinputstream.read()) != -1; ) { fileoutputstream.write(data); } будет правильным способом чтения данных. (Не испытано.)
markspace 03.06.2019 18:51

Обратите внимание, что это была бы отличная возможность ознакомиться с вашим пошаговым отладчиком, который мог бы показать вам разные значения, которые содержит переменная data на разных этапах выполнения. Многие курсы CS никогда не касаются темы отладчиков, но они очень помогают, поэтому я настоятельно рекомендую вам взглянуть на них, если вы еще этого не сделали.

Aaron 03.06.2019 18:54
it gives me some numbers i cant understand about Это потому, что вы читаете в двоичном формате. Это нормально, и копия файла будет работать, но если вы хотите понять данные, вам нужно преобразовать их в текстовый символ.
markspace 03.06.2019 18:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
77
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

FileInputStream#read() считывает один байт информации из базового файла.

Поскольку эти файлы являются текстовыми файлами (в соответствии с их расширениями), вам, вероятно, следует использовать FileInputStream, но FileReader, чтобы правильно обрабатывать символы, а не байты, из которых они состоят.

Ответ принят как подходящий

Вы можете посмотреть на документы для FileInputStream.read, который говорит:

Reads a byte of data from this input stream. This method blocks if no input is yet available.

Returns:

the next byte of data, or -1 if the end of the file is reached.

Таким образом, полученное вами целое число (то есть число, хранящееся в data) — это байт, прочитанный из файла. Поскольку ваш файл является текстовым, это значение ASCII символов в этом файле (при условии, что ваш файл закодирован в ASCII).

«Предполагая, что ваш файл закодирован в ASCII»: да, но маловероятно. Но на самом деле нет смысла выполнять какую-либо обработку текстового файла (за исключением копирования или дампа байтов КАК ЕСТЬ), если вы не знаете кодировку символов.

Tom Blodget 04.06.2019 01:59

@TomBlodget Я знаю, но мне становится очень трудно удовлетворительно объяснить, что такое байты, когда файл использует кодировку, в которой используется несколько байтов для одного символа (каждый байт является частью символа?), поэтому я выбрал простой выход ...

Sweeper 04.06.2019 07:17

fileinputstream.read() возвращает «следующий байт данных или -1, если достигнут конец файла».

Вы можете прочитать больше здесь

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