权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
package tech.androidstudio.filereadandwritetwentyexamples;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
//实例1:复制一张图片,一个字节一个字节的读取
example1CopyImage();
//实例2,通过字节数组来拷贝图片,效率高很多
example2CopyImage();
//实例3 使用字节流的缓冲区复制一张图片
example3CopyImage();
//实例4 ----得到某个目录下的所有目录和文件--分别以字符串和文件的形式存储到数组中,例如获取外部存储的 公共目录 的内容
example4ListDirAndFiles();
//实例5 ----过滤文件名的过滤器,过滤文件或文件夹
example5FileFilter();
//实例6 使用递归列出指定目录下的所有内容,包括子目录中的内容
//递归,有一个条件就是必须要有退出的条件。
example6ListFiles();
//实例7 得到指定目录下的所有的目录包括子目录下的,存到集合中,然后存到cache/record.text 文件中
example7ListDirectorys();
//实例8 打印流,字节输出流
example8PrintStream();
//实例9,字符输出流
example9PrintWriter();
} catch (IOException e) {
e.printStackTrace();
}
}
//实例1:复制一张图片,一个字节一个字节的读取
public void example1CopyImage() throws IOException {
InputStream inputStream = getResources().openRawResource(R.raw.a);
FileOutputStream fos = new FileOutputStream(getCacheDir().getPath()+"/1.bmp");
int num;
while((num=inputStream.read())!=-1){
fos.write(num);
}
//关闭流
inputStream.close();
fos.close();
}
//实例2,通过字节数组来拷贝图片,效率高很多
public void example2CopyImage() throws IOException {
InputStream inputStream = getResources().openRawResource(R.raw.a);
FileOutputStream fos = new FileOutputStream(getCacheDir().getPath()+"/2.bmp");
//创建一个1024个字节的 字节数组
byte[] arr = new byte[1024];
int len=0;
while((len=inputStream.read(arr))!=-1){
fos.write(arr,0,len);
}
fos.close();
inputStream.close();
}
//实例3 使用字节流的缓冲区复制一张图片
public void example3CopyImage() throws IOException{
BufferedInputStream bis =
new BufferedInputStream(getResources().openRawResource(R.raw.a));
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream(getCacheDir().getPath()+"/3.bmp"));
byte[] arr = new byte[1024];
int len=0;
while ((len=bis.read(arr))!=-1){
bos.write(arr,0,len);
}
bis.close();
bos.close();
}
//实例4 ----得到某个目录下的所有目录和文件--分别以字符串和文件的形式存储到数组中,例如获取外部存储的 公共目录 的内容
//需要权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//需要权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
public void example4ListDirAndFiles(){
File directory = Environment.getExternalStorageDirectory();
//得到某个目录下的所有目录和文件--以字符串的形式存储到数组中
Log.d("kodulf","实例4 得到某个目录下的所有目录和文件--以字符串的形式存储到数组中");
String[] list = directory.list();
for(String filename:list){
Log.d("kodulf","文件名 "+filename);
}
//得到某个目录下的所有目录和文件--以File形式存储到数组中
Log.d("kodulf","实例4 得到某个目录下的所有目录和文件----以File形式存储到数组中");
File[] files = directory.listFiles();
for (File file:files){
if(file.isDirectory()){
Log.d("kodulf","目录 "+file.getName());
}else{
Log.d("kodulf","文件名 "+file.getName());
}
}
}
//实例5 ----过滤文件名的过滤器,过滤文件或文件夹
public void example5FileFilter() throws IOException{
File cacheDir = getCacheDir();
FilterByName filterByName = new FilterByName();
File[] files = cacheDir.listFiles(filterByName);
for (File file :files){
Log.d("kodulf","实例5 cacheDir里面的以bmp结尾的文件 "+file.getName());
}
FilterByFile filterByFile = new FilterByFile();
File[] files1 = cacheDir.listFiles(filterByFile);
for (File file :files1){
Log.d("kodulf","实例5 cacheDir里面的文件 "+file.getName());
}
}
//值接收以 bmp结尾的
class FilterByName implements FileFilter {
@Override
public boolean accept(File pathname) {
String name = pathname.getName();
if(name.endsWith("bmp")){
return true;
}
return false;
}
}
//只接收文件的,不接受文件夹的。
class FilterByFile implements FileFilter{
@Override
public boolean accept(File pathname) {
if(pathname.isFile()){
return true;
}
return false;
}
}
//实例6 使用递归列出指定目录下的所有内容,包括子目录中的内容
//递归,有一个条件就是必须要有退出的条件。
public void example6ListFiles() throws IOException{
Log.d("kodulf","实例6++++++++开始+++++++++++++");
File directory = Environment.getExternalStorageDirectory();
listFils(directory);
Log.d("kodulf","实例6+++++++结束++++++++++++++");
}
public void listFils(File sourceFile){
File[] files = sourceFile.listFiles();
if(files!=null){
for (File file:files){
if (file.isDirectory()){
Log.d("kodulf", "目录名 " + file.getName());
listFils(file);
}else{
Log.d("kodulf","文件名 "+file.getName());
}
}
}
}
//实例7 得到指定目录下的所有的目录包括子目录下的,存到集合中,然后存到cache/record.text 文件中
//1:得到指定目录下的所有的Java文件包括子目录下的,存到集合中
//2:遍历集合,把集合中每个File对象写入到文件中
public void example7ListDirectorys() throws IOException{
Log.d("kodulf", "实例7++++++++开始+++++++++++++");
List<File> directorys = new ArrayList<File>();
File externalStorageDirectory = Environment.getExternalStorageDirectory();
listDirectorys(externalStorageDirectory, directorys);
File recordFile = new File(getCacheDir(),"record.text");
BufferedWriter bw = new BufferedWriter(new FileWriter(recordFile));
for (File file:directorys){
bw.write(file.getName());
bw.newLine();
bw.flush();
}
bw.close();
Log.d("kodulf", "实例7++++++++结束+++++++++++++");
}
public void listDirectorys(File sourceFile,List<File> directorys){
directorys.add(sourceFile);
File[] files = sourceFile.listFiles();
if(files!=null){
for (File file :files){
if(file.isDirectory()){
listDirectorys(file, directorys);
Log.d("kodulf","add file"+file.getName());
}
}
}
}
//实例8 打印流,字节输出流
public void example8PrintStream() throws IOException{
Log.d("kodulf", "实例8++++++++开始+++++++++++++");
/*打印流:
PrintStream:字节输出流,字节输出流的基本功能都具备了,又增加了打印功能
可以操作的目的:
File类型的文件
字符串类型的文件
字节输出流
*/
PrintStream ps = new PrintStream(getCacheDir().getPath()+"/print.txt");
//ps.write(97);// 00000000 00000000 00000000 01100001---->自动砍掉了前三个字节--->01100001
//ps.write(353);// 00000000 00000000 00000001 01100001---->自动砍掉了前三个字节--->01100001
//System.out.println(353);
//ps.println(353);//按照数据原样儿写入到目的,也就是数据的表现形式,内部用了 String.valueOf()
ps.write(String.valueOf(353).getBytes());
ps.close();
Log.d("kodulf", "实例8++++++++结束+++++++++++++");
}
//实例9,字符输出流
public void example9PrintWriter() throws IOException{
Log.d("kodulf", "实例9++++++++开始+++++++++++++");
/*
PrintWriter:字符输出流,字符输出流的基本功能都具备了,增加了打印功能
可以操作的目的:
File类型的文件
字符串类型的文件
字节输出流
字符数出流
*/
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(getCacheDir().getPath()+"/print.txt")));
//PrintWriter pw = new PrintWriter(System.out,true);//自动刷新
PrintWriter pw = new PrintWriter(new FileWriter("qq.txt"),true);//自动刷新
String line = null;
while((line = br.readLine())!=null)
{
if("over".equals(line))
break;
pw.println(line);
//pw.write(line);
//pw.write("\r\n");
//pw.flush();
}
br.close();
pw.close();
Log.d("kodulf", "实例9++++++++结束+++++++++++++");
}
}