Java位元組流在Android中的使用

来源:http://www.cnblogs.com/cnwutianhao/archive/2017/03/24/6611252.html
-Advertisement-
Play Games

轉載請註明出處:http://www.cnblogs.com/cnwutianhao/p/6611252.html 引言:項目開發有時會使用上傳文件到伺服器,再從伺服器取數據顯示到本地這一過程;或者輸入一段文字,再把文字顯示出來。這個過程都用到了IO流。 IO流分為字元流(Reader\Writer ...


轉載請註明出處: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開發資訊!
關註科技評論家,領略科技、創新、教育以及最大化人類智慧與想象力!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.應用程式 Android會同一系列核心應用程式包一起發佈,該應用程式包包括email客戶端,SMS短消息程式,日曆,地圖,瀏覽器,聯繫人管理程式等。所有的應用程式都是使用JAVA語言編寫的。 2.應用程式框架 開發人員也可以完全訪問核心應用程式所使用的API框架。該應用程式的架構設計簡化了組件的 ...
  • 有這樣一個ListView,要求在屏幕底部有一個篩選排序的浮動框: 1、手指下拉隱藏,上滑顯示 ; 2、如果沒做任何操作,2S之後,要自動顯示; 3、滑動到最底部,始終顯示。 首先看其效果圖: 實現上述效果,其實現原理如下: 1、在屏幕頂部固定一個BottomView,XML佈局最好使用Relati ...
  • 有一個Button 按鈕,要想為該按鈕設置onClick事件和OnTouch事件 此時,我們現在分析一下,是onTouch先執行,還是onClick執行,接下來我從FrameWork 源碼去探尋一下整個事件的執行流程和原理: 我們知道 Button ,TextView 等基礎控制項的基類都是View, ...
  • 主要原理:是在主界面有兩個空間,一個是EditText,一個是ListView,ListView是放在EditText下麵的,然後自定義建立一個adapter適配器, 這個適配器要繼承Filterable這個介面,並實現這個介面的兩個方法,一個是過濾方法,一個是過濾後的方法,一般我們是在過濾方法裡面 ...
  • Android原生的CalendarView根本無法滿足我們日常開發的需要,在開發吾記APP的過程中,我覺得需要來一款高性能且美觀簡潔的日曆控制項,覺得魅族的日曆風格十分適合,於是打算擼一款。 github地址:https://github.com/huanghaibin-dev/CalendarVi ...
  • 想獲取用戶各項行為數據嗎? 想輕鬆查看用戶行為圖表嗎? 想高效進行 App 運營管理嗎? 想,來我帶你玩轉 App 數據統計。這裡我使用專業、輕便的 "JAnalytics" 。 本文內容分為兩部分:代碼示例&使用技巧部分、控制台圖表查看部分。 代碼示例&使用技巧 集成 1. 下載 "JAnalyt ...
  • 本文並非最終版本,如果想要關註更新或更正的內容請關註文集,聯繫方式詳見文末,如有疏忽和遺漏,歡迎指正。 本文相關目錄: ================== 所屬文集: "【iOS】07 設備工具 " ================== "7.4 定位服務 1.0 簡介" "7.4 定位服務 2. ...
  • Context,中文直譯為“上下文”,SDK中對其說明如下: 1、它描述的是一個應用程式環境的信息,即上下文。 2、該類是一個抽象(abstract class)類,Android提供了該抽象類的具體實現類。 3、通過它我們可以獲取應用程式的資源和類,也包括一些應用級別操作,例如:啟動一個Activ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...