• Java字节流在Android中的使用


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

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

    IO流分为字符流(ReaderWriter)和字节流(InputStreamOutputStream)

    在字节流当中,我们经常使用的就是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开发资讯!
    关注科技评论家,领略科技、创新、教育以及最大化人类智慧与想象力!

  • 相关阅读:
    AC自动机+全概率+记忆化DP UVA 11468 Substring
    java POI技术之导出数据优化(15万条数据1分多钟)
    验证IP端与数据库Ip端是否重复!!!
    JAVA中IP和整数相互转化(含有掩码的计算)
    Nginx搭建反向代理服务器过程详解
    session原理及实现共享
    Linux部署多个tomcat
    linux下怎么修改mysql的字符集编码
    linux yum 安装mysql
    VM虚拟机下的Linux不能上网
  • 原文地址:https://www.cnblogs.com/cnwutianhao/p/6611252.html
Copyright © 2020-2023  润新知