---------------------- android培训、java培训、期待与您交流! ----------------------
一,File类
File类:
代表一个文件或文件夹的路径;File类是IO包中唯一代表磁盘文件本身的对象,目录也被当做File使用,
2,绝对路径和相对路径:
绝对路径:从盘符开始的,完整的路径,不论在什么环境下运行,都是找指定的路径;
相对路径:不从盘符开始,相对于一个其他路径,Eclipse中相对于工程文件夹,cmd中相对于提示符目录,运行环境不同,相对的路径也就不同;
3,File构造函数
File(String pathname)
通过指定路径创建一个File对象;
例:File f1 = new File("file.txt");
File(String parent,String child)
通过指定父级路径和自己路径创建一个File对象;
Stringparent = "F:/Itcast/WorkSpace/day21";
Filef1 = new File(parent,"pathDemo.java");
File(File parent,String child)
和上面方法类似,但父级路径是一个File对象;
File parent= "F:/Itcast/WorkSpace/day21";
Filef1 = new File(parent,"pathDemo.java");
4,常用方法:
Sting getName()---->>获取文件名;
String getParent() ---->>获取父级路径名
Long length() -------->>获取文件大小
Long lastModified----->>获取最后修改时间
Boolean exists ------->>判断是否存在
Boolean isFile -------->>判断是否是文件
Boolean isDirectory---->>判断是否是文件夹
Boolean renameTo(File dest)---->>改名
Boolean creatNewFile() ----->>创建新文件
Boolean mkdir() --------->>创建文件夹(不包含父级)
Boolean mkdirs() ------->>创建文件夹(包含父级)
Boolean delete() --------->>删除
String[] list()---------------->>获取文件夹下所有子文件名(String)
File[] listFiles() ----------->> 获取文件夹下的所有子文件(File对象);
例:
package File;
importjava.io.File;
publicclass MethodDemo {
/**File类常用方法;
* @param args
* @throws IOException
*/
publicstaticvoid main(String[] args) throws IOException {
// TODOAuto-generated method stub
//demo1();
// demo2();
// mkdir();
// delete();
// space();
// get();
//demo3();
// length();
//renameTo();
}
publicstaticvoid renameTo() {
File f = new File("a.txt");
System.out.println(f.renameTo(new File("file.txt"))); //改名;如改到其他文件夹,类似于剪切;
File f1 = new File("file.txt");
System.out.println(f1.renameTo(new File("e:/file.txt")));
}
publicstaticvoid length() {
File f = new File("FileDemo.java");
System.out.println(f.length());
File f1 = new File("a");
System.out.println(f1.length());// 文件夹没有大小, Windows系统上看到的文件夹大小其实就是累计子文件大小的和
}
publicstaticvoid demo3() {
File f = new File("E:/STUDY/day0914/a.txt");
System.out.println(new Date(f.lastModified())); //最后修改时间;
}
publicstaticvoid get() {
File f = new File("E:/STUDY/day0914/a.txt");
System.out.println(f.getName()); //获取文件名;
System.out.println(f.getParent()); //获取父级路径名;
}
publicstaticvoid space() {
File f = new File("a.txt");
System.out.println("磁盘总空间"+f.getTotalSpace());
System.out.println("磁盘剩余空间="+f.getFreeSpace());
}
publicstaticvoid delete() {
File f1 = new File("file.txt");
System.out.println(f1.delete()); //删除文件,成功返回true;
File f2 = new File("test");
System.out.println(f2.delete());
File f3 = new File("a/b/"); //删除文件夹时,里面有文件或者文件夹,都是不能删除的;
System.out.println(f3.delete());
}
publicstaticvoid mkdir() {
File f = new File("test");
System.out.println(f.mkdir()); //创建新文件夹,成功返回true;
File f1 = new File("a/b/c");
System.out.println(f.mkdir()); //父级路径不存在,不能创建多个文件夹
System.out.println(f1.mkdirs()); //父级路径不存在,就一起创建文件夹;
}
publicstaticvoid demo2() throws IOException {
File f =new File("a.txt");
System.out.println(f.createNewFile()); //创建新文件,成功返回true,已有,返回false;
}
publicstaticvoid demo1() {
File f1 = new File("file.txt");
//设置文件是否可读,可写,可执行;
f1.setReadable(true);
f1.setWritable(true);
f1.setExecutable(true);
//查看文件是否可读,可写,可执行;
System.out.println(f1.canRead());
System.out.println(f1.canWrite());
System.out.println(f1.canExecute());
}
}
二,递归:
函数自己调用自己就是递归,有些时候在程序中的工作需要反复调用,可以使用递归解决,通常递归调用函数都会有一个退出条件;
例:
publicclass RecursionDemo {
/**递归:
* @param args
*/
publicstaticvoid main(String[] args) {
//打印和;
System.out.println(count (5));
System.out.println(count(7));
}
publicstaticint count(int i) {
return i == 1? 1: count2(i -1)+i;
}
}
删除原理
在window中,删除目录从里面往外删除的
既然是从里往外删除,就需要要到递归
public static void removeDemo(File dir)
{
File[] files =dir.listFiles();
for (int x=0;x<files.length ;x++ )
{
if (files[x].isDirectory())//遍历时,判断是否为隐藏文件
files[x].isHidden()&&file[x].isDirectory,
//但删除时,不用,
{
removeDemo(files[x]);
}
Else
System.out.println(files[x].toString()+":file:"+files[x].delete());
}
System.out.println(dir+"dir"+dir.delete());
}
* 一.打印流
1.什么是打印流
PrintStream是一个打印流, 在程序中输出数据的时候经常使用这个流, 它既可以输出字节, 也可以输出字符.
通常使用PrintStream都是输出指定对象toString()方法的返回值
2.怎么使用
创建PrintStream可以指定一个文件写出, 也可以指定一个字节输出流, 可以指定码表和自动flush()
print()和println()方法都可以将指定对象的toString()返回值写出
println()在写出之后加上换行符号
二.标准输入输出流
1.什么是标准输入输出流
System.in是一个InputStream, 它是标准输入流, 默认可以从键盘输入读取字节.
System.out是一个PrintStream, 它是标准输出流, 默认可以向屏幕输出数据.
2.改变标准输入输出流
使用System.setIn(InputStream)可以将标准输入流指向其他数据源
使用System.setOut(PrintStream)可以将标准输出流指向其他的数据目的地
* 三.字节数组输出流
1.什么是字节数组输出流
ByteArrayOutputStream是一个可以向内存中写出字节的一个输出流, 通常可以作为一个缓冲区使用
2.怎么使用
创建对象之后, 可以向ByteArrayOutputStream写入字节数据, 这些数据都会在内存中存储.
可以调用toByteArray()方法将写入的数据一次性获取出来
如果想清空数据, 可以调用reset()方法
获取长度可以调用size()方法
3.应用场景
读取一个文件中的文本数据, 转为字符串.
如果使用普通的字符输入流读取, 那么会每读一两个字节转为一个字符, 这样效率较低.
可以使用FileInputStream将文件数据读取, 写入到ByteArrayOutputStream中, 将文件中所有内容都写入.
然后使用ByteArrayOutputStream的toByteArray()方法一次性获取数据转为字符.
四.数据输入输出流
1.什么是数据输入输出流
DataInputStream, DataOutputStream, 可以按照基本数据类型大小读写数据
2.怎么使用
使用DataOutputStream可以按照基本数据类型大小写出, 例如: writeInt()方法可以写出一个int值, 占4个字节. writeLong()可以写出long值, 占8个字节
使用DataInputStream可以读取DataOutputStream写出的数据, 例如: readInt()可以读取4个字节, readLong()可以读取8个字节
五.对象输入输出流
1.什么是对象输入输出流
ObjectInputStream, ObjectOutputStream, 可以读写对象
2.怎么使用
使用ObjectOutputStream.writeObject()方法可以写出一个实现了Serializable接口的对象
使用ObjectInputStream.readObject()方法可以读取ObjectOutputStream写出的对象
3.读写多个对象
如果需要写出多个对象, 通常会将多个对象存入集合, 然后将集合写出
读取的时候读到集合, 遍历集合即可
六.序列流(合并流)
1.什么是序列流
SequenceInputStream可以用来把多个输入流合并成一个
2.怎么使用
使用构造函数可以接收2个InputStream, 或者一个包含多个InputStream的Enumeration
创建SequenceInputStream之后, 读取的时候内部会从第一个流逐个读取, 直到所有的流都读完才读到末尾
分割流:
练习:使用分割流分割文件 ,再使用合并流合并;
packageSplitFile;
importjava.io.FileInputStream;
publicclass SplitFileDemo {
publicstaticvoid main(String[] args) throws IOException {
// splitFile(); //分割文件;
sequenceFile(); // 合并文件;
}
publicstaticvoid sequenceFile() throws FileNotFoundException, IOException {
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>(); // 创建集合,用来存储文件片段;
for (int x = 1; x <= 6; x++) { // 遍历文件片段,将片段装入集合中;
al.add(new FileInputStream("e:/" + x + ".part"));
}
Enumeration<FileInputStream>en = Collections.enumeration(al); // 使用Collections工具类中的enumeration获取al集合的Enumeration
//使用合并流读取, 字节数组输出流写出;
SequenceInputStream sis = new SequenceInputStream(en); // 合并流,将获取到的en装入;
FileOutputStream fos = new FileOutputStream("e:/周传雄-暖风.ape");//写出到指定文件;
byte[] buffer = newbyte[1024];
int len;
while ((len = sis.read(buffer)) != -1)
fos.write(buffer, 0, len);
fos.close(); //关流;
sis.close();
}
publicstaticvoid splitFile() throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream("周传雄-暖风.ape"); //读取文件,文件大小为25.4MB;
FileOutputStream fos = null; //
byte[] buffer = newbyte[1024 * 1024 * 5]; //创建数组大小,用来存储读到的数据;数组越大,读取越快,越占内存;
int len;
int count = 1; //给分割的文件定义编号;
while ((len = fis.read(buffer)) != -1) {
//每读取一次,写出到一个新的文件中,
fos = new FileOutputStream("e:/" + (count++) + ".part");
fos.write(buffer, 0, len);
fos.close();
}
fis.close();
//可以省略,在循环中已关流,
if (fos != null)
fos.close();
}
}
编码:字符串变成字节数组。
解码:字节数组变成字符串。
String-->byte[]; str.getBytes(charsetName);
byte[] -->String:new String(byte[],charsetName);
七.IO总结
1.字节流拷贝文件
FileInputStream和FileOutputStream, 自定义数组
BufferedInputStream和BufferedOutputStream, 内置缓冲区
2.字符流读写文本文件
InputStreamReader, FileReader,BufferedReader读取字符数据
OutputStreamWriter, FileWriter, BufferedWriter写出字符数据
3.File类
拷贝文件夹