ASP.Net+Android+IOS开发------期待与您交流
<File类和IO流的使用方法及总结>
I:就是input(输入),O:就是output(输出),所谓IO流就是输入输出流。
IO流:JAVA中的IO流就是为了实现文件和数据的输入输出。
要想使用IO流就得精通JAVA的文件类File类里面的方法。
File类的常用方法及使用规则:
1. 为什么要使用File对象
|-- File对象将,磁盘,路径,文件夹,文件,全部包装成对象
|-- 指挥File对象做事,IO流中,删除文件,创建文件夹等等这些操作不能完成,需要File来完成
|-- File对象,提供我们很多的属性和方法,来操作具体的路径,文件,或者是文件夹
|-- 字符流,字节流这些类的构造方法,全部接收File对象
2. File对象的构造方法和静态常量
|-- File(File parent, String child)
|-- File(String pathname)
|-- File(String parent, String child)
|-- static String separator 静态常量,目录分隔符,根据系统不同而不同 / \
|-- static String pathSeparator 静态常量,路径分隔符,多个路径之间分号分开 根据系统不同而不同; :
3. File对象的获取功能(后的list)
|-- File[] static listRoots() 获取磁盘下的跟目录
|-- String getName() 获取File对象中封装的文件夹名,或者文件名
|-- String getParent() 获取File对象封装的目录的父目录,没有父目录,返回null
|-- File getParentFile() 获取File对象封装的目录的父目录,没有父目录,返回null
|-- File getAbsoluteFile() 获取File对象中封装的路径的绝对路径
4. File对象的创建功能
|-- boolean createNewFile()创建File对象中封装的文件,有了就不创建,创建成功返回true
|-- boolean mkdir()创建File对象中封装的文件夹,有了就不创建,创建成功返回true
|-- boolean mkdirs()创建File对象中封装的多级文件夹,有了就不创建,创建成功返回true
5. File对象的删除功能
|-- boolean delete(),不走回收站,直接删除,删除File对象中封装的文件或者文件夹
|-- void deleteOnExit(),虚拟机终止前,删除File对象中封装的文件或者文件夹
6. File对象的判断功能
|-- boolean exists() 判断File对象封装的路径或者文件是否存在
|-- boolean isAbsolute() 判断File对象封装的路径,是绝对路径就返回true
|-- boolean isDirectory() 判断File对象封装的路径,是否是文件夹,是就返回true
|-- boolean isFile() 判断File对象封装的路径,是否是文件,是就返回true
|-- boolean isHidden()判断File对象封装的路径,是否是隐藏属性,是就返回true
7. File对象的其他功能
|-- long lastModified()返回File对象封装文件的最后修改时间的毫秒值
|-- boolean renameTo()修改文件名,如果修改后不在同一路径,出现剪切的效果
8. File对象中获取文件列表的功能
|-- String[] list() 获取File对象封装的路径下的全部文件和文件夹。包括隐藏的,返回是字符串
** |-- File [] listFiles()获取File对象封装的路径下的全部文件和文件夹。包括隐藏的,返回File对象数据
** |-- File[] listFiles(FileFilter filter)过滤文件名的
|-- 实现文件的过滤步骤:
定义类,实现FileFilter接口,覆盖accept(File pathName)方法
将pathName转成字符串,用endsWith("")判断,返回真,这个文件获取,如果返回假,这个文件不要
9. 递归
|-- 方法的调用一种编程技巧
|-- 从前有个山
|-- 方法的自身调用,自己调用自己
|-- 递归一定要有条件
|-- 递归的次数不要过大,否则出现栈内存溢出
|-- 递归的内存图,必须要会画
下面是递归的内存图,使用递归方法计算任意数的二进制表现形式:
10. 递归删除文件夹 ***** File对象和方法的递归调用组合使用的案例 String
11. 复制单级目录 ***** File对象和IO流的结合使用,后期还会结合图形界面,网络编程 String
下面是关于递归的几种使用方法和技巧
package cn.itcast.file;
/*
* 递归的算法案例
* 计算的方法是一致的,但是计算的参数确每次在变化,可以使用递归
*/
public class DiGui {
public static void main(String[] args) {
//toBinary(6);
//System.out.println(getSum(6));
//System.out.println(getJieCheng(12));
System.out.println(tuzi(20));
}
/* 兔子问题。斐波那契数列
* 有一个兔子,第一个月不生,第二个月不生,以后每一月生一个
* 生出来的一个小兔子,第一个不生,第二个月不生,以后每一个月生一个
* 问 12个月,一共多少兔子
*
* 1 1 2 3 5 8 13 21 34 55 89 144
* 从第3项开始,后面一项是前2项的和
* 第n项目 = (n-1)+(n-2)
*/
private static int tuzi(int month){
if(month == 1)
return 1;
if(month == 2)
return 1;
return tuzi(month-1) + tuzi(month-2);
}
//阶乘 1 * 2 * 3 * 4 * 5 * 6 = 720
public static int getJieCheng(int num){
if(num == 1)
return 1;
return num * getJieCheng(num - 1 );
}
//高斯算法 1+2+3+4+5+...+98+99+100 = 5050
public static int getSum(int num){
if(num == 1)
return 1;
return num + getSum(num - 1);
/*int sum = 0 ;
for(int x =0 ; x <= num ; x++){
sum = sum + x;
}
return sum;*/
}
//计算一个数的二进制
private static void toBinary(int num){
if(num > 0){
toBinary(num/2);
System.out.println(num % 2);
}
/*//每次除以2 ,取余数
while(num > 0 ){
System.out.println(num % 2);
num = num / 2 ;
}*/
}
}
下面介绍IO流:
其实我们第一天学习JAVA就用到了IO流,所以大家学习这篇的时候会感觉很亲切
1. 打印流
|-- System.out.println()
|-- 特点:
|-- 此流不会抛出异常
|-- 此流操作数据目的,不操作数据源
|-- Java Web中,常用打印流,不需要创建
2. 对象的序列化与反序列化(持久化)
|-- 将对象中常用的数据,写入到磁盘,进行永久性保存,对象的序列化
|-- 将磁盘中存储对象的数据,读取出来,在程序中使用,对象的反序列化
|-- ObjectInputStream 读取对象
|-- ObjectOutputStream 写出对象
|-- 构造方法中,包装一个字节输出流对象
|-- 使用写出对象的writeObject方法,将对象写出去
|-- 静态不属于对象,所以在对象的序列化中,没有静态参与的
3. Serializable接口
|-- 这是一个没有抽象方法的接口
|-- 日后见到这样的接口,叫做标记型接口
|-- 实现它的类,相当于打了一个标记
4. 对象的序列化出现的序列化冲突
|-- 序列对象的时候,JVM会给我们的Person.class文件中写一个序列号 long型的整数
此时我们将对象进行了序列化
|-- 修改了Person的源文件,编译class文件,这个时候,序列号已经被改变了 ,并没有重新写对象
继续读取就会造成,序列号冲突问题
|-- 当我们对象已有的源文件,进行了改变以后,并不影响其序列化的功能的时候,没有必要从新对对象
进行序列化(从新写一个对象文件),
需要,对Person这个类,进行手动编写序列号,如果手动的了写序列号,JVM不会在给我们生生序列号
5. 管道流
|-- PipedOutputStream
|-- PipedInputStream
6. Properties对象
|-- 双列集合,键,值的数据类型已经固定为String
|-- 集合中的数据可以通过IO写入到文件,还可以通过IO读取文件中的数据,存入到集合
|-- setProperty(键,值);
|-- getProperty(String key) 返回的是与键对应的值,没有这个键,返回null
|-- void load(字符读取流)IO读取文件,集合就关联到了一起
|-- void store(字符输出流, String comments) 将集合中的输入,写回到文件中
下面是对IO的综合使用:
package cn.itcast.appcount;
/*
* 实现了统计程序运行次数的功能
*/
import java.io.*;
import java.util.*;
public class AppCount {
//返回真,程序可以运行,返回假,程序停止运行,提示用户交钱
public boolean apprun(){
//File对象包装一个配置文件
try{
File file = new File("c:\\demo.txt");
//判断这个文件是否存在
if(!file.exists()){
//不存在,需要创建,写上运行了一次
file.createNewFile();
Properties pro = new Properties();
//向集合存键值对象,键count 值 1
pro.setProperty("count", "1");
FileWriter fw = new FileWriter(file);
pro.store(fw, "");
return true;
}
//以上是首次运行时,执行的代码
else{
Properties pro = new Properties();
FileReader fr = new FileReader(file);
//将集合和IO关联
pro.load(fr);
String value = pro.getProperty("count");
Integer i = Integer.parseInt(value);
int x = i.intValue();
if(x >=3){
return false;
}else{
//x++后的值,写回到配置文件中
x++;
pro.setProperty("count", x+"");
//通过IO流,集合中保存的数据,写到文件中
FileWriter fw = new FileWriter(file);
pro.store(fw, "");
return true;
}
}
}catch(IOException e){}
return false;
}
}
ASP.Net+Android+IOS开发------期待与您交流
详细请查看:http://edu.csdn.net