1.     關于OutputStream writeint)方法

public abstract void write(int b)

throws IOException

 

此方法接受一個不大于255的整數作為參數,并將其以相應的byte輸出到outputStream

不知讀者有沒有想過為什么要求int型的參數小于255

原因是Java中沒有無符號的byte類型,所以只好以int作為替代,但這里就存在一個兩種類型長度不一的問題(int-32bit, byte-8bit),于是Java的設計者只取int的低8位,而忽略32bit中的高24bit,所以如果傳入的int型參數的大小大于255,將出現循環的情況。

輸入的

int型參數

相應的二進制

取低8位后的

二進制值

相應的十進制值

0

00000000000000000000000000000000

0

00000000

57

00000000000000000000000000111001

57

00111001

255

00000000000000000000000011111111

255

11111111

256

00000000000000000000000100000000

0

00000000

313

00000000000000000000000100111001

57

00111001

    例如:如下表








上表可以很清楚的看到但輸入的參數為0256,或者 57313 所得到的值將是一致的。

下面給出兩個參考程序,以便讀者實際的操作。

 

Demo One :

 

import java.io.OutputStream;

import java.io.IOException;

 

public class ASCIIPrint{

    public static void generateCharacters(OutputStream out)

throws IOException{

        int firstPrintableCharacter = 33 ;

        int numberOfPrintableCharacters = 94 ;

        int numberOfCharactersPerLine = 72 ;

        int start = firstPrintableCharacter ;

        int loop = 0 ;

        while(loop < 100){

            for(int i=start ; i<start+numberOfCharactersPerLine ; i++){

                out.write(((i-firstPrintableCharacter)

% numberOfPrintableCharacters)

+ firstPrintableCharacter);

            }

            out.write('\r');

            out.write('\n');

            start = ((start + 1) - firstPrintableCharacter)

% numberOfPrintableCharacters

+ firstPrintableCharacter ;

            loop++ ;

        }

    }

   

    public static void generateCharactersByByteArray(OutputStream out)

throws IOException{

        int firstPrintableCharacter = 33 ;

        int numberOfPrintableCharacters = 94 ;

        int numberOfCharactersPerLine = 72 ;

        int start = firstPrintableCharacter ;

        byte [] line = new byte[numberOfCharactersPerLine + 2];

        int loop = 0 ;

        while(loop < 100){

            for(int i = start ; i < start+numberOfCharactersPerLine ; i++){

                line[i-start] = (byte)((i - firstPrintableCharacter)

% numberOfPrintableCharacters

+ firstPrintableCharacter) ;

            }

            line[72] = (byte)'\r' ;

            line[73] = (byte)'\n' ;

            out.write(line) ;

            start = ((start + 1) - firstPrintableCharacter)

% numberOfPrintableCharacters

+ firstPrintableCharacter ;

            loop++;

        }

    }

   

    public static void main(String [] args){   

        try{

            // test 1:

            ASCIIPrint.generateCharacters(System.out) ;

           

            // test 2:

            ASCIIPrint. generateCharactersByByteArray (System.out);

        }

        catch(IOException IOe){

            IOe.printStackTrace();

        }

    }

}

運行此程序,讀者可以很清楚的看到循環的輸出ASCII碼。

這里希望讀者可以細細品味這兩個方法的區別,這兩個程序的輸出是一致的,可為什么要寫成兩個不同的方法,難道是為了好看?呵呵,當然不是。

如果讀者思考后還是沒有結果,可以發郵件,我們共同探討
 

2If you are done writing data, never forget to flush the output stream! This good habit avert from deadlock.

        System.out is a buffer output stream. 嘻嘻,你知道嗎?.\/.

 

 

3. 使用InputStreamread()方法時應當注意的.

     public abstract int read() throws IOException

在使用read()方法時,注意返回值的類型是int型,而read()是從input stream中讀取一個byte,所以很容易想到會使用類型轉換向下轉型,這個是很容易想到的,可往往細節容易被忽略。由于int型在Java中是有符號的,所以在轉型過程中得到的是有符號的byte,即是說其范圍是-128 to 127。解決方法是使用如下的一小段代碼

      int i = b > 0 ? b : 256+b;

      byte input = (byte)i;