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使用詳解

點擊免費下載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開發資訊!
關注科技評論家,領略科技、創新、教育以及最大化人類智慧與想象力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM