File类和IO流的学习方法及总结-----黑马程序员

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值