转载请注明出处: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. Array数组常用的5个方法

    es6 时代来临了,不知道es5 你熟知了吗? 在此介绍一个我常用到的5个方法,万恶的ie9一下并不支持,需要做兼容慎用 indexOf indexOf()方法返回在该数组中第一个找到的元素位置,如果 ...

  2. asp.net权限认证:OWIN实现OAuth 2.0 之密码模式(Resource Owner Password Credential)

    asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...

  3. JAVA中的栈和堆

    JAVA在程序运行时,在内存中划分5片空间进行数据的存储.分别是:1:寄存器.2:本地方法区.3:方法区.4:栈.5:堆. 基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了. ...

  4. mysql 打开sql日志,记录所有sql

    我使用的mysql版本为:5.7.11 win7环境 记录下下载地址,省得每次百度搜了:http://dev.mysql.com/downloads/installer/ mysql 默认没有开启sq ...

  5. [Hadoop] - SSH免密码登录

    在安装hadoop之前需要进行ssh免密码登录,ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以Redhat为例. 我这里只采用一台机器A(10. ...

  6. 【Javaweb】笔面试题 ---(1)

    Javaweb 面试题:理解才是最重要的,而不是原封不动的背下来 一.请简述doget和dopost它们的区别 1) get是从服务器上获取数据,post是向服务器传送数据. 2) 在客户端,Get方 ...

  7. 浅谈Java单例模式

    关于基本的懒汉式,饿汉式等写法网上介绍多如牛毛,这里不再赘述,直接讨论加了volatile关键字的双重锁(Double check),静态内部类以及枚举等写法,如有不对,恳请读者指出,欢迎讨论. 1. ...

  8. path和classpath的用途

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

  9. HNOI2015 Day 2题解

    昨天做了HNOI day 2,感觉好像还是可做的,想当年什么splay还是高级算法,现在点剖什么就老考了简直丧病,虽然第二题还没写那就先当下嘴巴选手吧= = T1:[HNOI2015]落忆枫音 描述: ...

  10. tornado学习 - TCPClient 实现聊天功能

    之前完成了一个简单的聊天服务器,连接服务器使用的是系统自带nc命令,接下来就是通过自己实现TCPClient. 客户端与服务器功能大致相仿,相对与服务器只是少了转发消息环节. 首先,定义TCPClie ...