刚在学习Android时,看到拷贝的语句觉得很奇怪,
因为在引用时,使用的语句是public void CopyDB ( InputStream inputStream , OutputStream outputStream ) throws IOException{byte [] buffer = new byte [ 1024 ];int length ;while (( length = inputStream . read ( buffer ))> 0 ){outputStream . write ( buffer , 0 , length );}inputStream . close ();outputStream . close ();}
CopyDB(getBaseContext(),getAssets().open("mydb"),new FileOutputStream(dirPtah+"/MyDB")
总是看不明白为啥第二个参数里使用的是FileOutputStream而方法里参数是OutputStream呢?不是不一样吗?
学习了《Think in Java》后才知道,原来这叫做上溯造型,OutputStream是FileOutputStream的抽象基本类,不能用new,而FileOutputStream创建的句柄都可以使用OutputStream,然而他们就是通用的……
终于体会到一点Java的字节流和字符流的强大,都是继承于OutputStream/InputStream以及Reader/Writer,后面类可以上溯造型很多接口就可以通用了。
至于while里面的语句,还是要学习一下的。read的一个构造函数是这样的:
public int read(byte[] buffer) throws IOException它的返回值是int,返回当前buffer里实际读取的字节数,如果并未读取到数据,就会返回-1。
至于write的它的构造函数中一种形式是:
public void write(byte[] buffer,int offset,int count) throws IOException它会把buffer里从offset起数量为count的数据写入到对象里。
还有一个需要理解的是,使用read后,buffer里是有数据的(前提是还没写完),被write后,buffer里就空了,这才能使while形成一个循环。这里再往下可能就要理解到类似于C语言里的指针类的东西了吧。