Android 開發應用時的簡單IO流使用
阿新 • • 發佈:2019-01-10
程式碼原始碼:http://download.csdn.net/detail/qq_33599978/9724902
2. 然後將資料寫入到檔案中 和關閉流 ,count是字串資料轉型成Bt
2.
1.位元組流讀取的時候,讀到一個位元組就返回一個位元組; 字元流使用了位元組流讀到一個或多個位元組(中文對應的位元組數是兩個,在UTF-8碼錶中是3個位元組)時。先去查指定的編碼表,將查到的字元返回。
2.位元組流可以處理所有型別資料,如:圖片,MP3,AVI視訊檔案,而字元流只能處理字元資料。只要是處理純文字資料,就要優先考慮使用字元流,除此之外都用位元組流。
處理流型別
該型別是對一個已存在的流的連線和封裝,通過所封裝的流的功能呼叫實現資料讀寫,處理流的構造方法總是要帶一個其他流物件作為引數,一個流物件進過其他流的多次包裝,叫做流的連結。主要可以分為以下幾種:
1、緩衝流(BufferedInPutStream/BufferedOutPutStream和BufferedWriter/BufferedReader)他可以提高對流的操作效率。
寫入緩衝區物件:
一 寫入 的步驟:
1. FileOutputStream 找到寫入的目的地 FILE_NAME 定義的檔名FileOutputStream out = new FileOutputStream(getFilesDir() + "/"
+ FILE_NAME,true);
2. 然後將資料寫入到檔案中 和關閉流 ,count是字串資料轉型成Bt
/* out.write(count.getBytes()); out.close(); */ 資料會丟失 PrintStream ps = new PrintStream(out); // 自動重新整理 ,防止資料丟失 // 向檔案中寫入count(資料),但count是字元,所以轉成位元組 ps.write(count.getBytes()); ps.close(); out.close();
二:讀取的步驟
1.FileInputStream 作為檔案輸出流,找到檔案FileInputStream in = new FileInputStream(getFilesDir() + "/"
+ FILE_NAME);
2.
//建立byte 的陣列
byte[] by = new byte[1024];
//定義讀取的長度
int len = -1;
//定義可變長的字元數串
StringBuffer sb = new StringBuffer();
//迴圈讀取 追加末尾 append是將將指定的字串新增到該緩衝區sb的結尾.
while ((len = in.read(by))!=-1) {
sb.append(new String(by, 0, len));
//new String(by, 0, len);
}
in.close();
三. 封裝流
PrintStream PrintStream在OutputStream基礎之上提供了增強的功能,即可以方便地輸出各種型別的資料(而不僅限於byte型)的格式化表示形式。PrintStream的方法從不丟擲IOEceptin PrintWriter PrintWriter提供了PrintStream的所有列印方法,其方法也從不丟擲IOException。 與PrintStream的區別:作為處理流使用時,PrintStream只能封裝OutputStream型別的位元組流,而PrintWriter既可以封裝OutputStream型別的位元組流,還能夠封裝Writer型別的字元輸出流並增強其功能。四:字元流和位元組流的主要區別:
型別 | 字元流 | 位元組流 |
File(檔案) |
FileReader FileWriter |
FileInputStream FileOutputSream |
Memory Array |
CharArrayReader CharArrayWriter |
ByteArrayInputStream ByteArrayOutputSream |
Memory String |
StringReader StringWriter |
- |
Pipe(管道) |
PipedReader PipedWriter |
PipedInputSream PipedOutputSream |
- BufferedWriter bufw=new BufferedWriter(new FileWriter("buf.txt"));
- BufferedReader bufr=new BufferedReader(new FileReader("buf.txt"));
- InputStreamReader(InputStream); //通過建構函式初始化,使用的是本系統預設的編碼表GBK。
- InputStreamWriter(InputStream,String charSet); //通過該建構函式初始化,可以指定編碼表。
- OutputStreamWriter(OutputStream); //通過該建構函式初始化,使用的是本系統預設的編碼表GBK。
- OutputStreamwriter(OutputStream,String charSet); //通過該建構函式初始化,可以指定編碼表。
- DataInputStreamReader(InputStream);
- DataInputStreamWriter(OutputStream);
- int readInt();//一次讀取四個位元組,並將其轉成int值
- writeInt(int);//一次寫入四個位元組,注意和write(int)不同,write(int)只將該整數的最低一個8位寫入,剩餘三個8為丟失
- hort readShort();
- writeShort(short);
- String readUTF();//按照utf-8修改版讀取字元,注意,它只能讀writeUTF()寫入的字元資料。
- writeUTF(String);//按照utf-8修改版將字元資料進行儲存,只能通過readUTF讀取。
程式碼
package com.example.androiddatesave;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import com.gress.utils.ToastUtil;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
// 建立檔名 常量 檔案在window-Show View-other-Android-File Exploere
private final String FILE_NAME = "gress.txt";
private EditText mEt_writeDate, mEt_readDate;
// 寫入按鈕的監聽
public void write(View v) {
String count = mEt_writeDate.getText().toString();//一般這裡是一個輸入流來獲取檔案,但這裡資料已經存在記憶體所以不需要在使用輸入流直接呼叫就行
try {
/**
* getFileDir():獲取應用程式資料檔案的路徑 "/": 表示在某個路徑名下的目錄下 防止IO輸入為空 丟擲異常
* FileOutputStream()是帶一個引數是檔案絕對地址,如果檔案不存在就建立這個檔案
* 引數ture 表示在後面追加資料
*/
FileOutputStream out = new FileOutputStream(getFilesDir() + "/"
+ FILE_NAME,true);
ToastUtil.showToast(this,getFilesDir().getPath() );
/*out.write(count.getBytes());
out.close();*/
// 將 檔案包裝成PrintStream流
PrintStream ps = new PrintStream(out); // 自動重新整理 ,防止資料丟失
// 向檔案中寫入count(資料),但count是字元,所以轉成位元組
ps.write(count.getBytes());
ps.close();
out.close();
ToastUtil.showToast(this, "寫入成功");
// Toast.makeText(this, "寫入成功", Toast.LENGTH_LONG).show();
mEt_writeDate.setText("");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
ToastUtil.showToast(this, "寫入失敗");
}
}
// 讀取資料的監聽
/**
* @param 建立檔案輸入流
*/
public void read(View v) {
try {
// 建立檔案輸入流 丟擲IO輸入異常 放大異常
FileInputStream in = new FileInputStream(getFilesDir() + "/"
+ FILE_NAME);
//建立byte 的陣列
byte[] by = new byte[1024];
//定義讀取的長度
int len = -1;
//定義可變長的字元數串
StringBuffer sb = new StringBuffer();
//迴圈讀取 追加末尾 append是將將指定的字串新增到該緩衝區sb的結尾.
while ((len = in.read(by))!=-1) {
sb.append(new String(by, 0, len));
//new String(by, 0, len);
}
in.close();
ToastUtil.showToast(this, "讀取成功");// 封裝的一個工具類
//拿到讀到的位元組流強轉字元
String content = sb.toString();
//顯示在介面上
mEt_readDate.setText(content);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
ToastUtil.showToast(this, "讀取失敗");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEt_readDate = (EditText) findViewById(R.id.main_et_read);
mEt_writeDate = (EditText) findViewById(R.id.main_et_writedate);
}
}