天天看點

IO流——自定義位元組流的緩沖區

import java.io.*;

class MyBufferedInputStream
{
	private InputStream in;

	private byte[] buf = new byte[1024*4];
		
	private int pos = 0,count = 0;
	
	MyBufferedInputStream(InputStream in)
	{
		this.in = in;
	}

	//一次讀一個位元組,從緩沖區(位元組數組)擷取。
	public int myRead()throws IOException
	{
		//通過in對象讀取硬碟上資料,并存儲buf中。
		if(count==0)
		{
			count = in.read(buf);
			if(count<0)
				return -1;
			pos = 0;
			byte b = buf[pos];

			count--;
			pos++;
			return b&255;
		}
		else if(count>0)
		{
			byte b = buf[pos];

			count--;
			pos++;
			return b&0xff;
		}
		return -1;

	}
	public void myClose()throws IOException
	{
		in.close();
	}
}


/*
11111111-111111110000000000101001001010100101010010101001010


byte: -1  --->  int : -1;
00000000 00000000 00000000 11111111  255

11111111 11111111 11111111 11111111


11111111  -->提升了一個int類型 那不還是-1嗎?是-1的原因是因為在8個1前面補的是1導緻的。
那麼我隻要在前面補0,即可以保留原位元組資料不變,又可以避免-1的出現。
怎麼補0呢?

 11111111 11111111 11111111 11111111                        
&00000000 00000000 00000000 11111111 
------------------------------------
 00000000 00000000 00000000 11111111 

0000-0001
1111-1110
000000001
1111-1111  -1


結論:
位元組流的讀一個位元組的read方法為什麼傳回值類型不是byte,而是int。
因為有可能會讀到連續8個二進制1的情況,8個二進制1對應的十進制是-1.
那麼就會資料還沒有讀完,就結束的情況。因為我們判斷讀取結束是通過結尾标記-1來确定的。
是以,為了避免這種情況将讀到的位元組進行int類型的提升。
并在保留原位元組資料的情況前面了補了24個0,變成了int類型的數值。


而在寫入資料時,隻寫該int類型資料的最低8位。


*/