2015-09-26 5 views
4

Я читаю обо всех входных/выходных потоках в java на Java Tutorials Docs. Учебники писатель использовать этот пример:Как FileInputStream и FileOutputStream работают на Java?

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

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

     FileInputStream in = null; 
     FileOutputStream out = null; 

     try { 
      in = new FileInputStream("xanadu.txt"); 
      out = new FileOutputStream("outagain.txt"); 
      int c; 

      while ((c = in.read()) != -1) { 
       out.write(c); 
      } 
     } finally { 
      if (in != null) { 
       in.close(); 
      } 
      if (out != null) { 
       out.close(); 
      } 
     } 
    } 
} 

xanadu.txt данных файла:

In Xanadu did Kubla Khan 
A stately pleasure-dome decree: 
Where Alph, the sacred river, ran 
Through caverns measureless to man 
Down to a sunless sea. 

Выход в outagain.txt файл:

In Xanadu did Kubla Khan 
A stately pleasure-dome decree: 
Where Alph, the sacred river, ran 
Through caverns measureless to man 
Down to a sunless sea. 
  1. Почему авторы используют int c даже если мы читаем персонажей?

  2. Зачем использовать -1 в состоянии?

  3. Как out.write(c); метод конвертировать int снова символы?

+0

Это не символы, они байты. Вы знакомы с [документацией по API Java] (http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html)? Существует объяснение для каждого класса и каждого метода в стандартных библиотеках Java, в том числе для файлов FileInputStream и FileOutputStream. Важно учиться у них, когда вы не знаете, почему метод вызывается так, как он есть. – RealSkeptic

+0

@RealSkeptic Java Tutorials Документы выглядят легко и удобно, но java api docs выглядит как беспорядок. Вот почему я читаю учебники docs. Любой, как я буду пытаться читать оттуда. –

+0

Они не являются источником для обучения программированию. Это подробное объяснение каждого класса. Поэтому каждый раз, когда вы видите класс, используемый в учебнике, вы должны искать его в документах API. Здесь важна важная информация. – RealSkeptic

ответ

5

1: Теперь я хочу спросить, почему автор использует int c? даже мы читаем персонажей.

FileInputStream.read() возвращает один байт данных как int. Это работает, потому что байт может быть представлен как int без потери точности. См. this answer, чтобы понять, почему возвращается int вместо byte.

2: Второй зачем использовать -1 во время условия?

Когда конец файла достигнут, возвращается -1.

3: Как out.write (c); метод конвертировать int для повторения символов? которые обеспечивают тот же результат в файле outagain.txt

FileOutputStream.write() принимает параметр байт в качестве int. Поскольку значение int охватывает больше значений, чем байт, 24 старших бита данного int игнорируются, что делает его байт-совместимым значением: int в Java - always 32 bits. Удалив 24 бита высокого порядка, вы уменьшаете до 8-битного значения, то есть байта.

Я предлагаю вам внимательно прочитать Javadocs для каждого из этих методов. В качестве сравнения, они отвечают на все ваши вопросы:

read:

Читает следующие байты данных из входного потока. Байт значения возвращается как int в диапазоне от 0 до 255. Если байт недоступен, поскольку конец потока достигнут, возвращается значение -1. Этот метод блокируется до тех пор, пока не будут доступны входные данные, обнаружен конец потока или вызывается исключение.

write:

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

+0

Отлично ... Все очищено .. !! –

+0

Извините, что вы подразумеваете под '24 битов высокого порядка b игнорируются.' В любом примере? –

+2

«int» в Java всегда 32 бит. Удалив 24 бита высокого порядка, вы уменьшаете до 8-битного значения, то есть байта. – Tunaki

1

Просто прочитайте документы.

здесь является метод чтения документов http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read()

INT чтение общественности() бросает IOException Считывает байты данных от этого входного потока. Этот метод блокирует, если вход еще не доступен.

Определенный: чтения в классе InputStream

Возвращает: следующие байты данных, или -1, если конец файла достигнут.

Это int - ваш следующий набор данных байтов. Теперь вот ответы.

1) Когда вы назначаете char для int, он обозначает его номер ascii для int.

Если вы заинтересованы, то здесь нам список символов и их ASCII-кодов https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

2) -1, если конец файла достигнут. Так что это проверка на наличие данных или нет.

3) Когда вы отправляете код ascii для печати, он печатает соответствующий символ в файле.

+0

@SURESH хорошо пояснено. Только один вопрос, как преобразовать байты в int? неявно? –

+1

Почему вы говорите о персонажах и PrintWriters, где мы имеем дело конкретно с * байтовыми потоками *? Здесь нет символа 'char', и если файл отсутствует в ASCII/UTF-8 и т. Д., Но, например, в UTF-16, то, что читается, не обязательно будет символом, а единственным байтом. – RealSkeptic

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