转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6611252.html

引言:项目开发有时会使用上传文件到服务器,再从服务器取数据显示到本地这一过程;或者输入一段文字,再把文字显示出来。这个过程都用到了IO流。

IO流分为字符流(Reader\Writer)和字节流(InputStream\OutputStream)

在字节流当中,我们经常使用的就是FileInputStream(读取本地文件中的字节数据)和FileOutputStream(将字节数据写出到文件)

本案例我将操作如何使用FileOutputStream(File file)和FileInputStream(String name)

先做一下简单解释:
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名 name 指定。

FileOutputStream(File file)

①文件转换成流

系统给出的框架如下:

public FileOutputStream(File file) throws FileNotFoundException {
this(file, false);
}

实现步骤:创建文件路径、在路径下创建文件、将文件转换成流

File cacheDir = getApplicationContext().getFilesDir();
File file = new File(cacheDir, "test.txt");
FileOutputStream fos = null;
fos = new FileOutputStream(file);

②字符串转换成byte数组写入到流中

系统给出的框架如下:

public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}

实现步骤:获取到编辑的文字(用Buffer Knife代替findViewById)、将文字转换成字符串、将 b.length 个字节从指定 byte 数组写入此文件输出流中

@BindView(R.id.editText)
EditText editText;
String strWrite = editText.getText().toString();
fos.write(strWrite.getBytes());

③关闭流

关闭此文件输出流并释放与此流有关的所有系统资源

fos.close();

我们在EditText控件上输入1,log日志会给我们返回结果

03-24 14:02:17.591 28576-28576/? E/MainActivity: File为/data/user/0/com.tnnowu.android.iobutterknife/files/test.txt
03-24 14:02:17.591 28576-28576/? E/MainActivity: Fos为java.io.FileOutputStream@6eaf805

FileInputStream(String name)

①读取本地文件中的字节数据

系统给出的框架如下:

public FileInputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null);
}

实现步骤:获取到文件路径、读取文件中的字节数据

String filePath = getApplicationContext().getFilesDir().toString() + File.separator + "test.txt";
FileInputStream fis = null;
fis = new FileInputStream(filePath);

②将字节流写入到byte数组中

系统给出的框架如下:

public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}

实现步骤:从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

byte[] buffer = new byte[1024];
StringBuilder sb = new StringBuilder();
while (fis.read(buffer) != -1) {
sb.append(new String(buffer));
}

③关闭流
关闭此文件输入流并释放与此流有关的所有系统资源。

fis.close();

我们点击按钮,log日志会给我们返回结果

03-24 14:04:50.048 28576-28576/? E/MainActivity: Buffer为[B@27b505a
03-24 14:04:50.048 28576-28576/? E/MainActivity: strRead为1

完整代码(Butter Knife介入):

点击查看我的另一篇文章Butter knife使用详解

点击免费下载DEMO

MainActivity:

package com.tnnowu.android.iobutterknife;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "MainActivity"; @BindView(R.id.editText)
EditText editText;
@BindView(R.id.btn_write)
Button btnWrite;
@BindView(R.id.bth_read)
Button bthRead;
@BindView(R.id.btn_clear)
Button btnClear; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
} @OnClick({R.id.btn_write, R.id.bth_read, R.id.btn_clear})
public void onClick(View view) {
switch (view.getId()) {
       // FileOutputStream使用
case R.id.btn_write:
String strWrite = editText.getText().toString();
File cacheDir = getApplicationContext().getFilesDir();
File file = new File(cacheDir, "test.txt");
Log.e(TAG, "File为" + file);
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
Log.e(TAG, "Fos为" + fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
fos.write(strWrite.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
break;
       // FileInputStream使用
case R.id.bth_read:
String strRead = "";
StringBuilder sb = new StringBuilder();
String filePath = getApplicationContext().getFilesDir().toString() + File.separator + "test.txt";
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
byte[] buffer = new byte[1024];
Log.e(TAG, "Buffer为" + buffer);
try {
while (fis.read(buffer) != -1) {
sb.append(new String(buffer));
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
strRead = new String(sb);
Log.e(TAG, "strRead为" + strRead);
Toast.makeText(getApplicationContext(), strRead, Toast.LENGTH_LONG).show();
editText.setText(strRead);
break;
case R.id.btn_clear:
editText.setText("");
break;
}
}
}

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.tnnowu.android.iobutterknife.MainActivity"> <EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="100dp"
android:ems="10"
android:inputType="textPersonName"
android:text=""
android:textSize="40sp" /> <Button
android:id="@+id/btn_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="写" /> <Button
android:id="@+id/bth_read"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读" /> <Button
android:id="@+id/btn_clear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="清除" /> </LinearLayout>

FileInputStream 和FileOutputStream适用于操作于任何形式的文件(因为是以字节为向导),如果想要操作文本文件,采用FileInputReader和FileOutputWriter效率更高。

关注我的新浪微博,获取更多Android开发资讯!
关注科技评论家,领略科技、创新、教育以及最大化人类智慧与想象力!

Java字节流在Android中的使用的更多相关文章

  1. JAVA回调函数ANDROID中典型的回调地方

    在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...

  2. Java反射在Android中的使用

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6606687.html 做Java开发或者安卓开发的同学经常都会遇到这样一个问题,如果我们想调用A类里面的一 ...

  3. Java反射及其在Android中的应用学习总结

    一. Java反射机制 Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制同意程序在执行时透过Reflection APIs取得不论什么一个已知名称的class的内部信 ...

  4. Java反射全解析(使用、原理、问题、在Android中的应用)

    前言 今天说Java模块内容:反射. 反射介绍 正常情况下,我们知晓我们要操作的类和对象是什么,可以直接操作这些对象中的变量和方法,比如一个User类: User user=new User(); u ...

  5. Android中使用java.util.Properties犯的错

    今天尝试使用java.util.Properties来保存应用配置,然而遇到了好几个问题,对于熟悉此内容的来说可能都是猪一样的错误,但难免有像我一样的新手再次遇到,希望此文能有所帮助. 错误1 jav ...

  6. 穿越之旅之--android中如何执行java命令

    android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了 ...

  7. 在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错

    在android中下载文件,写好下载文件的代码后需要配置相应的权限 <uses-permission android:name="android.permission.INTERNET ...

  8. 在Android中使用Java 8的lambda表达式

    作为一名Java开发者,或许你时常因为缺乏闭包而产生许多的困扰.幸运的是:Java's 8th version introduced lambda functions给我们带来了好消息;然而,这咩有什 ...

  9. Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

    Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...

随机推荐

  1. Modelbuilder进阶教程

    Modelbuilder进阶教程 By 李远祥 Modelbuilder 进阶1 自定义变量 参数是用来交互操作的,因此,参数具备非常大的灵活性,包括参数的定义和调用. 除了工具里面的参数之外,还可以 ...

  2. 读书笔记 effective c++ Item 6 如果你不想使用编译器自动生成的函数,你需要明确拒绝

    问题描述-阻止对象的拷贝 现实生活中的房产中介卖房子,一个服务于这个中介的软件系统很自然的会有一个表示要被销售的房屋的类: class HomeForSale { ... }; 每个房产中介会立刻指出 ...

  3. swift 可选类型笔记

    晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...

  4. Extjs 数据代理

    Ext.data.proxy.Proxy 代理类的根类 客户端代理: 1.LocalStorageProxy:将数据存储在localStorage中,此种方式可以持久的将数据存储在客户端 要使用代理, ...

  5. Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用

    前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...

  6. path和classpath的用途

    1 path很明显是unix shell的环境变量,比如bash shell,输入一个命令,它会先去path指定的目录下查找是不是有该命令的可执行文件. 2 -classpath 只是用在下面这种不发 ...

  7. 【WC2015】混淆与破解 (Goldreich-Levin 算法)

    这个嘛= =直接贴VFK的题解就行了吧,感觉自己还是差别人太多 http://vfleaking.blog.uoj.ac/blog/104 讲得挺明白了的说,但还是挺难理解的说,中间实现部分简直不要太 ...

  8. java(jdk1.7) IO系列01之InputStream和OutputStream解析

    1.InputStream和OutputStream简介 在java中InputStream和OutputStream分别代表字节输入流和字节输出流,表示以字节的方式来实现进程或者程序的通信,Inpu ...

  9. java springmvc +spring+ mybaits 模块化开发框架 HTML5+css3.0+bootstrap响应式开发界面

    需要源码,请加QQ:858-048-581 系统模块 1.   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限       角色(基础权限): 分角色组和角色,独立分配菜单权限和增 ...

  10. .Net软件开发面试技巧

    2016.11.20日,我们毕业了!到了大家各奔东西的日子了,有留在家里的,有另求出路的,有留在哈尔滨的,有去北京的!去北京的一共有11个同学,我就是这11个人里的一个! 大学刚毕业的时候,在济南上班 ...