I/O流的梳理和小结

简介: 探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制Android多...

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


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);
            }
        }
    }

}
相关文章
|
消息中间件 Linux 数据安全/隐私保护
linux mq的安装并设置开机启动 图文!!
linux mq的安装并设置开机启动 图文!!
479 0
|
11月前
|
机器学习/深度学习 人工智能 物联网
5G与AI融合:智能网络的新纪元
【10月更文挑战第25天】
513 3
|
分布式计算 资源调度 监控
Hadoop生态系统深度剖析:面试经验与必备知识点解析
本文深入探讨了Hadoop生态系统的面试重点,涵盖Hadoop架构、HDFS、YARN和MapReduce。了解Hadoop的主从架构、HDFS的读写流程及高级特性,YARN的资源管理与调度,以及MapReduce编程模型。通过代码示例,如HDFS文件操作和WordCount程序,帮助读者巩固理解。此外,文章强调在面试中应结合个人经验、行业动态和技术进展展示技术实力。
318 0
|
存储 前端开发 JavaScript
elementUI Tree 树形控件单选实现
【6月更文挑战第3天】Element UI 的树形控件(el-tree)默认不支持单选,但可以通过监听节点点击事件并手动更新选中状态实现。以下是一个简单的示例,展示如何创建单选树: ```html &
556 0
|
弹性计算 对象存储 CDN
阿里云流量怎么收费?0.8元每GB?地域不同流量价格不同
阿里云流量怎么收费?0.8元每GB?地域不同流量价格不同,除了华北 1 (青岛)地域是0.72元/GB的价格,其他的阿里云中国内地云服务器流量价格均为0.8元每GB;中国香港地域价格为1GB流量1元;美国、英国和德国流量最便宜是0.5元每GB。
3171 1
阿里云流量怎么收费?0.8元每GB?地域不同流量价格不同
|
Java 程序员 应用服务中间件
雷军22年前写的代码 你见过吗?
作为小米科技的创始人、董事长和首席执行官,雷军的名字如雷贯耳。网上出现一篇“刘强东的代码水平如何”的文章,有网友在下面回复“代码只服雷军”。这个回复吸引了小编的注意,雷军的代码水平真的很牛吗? 原来雷军年轻的时候,也是一名程序员,而且一干就是10年。
1920 0
|
存储 算法 Java
使用keytool 生成证书
keytool 简介 keytool 是java 用于管理密钥和证书的工具,官方文档其功能包括: 创建并管理密钥 创建并管理证书 作为CA 为证书授权 导入导出证书 主要格式keytool 采用 keystore 文件来存储密钥及证书,其中可包括私钥、信任证书;keystor...
7833 0
开发者说:Sentinel 流控功能在 SpringMVC/SpringBoot 上的实践
从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第6篇,作者 Jason Joo,@友乐活(北京),Sentinel Committer.
24643 92
|
编译器 C语言 芯片
51单片机介绍
1.1:单片机的种类 51系列单片机 :51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。— 0.0嘻IXAuXUe3nG4! https://m.tb.cn/h.4HSC1TB?sm=f79b70 51单片机开发板实验板送视频教程带點阵STC89C52芯片学习板普中。买这个开发板,
1068 1
51单片机介绍
|
传感器 监控 网络协议
一文搞懂物联网Modbus通讯协议
一般来说,常见的物联网通讯协议众多,如蓝牙、Zigbee、WiFi、ModBus、PROFINET、EtherCAT、蜂窝等。而在众多的物联网通讯协议中,Modbus是当前非常流行的一种通讯协议。它一种串行通信协议,是Modicon公司于1979年为使用可编程逻辑控制器(PLC)通信而制定的,可以说,它已经成为工业领域通信协议的业界标准。
2347 1
一文搞懂物联网Modbus通讯协议