2015-07-05 29 views
2

我目前正在通過一個在線java課程,其中的主題是關於使用輸入流進行讀寫的方式。具體來說,本課程演示如何使用用戶輸入的偏移來加密圖像文件,然後使用負偏移解密相同的圖像文件。爲什麼從文件輸入流讀取時,必須將字節轉換爲字節?

但是,在所提供的代碼中,我不明白關鍵線實際上做了什麼,以及它爲什麼會這樣做。根據我所能做的,它從FileInputStream中讀取一個字節,並將其轉換爲一個字節,然後在將其轉移到文件之前通過文件輸出流寫出它。但是,由於我已經讀取了FileInputStream中的一個字節,爲什麼我必須再次將它轉換爲一個字節?

我真的很感謝任何人對此有所瞭解。

謝謝!

import java.io.*; 
import java.util.Scanner; 

public class ReadingAndWritingStreamsNonText { 
    public static String imgFilePath = "C:\\JavaProjects\\BinaryStreams\\src\\MIM_BINARY_MEME.jpg"; 
    public static String imgFilePath2 = "C:\\JavaProjects\\BinaryStreams\\src\\data.bin"; 
    public static String imgFilePath3 = "C:\\JavaProjects\\BinaryStreams\\src\\MIM_BINARY_MEME_Decrypted.jpg"; 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter a shift to encrypt/decrypt the file:"); 
     int shift = Integer.parseInt(input.nextLine()); 

     try { 
      FileInputStream fis = null; 
      FileOutputStream fos = null; 
      PrintStream ps = null; 

      if (shift > 0) { 
       fis = new FileInputStream(imgFilePath); 
       fos = new FileOutputStream(imgFilePath2); 
       ps = new PrintStream(fos); 
      } 
      else { 
       fis = new FileInputStream(imgFilePath2); 
       fos = new FileOutputStream(imgFilePath3); 
       ps = new PrintStream(fos); 
      } 

      boolean done = false; 
      while (!done) { 
       //read in the file 
       int next = fis.read(); 
       if (next == -1) { 
        done = true; 
       } 
       else { 
        //encrypt or decrypt based on shift 
        **ps.write(((byte) next) + shift);** <--- this line 
       } 
      } 

      ps.close(); 
      ps = null; 
      fos.close(); 
      fos = null; 
      fis.close(); 
      fis = null; 
     } 
     catch (IOException ioex) { 
      ioex.printStackTrace(); 
     } 
     System.out.println("Operation Completed"); 
    } 
} 

回答

4

因爲InputStream.read()返回一個int代替byte

注意,此方法將返回-1到達流的末尾時,並在範圍爲0〜255的值,如果已經讀取一個字節,作爲API文檔說:

讀取來自輸入流的下一個字節的數據。值字節在0到255範圍內作爲int返回。如果由於已到達流末尾而沒有可用的字節,則返回值-1。此方法阻塞直到輸入數據可用,流的末尾被檢測到,或拋出異常。

一種int需要澆鑄到被轉換爲byte因爲int是32位,而一個字節是隻有8位。你不能進行縮小轉換(拋棄int的高位24位)而不進行轉換。

4

它從文件輸入流中讀取一個字節,並將其轉換爲一個字節,然後在通過文件輸出流寫出之前將偏移添加到它。但是,由於我已經從fileinputstream讀取了一個字節,爲什麼我必須再次將它轉換爲一個字節呢?

因爲read()返回int,這可能是-1,指示流的末尾。如果它不是-1,則它是一個介於0到255範圍內的值,您必須將其轉換爲byte才能得到byte,範圍爲-128..127。如果沒有遵循這個過程,則不可能通過返回值指示流結束。