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