1.File
Flie类是java.io 包下代表与平台无关的文件和目录,也就是说,如果需要在程序中操作文件和目录,都可以通过File完成
1.1File相关方法
String getName() 返回此File对象的文件名或者路径名(如果是路径名,则返回最后一级路径名)
String getPath() 返回此File对象对应的路径名
File getAbsoluteFile() 返回File对象的绝对路径
String getAbsolutePath() 返回File对象对应的绝对路径名
String getParent() 返回File对象所对应目录的父目录名
Boolean renameTo(File newName) 对File重命名,成功返回true,失败返回false
boolean exists() 判断File对象对应的文件或者目录是否存在
boolean canWrite() 判断file对象什么能写
boolean canRead() 判断file对象是否能读
boolean isFile() 判断File是否是文件而不是目录
boolean isDirectory() 判断File对应的是否是目录,而不是文件
boolean isAbsolute() 判断File对应的文件或目录是否是绝对路径
long lastModified() 返回文件最后修改时间
long lenght() 返回文件内容长度
boolean createNewFile() 如果File对应的文件不存在时,则去创建一个新的文件
boolean delete() 删除File对象
boolean mkdir() 创建一个File对应的目录
String[] list() 列出File对象所有的子文件名和路径名
Flie[] listFiles() 列出File对象的所有子文件和路径
static File[] listRoots() 列出系统所有的根路径.
1.2 FilenameFilter 文件过滤器
在File类中的list()方法中可以接收一个FilenameFilter参数,通过参数可以列出符合条件的文件.
返回当前路径下所有的.java文件和文件夹
String[] list = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java") || new File(name).isDirectory();
}
});
2 IO流
2.1 流的分类
字节流和字符流的区别只是单位不同
输入流:只能从中读取数据,不能向其写入数据 InputStream/Reader :所有输入流的基类,前者为字节输入流,后者为字符输入流
输出流:只能向其写入数据,不能从中读取数据 OutputStream/Writer :所有输出流的基类,前者为字节输出流,后者为字符输出流
2.2 输入流
InputStream 和 Reader:他俩是所有输入流的抽象基类,本身并不能用来创建实例来输入.但是他们的方法所有的输入流都能用
InputStream
int read() 从输入流中读取单个字节,返回所读取的字节数据
int read(byte[] b):从输入流中读取最多b.lenght个字节的数据,
并将其存储在字节数组b中,返回实际的读取字节数
int read(byte[] b,int off,int len) 从输入流中最多读取len个字节是数据,
存在b中,并不是从起点开始,从off位置开始[b的off位置]
Reader
int read() 从输入流中读取单个字符,返回所读取的字节数据
int read(char[] b):从输入流中读取最多b.lenght个字符的数据,
并将其存储在字符数组b中,返回实际的读取字符数
int read(char[] b,int off,int len) 从输入流中最多读取len个字符是数据,
存在b中,并不是从起点开始,从off位置开始[b的off位置]
由于InputStream只是抽象类,不能创造实例,但是有一个用户读取文件的输入流,FlieInputStream,
try {
//获取storage/emulatd/0/Android/包名/flies/java.txt 文件
File file = new File(getExternalFilesDir(null), "java.txt");
FileInputStream fileInputStreanm = new FileInputStream(file);
//获取文件大小设置容器大小就刚刚好
byte[] bytes = new byte[(int) file.length()];
int hasRead = 0;
while ((hasRead=fileInputStreanm.read(bytes))>0){
Log.d("==========",new String(bytes, 0, hasRead));
}
fileInputStreanm.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
FileReader同理.
大概的流程图就是这样的,FlieInputStream循环的从数据源中读取数据到指定的byte[]中
2.3 输出流
OutputStream和Writer也非常相似
OutputStream
void write(int c) 将指定的字节/字符输出到输出流中
void write(byte[]/char[] c):将指定的字节/字符数组输出到输出流中
并将其存储在字节数组b中,返回实际的读取字节数
void write(byte[]/char[] b,int off,int len)
将字节数组/字符数组从off位置开始,长度为len的字节/字符输出到输出流中
Reader
void write(String c):将指定的字符串输出到输出流中
并将其存储在字节数组b中,返回实际的读取字节数
void write(String b,int off,int len)
将字符串从off位置开始,长度为len的字节/字符输出到输出流中
Reader
在上面FileInputStream的基础上实现一下FileOutStream
try {
File file = new File(getExternalFilesDir(null), "java.txt");
new FileOutputStream(xxx,boolean)第二个参数如果是true,内容是追加类型的,false是覆盖类型默认false
FileOutputStream fileOutputStream = new FileOutputStream(new File(getExternalFilesDir(null), "javas.txt"));
FileInputStream fileInputStreanm = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
int hasRead = 0;
while ((hasRead=fileInputStreanm.read(bytes))>0){
fileOutputStream.write(bytes,0,hasRead);
}
fileInputStreanm.close();
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}