2013-04-11 286 views
-1

我的程序讀取一個文件爲字節數組,但是我不知道數組result中有多少負數。我認爲陣列中的元素的值在0到255範圍內。代碼在這裏:InputStream的read(byte [] b)返回一個字節數組有負值的元素

public static void main(String [] args) 
    { 
     try 
     { 
      File file = new File("C:\\1.mp3"); 
      FileInputStream fis = new FileInputStream(file); 
      byte[] bytes = new byte[(int)file.length()]; 
      fis.read(bytes); 
      boolean check = true; 
      int i = -1; 
      while(check) 
      { 
       i=i+1; 
       if(bytes[i]<0) 
       { 
        check = false; 
        System.out.println("There is a negative number."); 
       } 
      } 
     } 
     catch(IOException ex) 
     { 
      System.out.println(ex.getMessage()); 
     } 
    } 

感謝您的幫助。

+4

Java字節的值在-128到127的範圍內。我不明白爲什麼這是一個問題。 – 2013-04-11 02:51:18

+0

但是我讀了Java Document,我看到「從輸入流中讀取下一個字節的數據。值字節在0到255範圍內返回爲int」。我認爲0 <=數組元素<= 255。 – loithuxua 2013-04-11 02:59:13

+0

這隻有在你使用int read()讀取一個字節時纔是真的。使用這個函數可以得到0到25​​5的值,如果是-1您已到達流的末尾。 – 2013-04-11 07:35:15

回答

7

Java的範圍是-128至127.請參閱Java教程中的Primitive Data Types以獲取更多信息。

你對從InputStream讀取字節的兩種方式感到困惑。

第一種方法是使用InputStream.read()方法一次讀取一個字節。此方法返回值爲int(不是byte),該值具有讀取值(範圍0-255)或-1,表示已到達流的末尾。 int類型是Java中的帶符號32位值。

第二種方法是在示例代碼中使用InputStream.read(byte[])一次讀取多個字節。此方法將byte數組作爲參數,並返回指示讀取的字節數的int,如果已到達流尾,則返回-1。這些byte值的範圍是-128到127,因爲byte類型是Java中的帶符號8位值。

如果從第二方式需要的無符號值,則可以通過執行以下變換:

byte b = ...; //element in the byte array read from stream 
int i = b & 0xFF; 

這將設置一個32位int的低8位與來自byte值的值,從而你是一個無符號的值。

+0

非常感謝@prunge,我有新的問題。我使用FileOutputStream.write(int b)將數據寫入文本文件。我知道它使用ASCII表,比如如果b = 57,它會寫9到文本文件,如果我使用b範圍內的ASCII(1 - 127),我想知道Java如何處理? – loithuxua 2013-04-11 03:54:44

+0

@loithuxua'FileOutputStream'將使用傳入'write()'的'int'值的最低8位。如果寫字符,我會建議使用'Writer's而不是'OutputStream's,因爲它們被設計用來處理字符編碼和多字節字符。 – prunge 2013-04-11 05:41:39

相關問題