I/O流的梳理和小结

来源:互联网 发布:硬盘初始化 数据错误 编辑:程序博客网 时间:2024/06/05 11:54

版权声明:本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl

package cc.testio;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.widget.ImageView;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;/** * * IO流小结: * * 1 InputStream和OutputStream中出和入的方向都是相对于内存而言的. *   读进内存的采用InputStream,写出内存的采用OutputStream * * 2 在使用IO流时请注意区分采用字节流还是字符流 *   比如对于图片的读取就不能采用字符流 * * 3 原来的几篇和IO相关的博文,现已Deprecated *   http://blog.csdn.net/lfdfhl/article/details/8195216 *   http://blog.csdn.net/lfdfhl/article/details/8195214 *   http://blog.csdn.net/lfdfhl/article/details/8195422 *   http://blog.csdn.net/lfdfhl/article/details/8195375 *   http://blog.csdn.net/lfdfhl/article/details/12174041 * * * 原创作者 * 谷哥的小弟 * * 博客地址 * http://blog.csdn.net/lfdfhl * */public class MainActivity extends AppCompatActivity {    private ImageView mImageView;    private DownLoaderAsyncTask mAsyncTask;    private String SDCardDir;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        SDCardDir= Environment.getExternalStorageDirectory()+ File.separator;        mImageView = (ImageView) findViewById(R.id.imageView);        test1();        //test2();        //test3();        //test4();    }    /**     *     * 利用IO流拷贝文本文件     *     * 原创作者     * 谷哥的小弟     *     * 博客地址     * http://blog.csdn.net/lfdfhl     */    private void test1() {        // 字节输入流        FileInputStream fileInputStream = null;        // 字符输入流        InputStreamReader inputStreamReader = null;        // 带缓冲的字符输入流        BufferedReader bufferedReader = null;        // 字节输出流        FileOutputStream fileOutputStream = null;        // 字符输出流        OutputStreamWriter outputStreamWriter = null;        // 带缓冲的字符输出流        BufferedWriter bufferedWriter = null;        try {            fileInputStream = new FileInputStream(SDCardDir + "test.txt");            //原文件的编码格式为GBK,故在此按该编码方式读取字符避免乱码            inputStreamReader = new InputStreamReader(fileInputStream,"GBK");            bufferedReader = new BufferedReader(inputStreamReader);            fileOutputStream = new FileOutputStream(SDCardDir + "eeee.txt");            outputStreamWriter = new OutputStreamWriter(fileOutputStream);            bufferedWriter = new BufferedWriter(outputStreamWriter);            String line = null;            while ((line = bufferedReader.readLine()) != null) {                bufferedWriter.write(line);                bufferedWriter.newLine();                bufferedWriter.flush();            }        } catch (Exception e) {        } finally {            if (null != bufferedWriter) {                try {                    bufferedWriter.close();                } catch (IOException e) {                }            }            if (null != bufferedReader) {                try {                    bufferedReader.close();                } catch (IOException e) {                }            }        }    }    /**     *     * 利用IO流拷贝本地图片     *     * 原创作者     * 谷哥的小弟     *     * 博客地址     * http://blog.csdn.net/lfdfhl     */    private void test2() {        FileInputStream fileInputStream = null;        FileOutputStream fileOutputStream = null;        try {            fileInputStream = new FileInputStream(SDCardDir + "beauty.jpg");            fileOutputStream = new FileOutputStream(SDCardDir + "yyyy.jpg");            int len = 0;            byte buffer[] = new byte[1024 * 2];            while ((len = fileInputStream.read(buffer)) != -1) {                fileOutputStream.write(buffer, 0, len);                fileOutputStream.flush();            }        } catch (Exception e) {        } finally {            try {                if (null != fileInputStream) {                    fileInputStream.close();                }                if (null != fileOutputStream) {                    fileOutputStream.close();                }            } catch (Exception e) {            }        }    }    /**     *     * 利用IO流加载本地图片     *     * 在得到FileInputStream之后可以调用系统API获取Bitmap:     * Bitmap bitmap=BitmapFactory.decodeStream(fileInputStream);     * 当然,在此我们不采用该方法而是自己用IO流来读取Bitmap。     *     * 嗯哼,继续说这个例子.     * 在此请注意对于buffer的大小指定     * byte [] buffer=new byte[fileInputStream.available()];     * 具体大小为fileInputStream.available().     * 请注意文档的描述:     * public int available() throws IOException     * 返回可以不受阻塞地从此文件输入流中读取的字节数。     * 在该示例中图片保存于本地,故可不受阻塞地读取该文件     * 所以可通过fileInputStream.available()获取到文件的大小     *     * 在为buffer设置完大小后再将数据读入到buffer中     * fileInputStream.read(buffer);     * 再解析得到Bitmap     * Bitmap bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);     *     * 原创作者     * 谷哥的小弟     *     * 博客地址     * http://blog.csdn.net/lfdfhl     */    private void test3(){        FileInputStream fileInputStream=null;        try {            fileInputStream=new FileInputStream(SDCardDir+"beauty.jpg");            byte [] buffer=new byte[fileInputStream.available()];            fileInputStream.read(buffer);            Bitmap bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);            mImageView.setImageBitmap(bitmap);        }catch (Exception e){        }finally {            try {                if (null != fileInputStream) {                    fileInputStream.close();                }            } catch (Exception e) {            }        }    }    /**     *     * 利用IO流加载网络图片     *     * 在该示例中图片不再在本地而是在远程。     * 在这种情况下可能发生网络阻塞,企图利用     * inputStream.available()获取图片的大小是错误的;     * 此时,利用该方法获取到的值远小于图片大小。     *     * 那么该怎么做呢?     * 可以这样:     * while ((len = inputStream.read(buffer)) != -1) {     *        byteArrayOutputStream.write(buffer, 0, len);     * }     * 1 利用inputStream将数据不断地读入到buffer中,即:     *   while ((len = inputStream.read(buffer)) != -1)     * 2 将buffer中的数据写入到ByteArrayOutputStream中,即:     *   byteArrayOutputStream.write(buffer, 0, len);     * 3 读取完数据后将ByteArrayOutputStream中的全部字节数据保存到字节数组中     *   byte[] imageData = byteArrayOutputStream.toByteArray();     * 4 解析生成Bitmap     *   Bitmap bitmap = BitmapFactory.decodeByteArray(imageData,0,imageData.length);     *     *  此示例中ByteArrayOutputStream充当了"中转站"的作用。     *  我们不能一次性从inputStream中获取到所有的数据,所以就通过     *  多次读取来获得所有的数据;每次读取后就将数据暂存于ByteArrayOutputStream.     *  当完成多次读取后再将全部数据从ByteArrayOutputStream中取出     *     * 原创作者     * 谷哥的小弟     *     * 博客地址     * http://blog.csdn.net/lfdfhl     */    private void test4(){        mAsyncTask = new DownLoaderAsyncTask();        mAsyncTask.execute("http://avatar.csdn.net/6/6/D/1_lfdfhl.jpg");    }    private class DownLoaderAsyncTask extends AsyncTask<String, Integer, Bitmap> {        @Override        protected void onPreExecute() {            super.onPreExecute();        }        @Override        protected Bitmap doInBackground(String... params) {            InputStream inputStream = null;            ByteArrayOutputStream byteArrayOutputStream = null;            try {                URL imageUrl = new URL(params[0]);                HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection();                connection.setConnectTimeout(5000);                connection.setRequestMethod("GET");                if (connection.getResponseCode() == 200) {                    inputStream = connection.getInputStream();                    byteArrayOutputStream = new ByteArrayOutputStream();                    byte[] buffer = new byte[ 1024 ];                    int len;                    while ((len = inputStream.read(buffer)) != -1) {                        byteArrayOutputStream.write(buffer, 0, len);                    }                    byte[] imageData = byteArrayOutputStream.toByteArray();                    Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);                    return bitmap;                }            } catch (Exception e) {            } finally {                try {                    if (null != inputStream) {                        inputStream.close();                    }                    if (null != byteArrayOutputStream) {                        byteArrayOutputStream.close();                    }                } catch (Exception e) {                }            }            return null;        }        @Override        protected void onPostExecute(Bitmap bitmap) {            super.onPostExecute(bitmap);            if (null != bitmap) {                mImageView.setImageBitmap(bitmap);            }        }    }}
0 0
原创粉丝点击