转载请注明出处: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. BOM之history对象(转)

    前面的话 history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起.由于安全方面的考虑,开发人员无法得到用户浏览器的URL,但借由用户访问过的页面列表,可以在不知道实际URL的情况下实现后 ...

  2. H5常见的兼容问题及解决

    最近这两天经常遇到一些麻烦的兼容问题,统一整理一下,比较简单也不是特别全面,希望大家多多交流. 几种IE6 bug的解决方法 1)png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.也 ...

  3. 微信小程序 网络请求之设置合法域名

    设置域名 登录微信公众号后台小程序中 设置→开发设置→服务器设置 必须设置域名,微信小程序才能进行网络通讯,不然会报错 如果设置好了合法域名,开发工具还提示不在合法域名列表中,因为在微信会有一段时间的 ...

  4. 图片转换PDF

    组件在我的文件里,需要的可以找找. public partial class MainForm : Form { private string srcFile, destFile; bool succ ...

  5. 配置FindBugs和常见FindBugs错误

    配置FindBugs: 在这里可以对FindBugs规则等进行详细设置. 选择你的项目,右键 => Properties => FindBugs => 1 Run Automatic ...

  6. 纪中集训 Day 0?

    好吧昨天的等到今天才来写,现在超不想刷题,来写下blog吧= = 坐了近10H的火车终于来到了中山市 火车上在看空之境界,等有时间补下动画吧= = 到了宿舍各种不习惯(现在才发现还是母校好QAQ)然后 ...

  7. 解析java泛型(二)

    上篇我们简单的介绍了java中泛型的最基本的内容,知道了什么是泛型以及泛型对我们的程序编写有什么好处,最后一类型限定收尾.本篇将从类型限定开始阐述java泛型中很重要的概念:通配符 一.何为通配符   ...

  8. JTextArea与TextArea自动换行和滚动条的区别对比

    最近在用Java写一个仿记事本的程序,但是发现用JTextArea写的效果有点差,但是用TextArea自动换行并不那么方便,经过对比和实践,我也发现自己对这两个标签认识存在不足,下面就来讨论一下他们 ...

  9. PDO(PHP Data Object)数据访问抽象层

    1.可以访问其它数据库2.具有事务功能3.带有预处理语句功能(防止SQL注入攻击) 访问数据库 PDO::__construct ( string $dsn [, string $username [ ...

  10. Unity3D换装系统

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6505561.html 一.换装原理 游戏角色换装分为以下几步: 1.替换蒙皮网格 2.刷新骨骼 3.替换材质 上 ...