当前位置: 代码迷 >> Android >> 用BufferedOutputStream和FileOutputStream写入文件的区别解决思路
  详细解决方案

用BufferedOutputStream和FileOutputStream写入文件的区别解决思路

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