2012-05-04 4 views
0

В примере, приведенном в Oracle Java Tutorial, они пытаются читать символы как целые числа ....Почему поток символов считывает ints?

Почему и как это работает?

try { 
     inputStream = new FileReader("xanadu.txt"); 
     outputStream = new FileWriter("characteroutput.txt"); 

     int c; 
     while ((c = inputStream.read()) != -1) { 
      outputStream.write(c); 
     } 
+0

... Потому что практически все в компьютере числовое, а числа здесь просто соответствуют символьным ординалам? – KeithS

+0

wow, спасибо большое за все ваши быстрые ответы! Это очень помогло мне! – kwoebber

ответ

4

Если вы читаете символ, то для конца файла не будет никакого значения.

При использовании более крупного типа int его возможно иметь все возможные символы И еще один символ, что означает конец файла.

0

Это потому, что символы ARE целые. Каждый символ имеет уникодовый эквивалент.

+0

Я думаю, вы ошибаетесь. Символы (на Java) короче, чем я знаю. Может, я ошибаюсь. Я проверю. – Aslan986

+1

@ Aslan986 - 16 бит, int - 32 –

0

В основном a char является int. Попробуйте следующее:

char c = 'c'; 
int i = c; 

Это не вызовет ошибку компиляции.

0

За кулисами в java, char - это всего лишь 16-разрядное значение без знака. Значение int - это 32-разрядное значение без знака.

chars - это подмножество ints, значения которого имеют значение для таблиц ASCII.

Из-за этих отношений, это удобство синтаксиса, позволяющее двум типам легко конвертироваться в другое.

0

Ну, если вы читаете документацию для Reader/Writer вы можете увидеть следующее объяснение:

Писатель класса - написать метод

Пишет один символ. Символ, который должен быть записан, содержит в 16 младших битах заданного целочисленного значения; старшие разряды 16 игнорируются.

И код просто делает:

public void write(int c) throws IOException { 
    synchronized (lock) { 
     if (writeBuffer == null){ 
      writeBuffer = new char[writeBufferSize]; 
     } 
     writeBuffer[0] = (char) c; 
     write(writeBuffer, 0, 1); 
    } 
} 

Таким образом, в случае Writer, и, насколько я могу видеть, это могло бы быть сделано с типом char данных.

С другой стороны, метод int read несет ответственность за возврат символа или конца индикатора потока.

В документации сказано:

чтения Класс чтения Метод

характер чтения, как целое число в диапазоне от 0 до 65535 или -1, если конец потока был достигнут ,

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

И это реализуется следующим образом:

public int read() throws IOException { 
    char cb[] = new char[1]; 
    if (read(cb, 0, 1) == -1) 
     return -1; 
    else 
     return cb[0]; 
} 

Таким образом, это второй случай, оправдывает использование большего типа данных.

Причина, по которой они используют int в обоих классах, может быть просто вопросом согласованности.

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