Отсутствует символ при использовании класса InputStreamReader в Java - PullRequest
0 голосов
/ 03 апреля 2020

Я написал несколько кодов для чтения из текстового файла char на char и затем распечатал его на экране, но результат заставил меня запутаться, вот он:

это код, который я написал

import java.io.*;
import java.nio.charset.StandardCharsets;
public class learnIO
{


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

                var in = new InputStreamReader(new FileInputStream("test1.txt"), StandardCharsets.UTF_8);
                while(in.read() != -1){

                        System.out.println((char)in.read());
                }


        }


}

содержимое и схему кодирования файла:

файл test1.txt

test1.txt: текст ASCII

cat test1.txt

привет, мир!

результат:

e

l

,

w

r

d

некоторые символы пропустили char Почему это произошло?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Вам необходимо использовать InputStreamReader внутри BufferedReader, поскольку из официальной документации oracle говорится, что

InputStreamReader - это мост от байтовых потоков к символьным потокам: он считывает байты и декодирует их в символы используя указанную кодировку. Используемая им кодировка может быть указана по имени или задана явно, или может быть принят кодировка платформы по умолчанию.

Каждый вызов одного из методов read () InputStreamReader может вызвать чтение одного или нескольких байтов. из основного потока ввода байтов.

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

Для максимальной эффективности рассмотрите перенос InputStreamReader. в BufferedReader. Например:

BufferedReader in = new BufferedReader (new InputStreamReader (System.in));

Таким образом, решение вашей проблемы может быть решено с помощью следующего кода

 try {
                // Open the file that is the first
                // command line parameter
                FileInputStream fstream = new FileInputStream("hello.txt");
                // Get the object of DataInputStream
                DataInputStream in = new DataInputStream(fstream);
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                //Read File Line By Line
                char c;
                while ((c = (char) br.read()) != (char) -1) {
                    // Print the content on the console
                    String character = Character.toString(c);
                    System.out.println(character);
                }
                //Close the input stream
                in.close();
            } catch (Exception e) {//Catch exception if any
                System.err.println("Error: " + e.getMessage());
            }
0 голосов
/ 03 апреля 2020

возвращаемый тип метода чтения InputStreamReader - это int, который занимает 4 байта, а тип char - 2 байта, поэтому при приведении int к char вы пропускаете 2 байта

см. https://docs.oracle.com/javase/7/docs/api/java/io/InputStreamReader.html

...