黑马程序员——Java基础---IO流(二)

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



IO流(二)
一、File文件对象概述

        在IO流中,它操作的只有数据,而在计算机中数据最终都存在于文件当中,所以对文件的描述也是IO流中一个很重要的部分。

        Flie类就是这样一个描述文件的类,它可以将文件或者文件夹封装成对象,方便对文件和文件夹属性和信息的操作。File类对象可以作为一个文件传入大部分的字节流或者字符流对象构造函数中。

二、File文件对象的基本操作

        在File文件对象中基本操作主要有:创建文件或者文件夹;删除文件或者文件夹;判断;获取这四种方法。具体方法请看如下代码。

        注意,在创建文件对象时,在构造函数中可以传入文件路径、文件名、文件路径加文件名、文件路径构成的File对象加文件名等多种形式,而且传入的可以是存在的也可以是不存在的文件名或者文件路径。

package com.itheima;
import java.io.*;
public class FileDemo 
{
	public static void main(String[] args) throws IOException
	{
		File file=new File("D:\\学习\\文件例子1");//这是一个以路径为实例化的对象
		File file1=new File("D:\\学习\\文件例子2");
		File file2=new File("D:\\学习\\文件例子2\\例子.txt");//这是一个以文件名为实例化的对象
		File file3=new File(file1,"我的例子.txt");//这是一个文件对象家文件名实例化对象
		//创建文件和文件夹
		file.mkdir();//创建文件夹
		file1.mkdir();
		file2.createNewFile();//创建文件,会爆异常,若创建失败
		file3.createNewFile();
		//删除文件或者文件夹,若删除实盘则返回false
		file1.delete();//删除文件夹
		file3.deleteOnExit();//删除文件,在执行完毕之后
		//判断
		System.out.println("D:\\学习\\文件例子1是否存在?"+file.exists());//判断该文件或文件夹是否存在
		System.out.println("D:\\学习\\文件例子1是否是文件夹?"+file.isDirectory());//判断该对象是不是文件夹
		System.out.println("D:\\学习\\文件例子2\\例子.txt是否是文件?"+file2.isFile());//判断该对象是否是文件
		System.out.println("D:\\学习\\文件例子2\\例子.txt是否是隐藏文件夹或者文件?"+file2.isHidden());
		System.out.println("D:\\学习\\文件例子2\\例子.txt是否是绝对路径?"+file2.isAbsolute());
		//获取
		System.out.println(file2.getName());//获取文件的文件名
		System.out.println(file2.getPath());//获取文件路径
		System.out.println(file.getParent());//获取父类文件路径
		System.out.println(file.getAbsolutePath());//获取绝对路径
		System.out.println(file2.length());//获取文件大小
		System.out.println(file2.lastModified());//获取文件上次修改时间
	}
}

三、文件列表

        在文件File对象中如果传入的是一个路径而非一个具体的文件,则我们可以使用list(),list(FileFilter filter)已经listFiles()方法来获取该文件目录下的内容!

        其使用方法如下:

package com.itheima;
import java.io.*;
public class ListFileDemo 
{
	public static void main(String[] args)
	{
		File file = new File("D:\\学习\\文件例子2\\例子.txt");
		String[] arr=file.list();//将该路劲下所有文件的文件名传入arr中
		String[] arr1=file.list(new FilenameFilter()//文件选择器,只将符合文件选择器的文件名传入arr中
		{
			public boolean accept(File file,String name)//内部类的使用,注意不要超过三个方法
			{
				return name.endsWith(".txt");
			}

		});
		File[] arr2=file.listFiles();//将该路劲下所有的文件对象传入arr2中。
	}
}

四、文件遍历和删除以及递归思想

        我们知道可以用上面的方法列出一个路径下的文件和文件夹,但是文件夹里面又有文件和文件夹,这样不断的嵌套,我们如何统计所有的文件已经如何删除该目录下的所有文件和文件夹呢?这里就需要用到递归思想。

        所谓递归,就是函数里面调用函数本身,这种手法或者编程思想叫做递归,递归要注意:1、限定条件;2、注意递归次数,避免内存溢出。

        例子,统计一个目录和其子目录下包含的文件个数。

package com.itheima;
import java.io.*;
public class BianLiDemo 
{
	public static void main(String[] args)
	{
		File file =new File("D:\\学习");
		System.out.println("这个文件路径下一共有"+tongJi(file,0)+"个文件");
	}
	public static int tongJi(File file,int count)
	{
		File[] arr= file.listFiles();
		for(int i=0;i<arr.length;i++)
		{
			if(arr[i].isDirectory())
				count=tongJi(arr[i],count);
			else count++;
		}
		return count;
	}
}
        如何删除带内容的目录,在这种情况下,需要先把当前目录下的内容全部删除在删除该目录,若目录中有目录则递归

package com.itheima;
import java.io.*;
public class DeleteDirDemo 
{
		public static void main(String[] args)
		{
			File file=new File("E:\\Youku Files");
			deletDir(file);
		}
		public static void deletDir(File file)
		{
			File[] arr=file.listFiles();
			for(int i=0;i<arr.length;i++)
			{
				if(arr[i].isDirectory())
					deletDir(arr[i]);
				else
					arr[i].delete();
			}
			file.delete();
		}
}
        如何创建Java文件列表?将所在目录下的java文件文件名存入一个文件中。

package com.itheima;
import java.io.*;
import java.util.*;
public class JavaListDemo 
{
	public static void main(String[] args) throws IOException
	{
		File file = new File("D:\\学习\\传智播客_Java培训_毕向东_Java基础源代码Codes");
		ArrayList<String> al=new ArrayList<String>();
		List<String> l=getFileName(file,al);
		toTxt(l,"D:\\学习\\传智播客_Java培训_毕向东_Java基础源代码Codes\\Java列表.txt");
	}
	public static List<String> getFileName(File file,List<String> l)
	{
		File[] arr=file.listFiles();
		for(int i =0;i<arr.length;i++)
		{
			if(arr[i].isDirectory())
				l=getFileName(arr[i],l);
			else
				l.add(arr[i].getAbsolutePath());
		}
		return l;
	}
	public static void toTxt(List<String> l,String name) throws IOException
	{
		BufferedWriter bw=new BufferedWriter(new FileWriter(name));
		for(String s:l)
		{
			bw.write(s);
			bw.newLine();
			bw.flush();
		}
		bw.close();
	}
}

五、Properties类

        所谓Properties类就是一个Map集合,具体的说是Hashtable集合,它是一个配置文件键值对存储对象,它专门用于存储配置文件。它是集合中和IO联系非常紧密的一类类,它的方法在IO流(一)中已经介绍过了,现在举例子加以说明。

package com.itheima;
import java.util.*;
import java.io.*;
public class PropertiesDemo 
{
	public static void main(String[] args) throws IOException
	{
		method_Load();
	}
	public static void method_Load() throws IOException
	{
		Properties pop = new Properties();//注意Properties集合是<String,String>的,因为任何基本数据类型都可以转换成String类型
		FileInputStream br=new FileInputStream("D:\\学习\\传智播客_Java培训_毕向东_Java基础源代码Codes\\day20\\info.txt");
		pop.load(br);//将配置文件info中的信息加载到pop中
		pop.setProperty("孙琦", String.valueOf(22));
		BufferedWriter bw= new BufferedWriter(new FileWriter("D:\\学习\\传智播客_Java培训_毕向东_Java基础源代码Codes\\day20\\info.txt"));
		pop.store(bw, "学生一号");//将备注和pop中键值对存入文件中
		pop.list(System.out);//参数类型是打印流,和System.setOut()一样
		br.close();
		bw.close();
	}
}
        以上基本包括了读取配置文件,写入配置文件,设置元素和获取元素。注意:Properties是一个<String,String>的集合。

        练习:限制程序运行次数。当运行次数到达5次时,给出,请您注册的提示。并不再让该程序执行。

package com.itheima;
import java.util.*;
import java.io.*;
public class RunCount 
{
	public static void main(String[] args) throws IOException
	{
		Properties pop=new Properties();
		InputStream is= new FileInputStream("D:\\学习\\传智播客_Java培训_毕向东_Java基础源代码Codes\\day20\\info2.txt");
		pop.load(is);
		int count=0;
		String value=pop.getProperty("time");
		if(value!=null)
		{
			count=Integer.parseInt(value);
			if(count>5)
			{
				System.out.println("您的体验期已过,请速购买正版!");
				return;
			}
		}
		count++;
		pop.setProperty("time", String.valueOf(count));
		FileOutputStream os = new FileOutputStream("D:\\学习\\传智播客_Java培训_毕向东_Java基础源代码Codes\\day20\\info2.txt");
		pop.store(os, "");//此处没法用list方法,list方法不是存储方法
		is.close();
		os.close();
	}
}

六、打印流、合并流已经分割文件。

        该流提供了打印方法,可以将各种数据类型鸳鸯打印,其中包括字节打印流:PrintStream(文件,字节流,文件路径String)
                                                                                                             字符打印流:PrintWriter(文件,字节流,字符流,文件路径)其中传入字节和字符流可以设置自动刷新
package com.itheima;
import java.io.*;
public class PrintDemo 
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader br=new BufferedReader(new FileReader("D:\\学习\\传智播客_Java培训_毕向东_Java基础源代码Codes\\day20\\info2.txt"));
		PrintWriter pw=new PrintWriter(new FileWriter("C:\\Users\\彭攀\\Desktop\\简历.files\\配置.txt"),true);
		String line=null;
		while((line=br.readLine())!=null)
		{
			pw.println(line);//传入字符流和字节流可以自动刷新,所以不需要手动刷新了
		}
		pw.close();
		br.close();
	}
}
        对于合并流,即SequenceInputStream它可以将多个读取流合并成为一个读取流,然后在用输出流写出到同一个文件中,其格式如下
package com.itheima;

import java.io.*;
import java.util.*;

public class SequenceDemo 
{
	public static void main(String[] args) throws IOException
	{
		Vector<FileInputStream> vc =new Vector<FileInputStream>();
		vc.add(new FileInputStream("C:\\Users\\彭攀\\Desktop\\简历.files\\配置1.txt"));
		vc.add(new FileInputStream("C:\\Users\\彭攀\\Desktop\\简历.files\\配置2.txt"));
		vc.add(new FileInputStream("C:\\Users\\彭攀\\Desktop\\简历.files\\配置3.txt"));
		Enumeration<FileInputStream> en=vc.elements();
		SequenceInputStream sis=new SequenceInputStream(en);
		FileOutputStream fo = new FileOutputStream("C:\\Users\\彭攀\\Desktop\\简历.files)\\配置4.txt");
		byte[] arr=new byte[1024];
		int count=0;
		while((count=sis.read(arr))!=-1)
		{
			fo.write(arr, 0, count);
		}
		sis.close();
		fo.close();
	}
}
        至于分割文件,则是利用read(arr[])方法,将读取的每一个字节输出文件写出到不同的文件中。
public static void splitFile()throws IOException
	{
		FileInputStream fis =  new FileInputStream("c:\\1.bmp");

		FileOutputStream fos = null;


		byte[] buf = new byte[1024*1024];

		int len = 0;
		int count = 1;
		while((len=fis.read(buf))!=-1)
		{
			fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");
			fos.write(buf,0,len);
			fos.close();
		}
		
		fis.close();
		
	}




------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值