2015-06-20 8 views
1

Я новичок в Java. Я изучаю fileIO. Я писал небольшую программу для отображения содержимого в txt-файле. Мой код выглядит следующим образом:java read file ---- Почему мой код работает

import java.io.*; 

public class Readf { 
    public static void main(String arg[]) throws IOException { 
      FileInputStream in = null ; 
      try { 
        in = new FileInputStream("input.txt"); 
        int c; 
        String cs=""; 
        while ((c=in.read())!=-1) { 
          cs = cs + (char)c; 
          if ((char)c=='\n') { 
            System.out.println(cs); 
            cs=""; 
          } 
        } 

      } finally { 
        if (in != null) { 
          in.close(); 
        } 
      } 
    } 
} 

Я читал онлайн-учебник. Он сказал мне прочитать файл с переменной int. Поскольку я хотел отображать содержимое в char, я бросаю их в тип char и сохраняю его в укусе, и он РАБОТАЕТ !!!! В Java переменная int 32-битная, но переменная char - 16 бит. Я бросал их в 16-битный символ каждый раз, когда читал 32-битный int. Почему результат не был хаосом?

+0

Если вы хотите хаос, используйте символы вне BMP в своем входном файле, например: – ninjalj

+1

На самом деле, все, что не является ASCII, было бы хорошим примером для сравнения. Попробуйте файл, который имеет что-то вроде 'é' или' ç'. Или что-то на арабском, китайском и т. Д., Например 猫 – RealSkeptic

ответ

0

Все символы, которые вы, возможно, сохраните в своем файле, будут в пределах диапазона 16-битного набора символов Юникода, с которым работает java. Следовательно, не должно быть никаких проблем с преобразованием символа (16 бит) в int (32 бит) или наоборот.

0

На самом деле, я уважаю вашу настойчивость, чтобы понять, а не просто получить желаемый результат.

Уловка заключается в том, что каждый персонаж, который вы сканируете, имеет значение ascii ниже 2^8, что делает его подходящим в int 32-бит и подходит для char 16-бит. Хаос, который вы принимаете, появится в случае, если значение ascii соответствует 32-битовому, но не в 16-битовом, которое не будет существовать в наборе символов ascii, а в unicode.

check the ascii table

1

Проверка чтения() описание метода в классе FileInputStream:

FileInputStream.read()

Как вы можете видеть в спецификации, метод чтения «Чтение байт данных от этого входного потока ", что означает, что все ваши ints в вашей программе (c variable) всегда будут меньше или равны 255 и выше, или равно 0. Не имеет значения, читаете ли вы txt-файл или pdf, png и т. д.

Вы можете проверить это, пытаясь напечатать что-нибудь, когда с больше чем 255, например .:

if (c > 255) { 
    System.out.println("c>255"); 
} 

и «с> 255» никогда не будут напечатаны.

Поскольку int подписан, вы также можете проверить, меньше ли c.

if (c < 0) { 
    System.out.println("c<0"); 
} 

и снова "с < 0" никогда не будет печататься, а также.

Только последний инт будет, конечно, -1.

Таким образом, каждый int из диапазона < 0, 255> можно безопасно отливать на char без потери информации.

+0

, проверьте это https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html –

+0

Я думаю, что ** байт ** будет находиться между -128 и +127 (в комплекте) не 255, если он не подписан. –

+0

Да, байт в Java подписан и находится в диапазоне <-128, 127>.В javadoc метода read() есть «байт данных», который я понимаю как «8 бит данных», и он не должен быть примитивным типом байта Java. Я думаю, поэтому метод read() не возвращает байт, а int. –

Смежные вопросы