day20File类,各方法。递归。删除一带内容的目录。Properties 。记录应用程序运行次数。打印流。切割合并文件。

/*
File类,各方法。递归。删除一个带内容的目录。Properties 。记录应用程序运行次数。打印流。切割合并文件。
*/


/*
File类
用来将文件或者文件夹封装成对象。
方便对文件与文件夹的属性信息进行操作
File对象可以作为参数传递给流的构造函数

了解File类中的常用方法
1,创建。
	boolean creatNewFile();在指定位置创建文件,如果文件已经存在,
		则不创建,返回false.
		和输出流不一样,输出流对象一建立就创建文件,而且文件存在会覆盖
	File creatTeamFile():创建临时文件.
	boolean mkdir();创建一级目录,创建文件夹。
	boolean mkdirs();创建多级目录
2。删除
	boolean delete();删除失败返回false。
	void deleteOnExit();在程序退出时删除指定文件。
3.判断
	boolean exists();文件是否存在。
	canExecute();能执行?
	isDirectory();是否是目录
	isFile();是否是文件
	isHidden();是否是隐藏文件
	f.ifAbsolute();是否是抽象,是否是绝对路径。
4,获取信息
	getName():
	getPath();路径
	getParent();
	getAbsolutePath();//获取绝对路径
	lastModified();最后修改时间
	long length():文件大小
	renameTo:和移动文件差不多啊!
*/
import java.io.*;

class  FileDemo
{
	public static void main(String[] args) throws IOException
	{
		method_1();
	}
	public static void method_5()
	{
		File f1 = new File("c:\\test.java");
		File f2 = new File("c:\\hahaha.java");

		sop("rename:"+f1.renameTo(f2));//改名字,成功返回true.可用于复制文件
	}

	public static void method_4()//获取信息
	{
		File f = new File("c:\\a.txt");

		sop("path:"+f.getPath());//封装是什么路径,获取就是什么
		sop("absPath:"+f.getAbsolutePath());//会在相对前加目录,绝对路径
		sop("parent"+f.getParent());//没有明确指定,返回空。
		//该方法返回的是绝对路径的父目录,如果获取相对路径,返回null.
		//如果相对路径有上一级目录,就是返回结果
	}
	public static void method_3()
	{
		File f = new File("file.txt");//只关联,没有创建就不存在。
		//f.creatNewFile();这里才是创建文件。
		//f.mkdir();//这里是创建目录。

		//记住在判断文件对象是否是文件或者是目录时,必须
		//要先判断该文件对象封装的内容是否存在。exists()

		sop("dir:"+f.isDirectory());//1.false,不能用主观判断
		sop("file:"+f.isFile());//1.false

		sop(f.ifAbsobute());//绝对路径,文件不存在也能判断
	}
	public static void method_2()//判断
	{
		File f = new File("file.txt");
		sop("exists:"+f.exists());//exists:文件是否存在
		//sop("canExecute"+f.canExecute());//文件是否能执行。

		File dir = new File("abc\\kkk");
		sop("mkdir:"+dir.mkdir());//mkdir()只能创建一级目录。
		//mkdirs(),创建多级目录。
	}

	public static void method_1()throws IOException//创建和删除
	{
		File f = new File("file.txt");//将file.txt文件封装成file对象
		
		//sop("create:"+f.createNewFile());//创建,创建成功打印true.
		sop("delete"+f.delete());//删除成功返回true.如果程序异常,这句就读不到。
								//放到finally也可能删不掉,程序可能正在应用。
		f.deleteOnExit();//发生异常也没关系。在程序退出时会删除指定文件。
	}
	public static void consMethod()
	{
		File f1 = new File("a.txt");//将a.txt文件封装成file对象,这里不会创建。

		File f2 = new File("c;\\abc","b.txt");//目录和文件分开传入。

		File d = new File("c:\\abc");
		File f3 = new File(d,"c.txt");

		sop("f1:"+f1);//只打印路径。
		sop("f2:"+f2);//绝对路径
		sop("f3:"+f3);
		
		//反\\是目录分隔符。File.separator是跨平台的分隔符。
		File F4 = new File("c:"+File.separator+"abc"+File.separator+"zzz"+File.separator+"a.txt");
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
//------------------------------
import java.io.*;
class FileDemo2 
{
	public static void main(String[] args) 
	{
		//listRootsDemo();
		//listDemo();
	}
	public static void listDemo3()
	{
		File f = new File("c:\\");

		File[] files = f.listFiles();//返回文件和文件对象,实际开发用这个。

		for (File f1 : files )
		{
			System.out.println(f1.getName()+".."+f1.length());
		}
	}
	public static void listDemo2()
	{
		File dir = new File("d:\\java0217\\day15");

		String[] arr = dir.list(new FilenameFilter()//文件名过滤,只拿文件名。
		{
			public boolean accept(File dir,String name)
			{
				//通过返回值确定文件是否存在
				//dir :上面的目录,name:文件名
				/*
				if (name.endsWith(".bak"))
				{
					return true;
				}
				else
					return false;
					*/
				return name.endsWith(".bmp");
			}
		});
		System.out.println("len:"+arr.length);

		for (String name:arr )
		{
			System.out.println(name);
		}
	}

	public static void listDemo()
	{
		File f = new File("c:\\");
		String[] names = f.list();
		//f必须是封装了一个目录,该目录必须存在。
		//当f.list,f为一个文件时,数组为空,会发生异常。

		for (String name: names)
		{
			System.out.println(name);//打印文件和文件夹名称,隐藏的也会打印。
		}
	}
	public static void listRootsDemo()
	{
		File[] files = File.listRoots();//列出机器里的有效盘符

		for (File f:files )
		{
			System.out.println(f);
			//System.out.println(f.length());//0。
		}
	}
}

/*
列出指定目录下文件或者文件夹,包含子目录中的内容
也就是列出指定目录下所有内容

因为目录中还有目录,只要使用同一个列出目录的功能的函数完成
在列出过程中出现的还是目录的话,还可以再次调用本功能

也就是函数自身调用自身
这种表现形式,或者编程手法,称为递归

递归要注意
1。限定条件。。。下一级程序结束的条件
2。要注意递归的次数,尽量避免内存溢出
*/
import java.io.*;

class  FileDemo3
{
	public static void main(String[] args) 
	{
		File f = new File("d:\\java\\package");
		showDir(f,0);
		
		//File f = new File("d:\\java0217");
		//showFile(f);
		
		//toBin(6);
		
		//int sum = getSum(10);
		//System.out.println(sum);
	}
	public static String getLevel(int level)
	{
		StringBuilder sb = new StringBuilder();
		sb.append("|--");
		for (int x =0;x<level ;x++ )
		{
			//sb.append("|--");
			sb.insert(0,"  ");
		}
		return sb.toString();
	}

	public static void showDir(File f,int level)
	{
		
		System.out.println(getLevel(level)+f.getName());
		level++;
		File[] files = f.listFiles();
		for (int x = 0;x<files.length ;x++ )
		{
			if (files[x].isDirectory())
			{
				showDir(files[x],level);
			}
			else
				System.out.println(getLevel(level)+f.getName());
		}		
	}
	public static int getSum(int i)//演示递归
	{
		if (i == 1)
		{
			return 1;
		}
		else
			return i + getSum(i-1);
	}

	public static void toBin(int i)//演示递归
	{
		if (i>0)
		{
			toBin(i/2);
			System.out.print(i%2);
		}
	}
	public static void showFile(File f)
	{
		System.out.println(f);
		File[] files = f.listFiles();
		for (int x = 0;x<files.length ;x++ )
		{
			if (files[x].isDirectory())
			{
				showFile(files[x]);
			}
			else
				System.out.println(files[x]);
		}	
	}
}

/*
删除一个带内容的目录
删除原理:
在window中,删除目录从里面往外删除的。
从里往外删除,就需要用到递归。
*/
import java.io.*;
class  RemoveDir
{
	public static void main(String[] args) 
	{
		File f = new File("d:\\test");
		deldir(f);
	}

	public static void deldir(File f)
	{
		File[] files = f.listFiles();

		for (int x = 0;x<files.length;x++ )
		{
			if (files[x].isDirectory())
			{
				deldir(files[x]);
			}
			else//不带else,会比较低效,因为是文件夹时已经删过一次了
				System.out.println(files[x].toString() +"-:file:-"+files[x].delete());
		}
		System.out.println(f +" :dir:"+f.delete());
	}
}

/*练习题
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中
建立一个java文件列表文件。

1。对指定的目录进行递归
2。递归过程中拿到所有的java文件,存到集合中.
3。遍历集合,将这些文件路径存储到流中
4。将流中的数据写入到一个文件中
*/
import java.io.*;
import java.util.*;
class  JavaFileList
{
	public static void main(String[] args)throws IOException
	{
		File f = new File("d:\\java0217");

		List<File> list = new ArrayList<File>();

		FileToList(f,list);

		//System.out.println(list.size());

		File dir = new File(f,"info1.txt");

		listToFile(list,dir.toString());

	}

	public static void fileToList(File f,List<File> list)
	{
		File[] files = f.listFiles();
		for (File file:files)
		{
			if (file.isDirectory())
			{
				fileToList(file,list);
			}
			else 
			{
				if (file.getName().endsWith(".java"))
				{
					list.add(file);
				}
			}
		}
	}
	public static void listToFile(List<File> list,String name)throws IOException
	{
		BufferedWriter bufw = null;
		
		try
		{
			bufw = new BufferedWriter(new FileWriter(name));//自己指定的文件路径name
			for (File fi : list)
			{
				//bufw.write(fi.toString());//???
				String path = fi.getAbsolutePath();
				bufw.write(path);
				bufw.newLine();
				bufw.flush();
			}
		}
		catch (IOException e)
		{
			throw e;
		}

		finally
		{
			try
			{
				if(bufw != null)
					bufw.close();
			}
			catch (IOException e)
			{
				throw e;
			}
		}
	}
}

/*
Properties 是hashtable的子类
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串!
不需要泛型,是集合和IO技术相结合的集合容器

该对象的特点:可以用于键值形式的配置文件。
在加载数据时,需要数据有固定格式:键=值。
*/

import java.util.*;
import java.io.*;
class  PropertiesDemo
{
	public static void main(String[] args) throws IOException
	{
		//getSet();
		//getProperties();
		method();
	}
	/*
	public static void getSet()
	{
		//设置
		Properties prop = new Properties();

		prop.setProperty("zhangsan","20");
		prop.setProperty("lisi","29");

		//System.out.println(prop);

		String value = prop.getProperty("lisi");//获取
		//System.out.println(value);

		//Set<String> names = prop.stringPropertyNames();
		//1.6版本之后才有这方法
		for (String name:names)
		{
			String value1 = prop.getProperty(name);//get方法返回要强转
			System.out.println(name + "=" + value1);
		}
	}
	*/
	//演示将流中的数据存储到集合中
	//想要将info.txt中键值数据存到集合中进行操作
	/*method_1方法
	1用一个流和info.txt文件关联
	2读取一行数据,将该行数据用“=”进行切割
	3.等号左边作为键,右边作为值,存入到Properties集合中就可
	*/
		public static void method_1()throws IOException
		{
			BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));
			Properties prop = new Properties();
			
			String line = null;
			while ((line = bufr.readLine())!=null)
			{
				String[] arr = line.split("=");
				prop.setProperty(arr[0],arr[1]);
			}
			System.out.println(prop);
		}

	public static void method3()throws IOException
	{
		FileInputStream fis = new FileInputStream("info.txt");//流。
		Properties prop = new Properties();
		prop.load(fis);//加载输入字节流

		prop.setProperty("lisi","44");//改过来了,只改内存,但文件中没有保存。

		FileOutputStream fos = new FileOutputStream("info.txt");

		prop.store(fos,"");//这里存进了文件,修改了硬盘上的文件数据

		//System.out.println(prop);
		prop.list(System.out);//自己的输出方法。
	}
}
/*练习题
用于记录应用程序运行次数
如果使用次数已到,那么给出注册提示

很容易想到的是:计数器。
可是该计数器定义在程序中,随着程序的运行而在内存中存在,
并进行了自增。可是随着应用程序的退出,该计数器也在内存中消失

下一次再启动该程序,又重新开始从0计数,
这样不是我们想要的。

程序结束,该计数器的值也存在,下次程序启动会先加载计数器的值,
并加1后再重新存储起来

所以要建立一个配置文件,用于该计数次数。

该配置文件使用键值对的形式便于阅读数据,并操作数据
键值对数据是map集合。数据是以文件夹形式存储,使用IO技术
那么map+io--->properties

配置文件可以实现应用程序数据的共享。
*/
import java.io.*;
import java.util.*;
class RunCount
{
	public static void main(String[] args) throws IOException
	{	
		File file = new File("count.ini");
		if (!file.exists())
		{
			file.createNewFile();
		}
		FileInputStream fis = new FileInputStream(file);
		Properties prop = new Properties();

		prop.load(fis);

		String value = prop.getProperty("time");
		int count = 0;
		if (value!=null)
		{
			count = Integer.parseInt(value);
			if (count>=5)
			{
				System.out.println("使用次数到,请注册!!!");
				return;
			}
		}
		count++;
		prop.setProperty("time",count+"");
		FileOutputStream fos = new FileOutputStream(file);//这句话不能放到上面去,会重新创建文件。
		prop.store(fos,"");
 		fis.close();
		fos.close();
	}
}

/*
打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印.

字节打印流:
PrintStream:
构造函数可以接收的参数类型
1.file对象File
2.字符串路径String
3.字节输出流OutputStream

PrintWriter:字符打印流,web开发常用,把字符一条一条打出去。
构造函数可以接收的参数类型
1.file对象File
2.字符串路径String
3.字节输出流OutputStream
4.字符输出流,Writer.
-------------
SequenceInputStream类
	合并流:多个源对应一个目的。先把多个源变成一个源,要用到枚举。
*/
import java.io.*;
class  PrintStreamDemo
{
	public static void main(String[] args) throws IOException
	{ 
		BufferedReader bufr =
			new BufferedReader(new InputStreamReader(System.in));
		//PrintWriter out = new PrintWriter(System.out,true);//true.流有自动刷新
		PrintWriter out = new PrintWriter(new FileWriter("ab.txt"),true);

		String line = null;
		while ((line = bufr.readLine())!=null)
		{
			if ("over".equals(line))
			{
				break;
			}
			//out.write(line.toUpperCase());没有换行,用下面那个
			//out.flush();没有true就要刷新。

			out.println(line.toUpperCase());//加上true,就println自动刷新
		}
		bufr.close();
		out.close();
	}
}
import java.io.*;
import java.util.*;
class  SequenceFile
{
	public static void main(String[] args) throws IOException
	{
		sequenecFile();
	}
	public static void sequenecFile()throws IOException
	{
		//合并流,三个文件合成一个,三种方法拿到en.
		/*1.Vector<FileInputStream> v = new Vector<FileInputStream> ();

		v.add(new FileInputStream("c:\\file\\1.txt"));
		v.add(new FileInputStream("c:\\file\\2.txt"));
		v.add(new FileInputStream("c:\\file\\3.txt"));
		Enumeration<FileInputStream> en = v.elements();*/

		ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
		for (int x =1;x<=3 ;x++ )
		{
			al.add(new FileInputStream("c:\\file\\" + x+ ".txt"));
		}
		//2.Enumeration <FileInputStream>en = Collections.enumeration(al);
		//3.
		final Iterator <FileInputStream> it = al.iterator();
		Enumeration  <FileInputStream>en = new Enumeration  <FileInputStream>(){
				public boolean hasMoreElements()
				{
					return it.hasNext();
				}
				public FileInputStream nextElement()
				{
					return it.next();
				}
		};

		SequenceInputStream sis = new SequenceInputStream(en);
		FileOutputStream fos = new FileOutputStream("c:\\file\\123.txt");
		int len = 0;
		byte[] buf = new byte[1024];
		while ((len = sis.read(buf))!=-1)
		{
			fos.write(buf,0,len);
		}
		sis.close();
		fos.close();
	}
}


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

//切割文件,再合并!
//切电影类的大文件别冲动!小心内存溢出。可以每装一次获取文件大小
//定个计数器,当装到100M的时候,再创建一个输出对象。

class SplitFile 
{
	public static void main(String[] args) throws IOException
	{
		FileInputStream fis = new FileInputStream("c:\\0.mp3"); 
		byte[] buf = new byte[1024*1024];
		int len = 0;int count = 1;
		FileOutputStream fos = null;
		while ((len = fis.read(buf))!=-1)
		{
			fos = new FileOutputStream("c:\\file\\"+ count+".part");
			fos.write(buf,0,len);
			count++;
			fos.close();
		}
		
		fis.close();//切割文件
		//-----------------
				//合并文件
		ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
		for (int x =1;x<=4 ;x++ )
		{
			al.add(new FileInputStream("c:\\file\\"+ x+".part"));
		}

		Enumeration<FileInputStream> en = Collections.enumeration(al);
		SequenceInputStream sis = new SequenceInputStream(en);

		FileOutputStream fos1 = new FileOutputStream("c:\\file\\111.mp3");

		byte[] buf1 = new byte[1024];
		int len1 = 0;
		while ((len1=sis.read(buf1))!=-1)
		{
			fos1.write(buf1,0,len1);
		}
		fos1.close();
		sis.close();
	}
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值