转载请注明出处: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. Javascript日期格式化指定格式的字符串实现

    代码部分 TypeScript /** * format a Date object * 将 Date 转化为指定格式的String * @param {Date} date 源日期对象 * @par ...

  2. 使用VS Code从零开始开发调试.NET Core 1.1

    使用VS Code 从零开始开发调试.NET Core 1.1.无需安装VS 2017 RC 即可开发.NET Core 1.1. .NET Core 1.1 发布也有一段时间了,最大的改动是从 pr ...

  3. this的相关介绍与用法

    当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并 ...

  4. 【读书笔记】-- JavaScript模块

    在JavaScript编程中我们用的很多的一个场景就是写模块.可以看成一个简单的封装或者是一个类库的开始,有哪些形式呢,先来一个简单的模块. 简单模块 var foo = (function() { ...

  5. 继BAT之后 第四大巨头是谁

    中国互联网三大巨头的位置,毫无疑问是属于百度腾讯阿里的,但在它们之后,哪家公司能进巨头之列?京东布局不错,走亚马逊路线:360同时占据传统和移动互联网两大领域入口:小米软硬整合,生态系统完整. 很多人 ...

  6. JDBC链接mysql数据库

    Unit_1 首先:JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系是接口与实现的关系. JDBC涉及到四个核心的 ...

  7. PHP学习2 — PHP Cookie 与 Session

    PHP Cookies cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 ...

  8. 最常用的UML工具介绍

    最常用的UML工具介绍 1.Rational Rose.大名鼎鼎,史上最有名.最无可替代的UML产品,以至于,大多数将之等同于UML工具,正如将可乐等同于可口可乐.需要指出的是,自从 Rational ...

  9. Java第三天

    0.注释: 目的:方便其他人阅读理解我们的代码 三种: // 单行注释,进行解释 /**/ 多行注释 /***/ 多行注释 (/***/注释通常用于方法,函数注释,在调用写好的方法或是函数时可以通过点 ...

  10. 了解 : EDM

    EDM是 Entity Data Meta,首先先了解什么是Entity. Entity 它是一个框架,在C#使用,方便调用SQL data的,和Odata 调用有关.细节我不清楚! EDM 基本是表 ...