首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

用BufferedOutputStream跟FileOutputStream写入文件的区别

2012-08-13 
用BufferedOutputStream和FileOutputStream写入文件的区别最近开始做一个android的一个小项目的开发,其中

用BufferedOutputStream和FileOutputStream写入文件的区别
最近开始做一个android的一个小项目的开发,其中涉及到图片的本地缓存,调用写好的工具类执行,发现当工具类里边写入的时候用BufferedOutputStream和FileOutPutStream的结果不一样,当用Buffered的时候,写出来的文件会比源文件大,并且,当用Buffered的方法把网上的图片文件Down到本地的时候,图片会发生异常的错误,本人是一个新手阿,表示非常的费解,百度过也google过,没有找到解法,希望各位能帮帮忙
现边首先放上布局文件

XML code
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/Download"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Button" />    <ImageView        android:id="@+id/imageView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher" /></LinearLayout>

接下来是Main activity
Java code
package com.Kiro.DownloadTool;import java.io.InputStream;import java.net.URL;import org.apache.http.impl.conn.Wire;import com.Kiro.FileTool.Read;import com.Kiro.FileTool.Write;import com.Kiro.Tool.R;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;public class Main extends Activity implements OnClickListener {    private ImageView image = null;    private String sd = null;    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.download);        sd = Environment.getExternalStorageDirectory().toString() + "/";        ((Button) findViewById(R.id.Download)).setOnClickListener(this);        image = (ImageView) findViewById(R.id.imageView1);    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        InputStream input = new Download(                "http://www.hmecw.com/file/upload/201109/05/09-42-46-51-45140.jpg.middle.jpg")                .getInputStream();        new Write(input, sd + "a.jpg", 1024).process();        try {            input.close();        } catch (Exception e) {            // TODO: handle exception        }    }}

接下来是download java文件
Java code
package com.Kiro.DownloadTool;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import org.apache.http.HttpConnection;public class Download {    private String Address;    public Download(String address) {        super();        Address = address;    }//    url = new URL(urlStr);// 创建一个URL对象    //    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();// 创建一个Http连接//    InputStream inputStream = urlConn.getInputStream();//得到输入流    public InputStream getInputStream() {        InputStream ret = null;        try {            URL url = new URL(Address);            HttpURLConnection conn=(HttpURLConnection)url.openConnection();            ret=conn.getInputStream();        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }        return ret;    }    }

然后是最后一个代码断,Write文件
Java code

package com.Kiro.FileTool;import java.io.BufferedOutputStream;import java.io.FileOutputStream;import java.io.InputStream;/*注意,使用该类的时候,mInputStream未调用close方法 mBufferSize为写入时缓存数组大小,即写入时缓存是byte[mBufferSize]*/public class Write {    private InputStream mInputStream;    private String mPath;    private int mBufferSize;    public Write(InputStream mInputStream, String mPath, int mBufferSize) {        super();        this.mInputStream = mInputStream;        this.mPath = mPath;        this.mBufferSize = mBufferSize;    }    public void process() {        try {            FileOutputStream tem = new FileOutputStream(mPath);            byte[] mByte = new byte[mBufferSize];            while (mInputStream.read(mByte) != -1) {                tem.write(mByte);            }            tem.flush();            tem.close();        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }    }}

   
  当用上边列出的文件的时候,整个功能是没有问题的,但当把Write中的Process方法中的 FileOutputStream用BufferedOutputStream包装过以后,就会出现本文开头所叙述的错误,请各位高手告诉我为什么会出现这种情况??

[解决办法]
Java code
try {            FileOutputStream tem = new FileOutputStream(mPath);            byte[] mByte = new byte[mBufferSize];            while (mInputStream.read(mByte) != -1) {                tem.write(mByte);            }            tem.flush();            tem.close();        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        } 

热点排行