Java字节流在Android中的使用
转载请注明出处: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使用详解
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效率更高。