MainActivity.java
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 org.apache.commons.io.FileUtils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class MainActivity extends AppCompatActivity {
private Button bt1, bt2, bt3, bt4, bt5, bt6, bt7;
private EditText save,write;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1= (Button) findViewById(R.id.save);
bt2= (Button) findViewById(R.id.write);
bt3 = (Button) findViewById(R.id.copy);
bt4 = (Button) findViewById(R.id.copy1);
bt5 = (Button) findViewById(R.id.copy2);
bt6 = (Button) findViewById(R.id.copy3);
bt7 = (Button) findViewById(R.id.copy4);
save= (EditText) findViewById(R.id.text1);
write= (EditText) findViewById(R.id.text2);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// File sdcard= Environment.getExternalStorageDirectory();
// File file=new File(sdcard,"1111.text");
File directory = new File("/mnt/sdcard/Test/");
File file = new File("/mnt/sdcard/Test/test.txt");
if(!directory.exists()){
directory.mkdir();//沒有目錄先創(chuàng)建目錄
// Toast.makeText(getApplicationContext(), "創(chuàng)建目錄成功", Toast.LENGTH_SHORT).show();
}
try {
if(!file.exists()){
file.createNewFile();
}
FileOutputStream fos=new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");//讀寫文件要保持統(tǒng)一編碼方式,否則讀取為亂碼
osw.write(save.getText().toString());
osw.flush();
osw.close();
fos.close();
Toast.makeText(MainActivity.this,"保存成功",Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
});
//字節(jié)流讀寫數(shù)據(jù)
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File directory = new File("/mnt/sdcard/Test/");
File file = new File("/mnt/sdcard/Test/test.txt");
if(!directory.exists()){
directory.mkdir();
}
// File sdcard= Environment.getExternalStorageDirectory();
// File file=new File(sdcard,"1111.text");
FileInputStream fis=new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "utf-8");//讀寫文件要保持統(tǒng)一編碼方式,否則讀取為亂碼
char input[] = new char[fis.available()];//獲取fis長度
isr.read(input);
isr.close();
fis.close();
write.setText(new String(input));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
//帶緩沖的字節(jié)流讀寫數(shù)據(jù)
bt3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File ifile = new File("/mnt/sdcard/Download/3.gif");//目標文件
File wfile = new File("/mnt/sdcard/Test/3.gif");//復制文件
FileInputStream fis = new FileInputStream(ifile);
FileOutputStream fos = new FileOutputStream(wfile);
//使用緩存,復制文件效率更高
// BufferedInputStream bis=new BufferedInputStream(fis);
// BufferedOutputStream bos=new BufferedOutputStream(fos);
//添加上緩存大小,應該比byte數(shù)組in[]大一些,但也不需要過大,具體適合大小,根據(jù)測試消耗時長定
BufferedInputStream bis = new BufferedInputStream(fis, 1000);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1000);
long before = System.currentTimeMillis();
//大型文件數(shù)組大小可以大一些,小文件對應數(shù)組小一些
byte in[] = new byte[100];
//通過循環(huán),不使用緩存,邊讀邊寫
// while ((fis.read(in)) > 0) {
// fos.write(in);
// }
while ((bis.read(in)) != -1) {
bos.write(in);
}
bos.close();
bis.close();
fos.close();
fis.close();
Log.i("CopyTime", System.currentTimeMillis() - before + "ms");
if (wfile.length() > 0) { //文件大小不為空
Toast.makeText(getApplicationContext(), "文件復制成功", Toast.LENGTH_SHORT).show();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
//字符流讀寫文件
bt4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File ifile = new File("/mnt/sdcard/copy.txt");//目標文件
File wfile = new File("/mnt/sdcard/Test/copy1.txt");//復制文件
FileInputStream fis = new FileInputStream(ifile);
FileOutputStream fos = new FileOutputStream(wfile);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
char input[] = new char[100];
int l = 0;//主要用來記錄最后一次數(shù)組長短,寫入文件;若不記錄,char數(shù)組最后一次讀取可能不足,將給文件寫入多余或錯誤數(shù)據(jù)
while ((l = isr.read(input)) != -1) {
//String inputString = new String(input,0,l);
osw.write(input, 0, l);
}
isr.close();
fis.close();
osw.close();
fos.close();
if (wfile.length() > 0) { //文件大小不為空
Toast.makeText(getApplicationContext(), "文件復制成功", Toast.LENGTH_SHORT).show();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
//FileReader、FileWriter直接讀寫文件,包裝緩沖流進行拷貝
bt5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File ifile = new File("/mnt/sdcard/copy.txt");//目標文件
File wfile = new File("/mnt/sdcard/Test/copy2.txt");//復制文件
FileReader fr = new FileReader(ifile);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(wfile);
BufferedWriter bw = new BufferedWriter(fw);
String line;
while ((line = br.readLine()) != null) {
bw.write(line + "\n");
}
bw.flush();//強制將緩沖流輸出
bw.close();
fw.close();
br.close();
fr.close();
if (wfile.length() > 0) { //文件大小不為空
Toast.makeText(getApplicationContext(), "文件復制成功", Toast.LENGTH_SHORT).show();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
//RandomAccessFile隨機讀取,適用多線程下載等操作
bt6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File file = new File("/mnt/sdcard/RandomAccessFile隨機讀取.txt");//目標文件
//打亂線程順序不影響文件塊寫入
new WriteFile(file, 5).start();
new WriteFile(file, 3).start();
new WriteFile(file, 1).start();
new WriteFile(file, 4).start();
new WriteFile(file, 2).start();
// RandomAccessFile raf = new RandomAccessFile(file, "r");//以只讀方式打開文件
// raf.seek(300);
// byte[] str = new byte[20];
// raf.read(str);
// String in = new String(str);
// Log.i("RandomAccessFile隨機讀取",in);
Toast.makeText(getApplicationContext(), "文件寫入成功", Toast.LENGTH_SHORT).show();
}
});
//通過調(diào)用Apache IO的jar包,快捷實現(xiàn)文件的操作
bt7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File file1 = new File("/mnt/sdcard/copy.txt");//目標文件
File file2 = new File("/mnt/sdcard/Apache IO Copy.txt");//目標文件
// String input = FileUtils.readFileToString(file1, "UTF-8");//讀取文件內(nèi)容
FileUtils.copyFile(file1, file2);
Toast.makeText(getApplicationContext(), "文件復制成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
WriteFile.java
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class WriteFile extends Thread {
File file;
int block;//塊
int L = 5;//塊大小
/**
* File 數(shù)據(jù)插入文件
* |*** |+++
* |-----------***---------+++--------------------------|
* |---
*/
/**
* 文件塊示意圖
* 1 2 3 4 5
* |------------|------------|------------|------------|------------|
* 0xL 1xL
*
* @param f
* @param b
*/
public WriteFile(File f, int b) {
this.file = f;
this.block = b;
}
@Override
public void run() {
try {
RandomAccessFile raf = new RandomAccessFile(file, "rw");//rw代表可讀可寫,參數(shù)還有r、rws、rwd
raf.seek((block - 1) * L);//定位指針
raf.writeBytes("abcde" + block);
/**
* 注:如果寫入數(shù)據(jù)小于塊大小,未填滿數(shù)據(jù)塊,多余字節(jié)位置大小依然存在(雖然不一定可見)
* 若數(shù)據(jù)大于塊大小,將占用后面塊的位置,后寫入的塊數(shù)據(jù)從塊指定位置開始,又會重疊在后方塊之上
*/
// for (int i = 0; i < 20; i++) {
// raf.writeBytes("-");
// }
raf.writeBytes("\n");//會占用一個字節(jié)的位置大小
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
activity.xml
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.filetestapplacation.MainActivity">
<EditText
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="請輸入文本信息"/>
<Button
android:id="@+id/save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存文本"/>
<Button
android:id="@+id/write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="輸出文本"/>
<EditText
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="輸出文本信息"/>
<Button
android:id="@+id/copy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Copy by 緩沖字節(jié)流" />
<Button
android:id="@+id/copy1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Copy by 字符流" />
<Button
android:id="@+id/copy2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Copy by File字符流" />
<Button
android:id="@+id/copy3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="RandomAccessFile隨機讀取" />
<Button
android:id="@+id/copy4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Apache IO Copy" />
</LinearLayout>
注:需導入Apache IO包
前兩個按鈕效果圖(未完整版):
incomplete photo.gif