Java基础_IO流(File类和properties类相关操作)


一、IO(File概述)

File类:

用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。

File对象可以作为参数传递给流的构造函数。


/*
File概述:
*/
import java.io.*;
class FileDemo
{
	public static void main(String[] args) 
	{
		consMethod();
	}
	public static void consMethod()//创建File对象
	{
		//将a.txt封装成对象。可以将已有和未出现的文件或文件夹封装成对象
		File f1=new File("a.txt");//1

		File f2=new File("e:\\abc","b.txt");//2
		
		File d=new File("e:\\abc");//3
		File f3=new File(d,"c.txt");

		File f4=new File("c:"+File.separator+"abc"+File.separator+"e.txt");

		sop("f1:"+f1);
		sop("f2:"+f2);
		sop("f3:"+f3);
		sop("f4:"+f4);
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}


二、IO(File对象功能)

File类常见方法:

1.创建。

boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false

 和输出流不一样,输出流对象一创建文件,而且文件已经存在,会覆盖。

boolean mkdir():创建一级文件夹

boolean mkdirs():创建多级文件夹

2.删除。

boolean delete():删除失败返回false

boolaan deleteOnExit():在程序退出时删除指定文件。

3.判断。

boolean canExecute():测试应用程序是否可以执行此抽象路径名表示的文件。 

boolean exists():文件是否存在。

boolean isFile():测试此抽象路径名表示的文件是否是一个标准文件。

boolean isDirectory():测试此抽象路径名表示的文件是否是一个目录。

boolean isHidden():测试此抽象路径名指定的文件是否是一个隐藏文件。

boolean isAbsolute():测试此抽象路径名是否为绝对路径名。

4.获取信息。

String getName():返回由此抽象路径名表示的文件或目录的名称。

String getPath():将此抽象路径名转换为一个路径名字符串。

String getParent():返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null

File getAbsoluteFile():返回此抽象路径名的绝对路径名形式。等同于 new File(this.getAbsolutePath())。 

String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。

long lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。 

long length():返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。

boolean renameTo(File dest):重新命名此抽象路径名表示的文件。

/*
File类常见方法:

*/
import java.io.*;
class FileDemo
{
	public static void main(String[] args) throws IOException
	{
		consMethod();
		method_1();
		method_2();
		method_3();
		method_4();
		method_5();
	}
	
	public static void method_1()throws IOException
	{
		sop("method_1:");

		File f=new File("file.txt");
		f.deleteOnExit();//告诉结束程序时删除file.txt
		sop("create:"+f.createNewFile());
		sop("delete:"+f.delete());

		//创建文件夹(注意:目录已存在,则创建失败!)
		File dir1=new File("abc");
		sop("mkdir:"+dir1.mkdir());//创建一级文件夹
		File dir2=new File("abc\\bcd\\asd");
		sop("mkdirs:"+dir2.mkdirs());//创建多级文件夹


	}

	public static void method_2()throws IOException
	{
		sop("method_2:");

		File f=new File("file.txt");
		sop("exists:"+f.exists());
		//sop("execute:"+f.canExecute());
	}

	public static void method_3()throws IOException
	{
		sop("method_3:");

		File f=new File("file.txt");

		/*注意:在判断文件对象是否是文件或者目录时,必须先判断文件对象封装的内容是否存在。
		通过exists判断。
		*/
		f.createNewFile();
		//f.mkdir();
		sop("isDirectory:"+f.isDirectory());
		sop("isFile:"+f.isFile());

		sop("isAbsolute:"+f.isAbsolute());//测试此抽象路径名是否为绝对路径名。
	}
	public static void method_4()throws IOException
	{
		sop("method_4:");

		File f=new File("a.txt");
		f.createNewFile();
		sop("path:"+f.getPath());
		sop("abspath:"+f.getAbsolutePath());/*返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
											  如果相对路径中有上一层目录,那么就返回该目录。
											*/
	}
	public static void method_5()throws IOException
	{
		sop("method_5:");
		File f1=new File("e:\\a.txt");
		f1.createNewFile();
		File f2=new File("e:\\b.txt");

		sop("rename:"+f1.renameTo(f2));
	}


	public static void consMethod()//创建File对象
	{
		sop("consMethod:");
		//将a.txt封装成对象。可以将已有和未出现的文件或文件夹封装成对象
		File f1=new File("a.txt");//1

		File f2=new File("e:\\abc","b.txt");//2
		
		File d=new File("e:\\abc");//3
		File f3=new File(d,"c.txt");

		File f4=new File("c:"+File.separator+"abc"+File.separator+"e.txt");

		sop("f1:"+f1);
		sop("f2:"+f2);
		sop("f3:"+f3);
		sop("f4:"+f4);
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}



三、IO(File对象功能-文件列表)

/*
static File[] listRoots():列出可用的文件系统根。
String[] list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

String[] list(FilenameFilter filter)返回一个字符串数组,这些字符串指定此抽象路径名表示的
目录中满足指定过滤器的文件和目录。除了返回数组中的字符串必须满足过滤器外,此方法的行为与 
list() 方法相同。如果给定 filter 为 null,则接受所有名称。否则,当且仅当在此抽象路径名及
其表示的目录中的文件名或目录名上调用过滤器的 
FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该名称才满足过滤器。

*/
import java.io.*;
class FileDemo2 
{
	public static void main(String[] args) 
	{
		listDemo_1();//获取根目录文件和文件夹名称
		listDemo_2();//获取根目录文件和文件夹名称(只提取*.doc文件)
		listDemo_3();//获取根目录文件和文件夹名称以及文件的长度		
	}
	public static void listDemo_3()
	{
		File dir=new File("e:\\");
		File[] files=dir.listFiles();
		for(File f:files)
		{
			System.out.println("文件名:"+f.getName()+"长度:"+f.length());
		}
		System.out.println();
	}
	public static void listDemo_2()
	{
		File dir=new File("e:\\");
		String[] arr=dir.list(new FilenameFilter(){
		
		public boolean accept(File fir,String name)
		{
			/*
			if(name.endsWith(".doc"))
				return true;
			else
				return false;
			*/

			return name.endsWith(".doc");
		}
		
		});
		for(String name:arr)
		{
			System.out.println(name);
		}
		System.out.println();
	}
	public static void listDemo_1()
	{
		File f=new File("c:\\");
		String[] names=f.list();//调用list的File对象必须是一个目录,该目录必须存在。
		for(String name:names)
		{
			System.out.println(name);
		}
		System.out.println();
	}
	public static void listRootsDemo()
	{
		File[] files =File.listRoots();
		for(File f:files)
		{
			System.out.println(f);
		}
		System.out.println();
	}
}


四、IO(列出目录下所有内容-递归)

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

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,
还可以再次调用本功能。也就是函数自身调用自身,这种编程手法称为递归。

注意:
1.限定条件
2.注意递归的次数,避免内存溢出。
*/
import java.io.*;
class FileDemo3 
{
	public static void main(String[] args) 
	{
		File dir=new File("d:\\");
		showDir(dir);

		//toBin(3);//十进制转换为二进制
		//System.out.println();
		//System.out.println(getNum(100));//等差数列前N项和
	}
	
	public static void showDir(File dir)
	{
		System.out.println(dir);
		File[] files=dir.listFiles();
		for(int i=0;i<files.length;i++)
		{
			if(files[i].isDirectory())
				showDir(files[i]);
			else
				System.out.println(files[i]);
		}
	}
	
	
	public static void toBin(int num)//十进制转换为二进制
	{
		if(num>0)
		{
			toBin(num/2);
			System.out.print(num%2);
		}
	}
	public static int getNum(int n)//等差数列前N项和
	{
		if(n==1)
			return 1;
		return n+getNum(n-1);
	}
}


五、IO(列出目录下所有内容-带层次)

/*
列出目录下所有内容-带层次:
*/
import java.io.*;
class FileDemo3 
{
	public static void main(String[] args) 
	{
		File dir=new File("C:\\Users");
		showDir(dir,0);
	}
	public static String getLevel(int level)
	{
		StringBuilder sb=new StringBuilder();
		sb.append("|---");
		for(int i=0;i<level;i++)
		{
			sb.insert(0,"|   ");
		}
		return sb.toString();
	}
	public static void showDir(File dir,int level)
	{
		System.out.println(getLevel(level)+dir.getName());
		level++;
		File[] files=dir.listFiles();
		for(int i=0;i<files.length;i++)
		{
			if(files[i].isDirectory())
				showDir(files[i],level);
			else
				System.out.println(getLevel(level)+files[i]);
		}
	}
}


六、IO(删除带内容的目录)


/*
删除一个带内容的目录:
删除原理:
在Windows中,删除目录从里面往外删除。
既然是从里往外删除,就需要用到递归。
*/
import java.io.*;
class RemoveDir 
{
	public static void main(String[] args) 
	{
		File dir=new File("e:\\removeText");
		removeDir(dir);
	}
	public static void removeDir(File dir)
	{
		File[] files=dir.listFiles();
		for(int i=0;i<files.length;i++)
		{
			if(files[i].isDirectory())
				removeDir(files[i]);
			else
				System.out.println(files[i].toString()+"\t文件删除状态:"+files[i].delete());

		}
		System.out.println(dir+"\t目录删除状态:"+dir.delete());
		
	}
}


七、IO(创建java文件列表)


/*
练习:

将一个指定目录下的java文件的绝对路径存储到一个文本文件中,也就是建立
一个Java文件列表文件。

思路:
1.对指定的目录进行递归。
2.获取在递归过程中所有Java文件的路径。
3.将这些路径存储到集合中。
4.将集合中的数据写入到一个文件中。

*/
import java.io.*;
import java.util.*;
class JavaFileList 
{
	public static void main(String[] args)
	{
		File dir=new File("d:\\java");
		List<File> list=new ArrayList<File>();
		fileToList(dir,list);

		File file=new File(dir,"javalist.txt");
		writeToFile(list,file.toString());
	}
	public static void fileToList(File dir,List<File> list)
	{
		File[] files=dir.listFiles();
		for(File file:files)
		{
			if(file.isDirectory())
				fileToList(file,list);
			else
			{
				if(file.getName().endsWith(".java"))
					list.add(file);
			}
		}
	}
	public static void writeToFile(List<File> list,String javaListFile) 
	{
		BufferedWriter bufw=null;
		try
		{
			bufw=new BufferedWriter(new FileWriter(javaListFile));
			for(File f:list)
			{
				String path=f.getAbsolutePath();
				bufw.write(path);
				bufw.newLine();
				bufw.flush();
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("操作文件失败");
		}
		finally
		{
			try
			{
				if(bufw!=null)
					bufw.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("关闭写入流失败");
			}
		}
	}
}


八、IO(Properties简述)

PropertiesHashtable的子类,也就是说它具备了Map集合的特点。它里面存储的键值对都是字符串。

是集合中和IO技术相结合的集合容器。

该对象的特点:可以用于键值对形式的配置文件。

那么在加载数据式,需要数据有固定格式:键=

九、IO(Properties存取)


/*
Properties存取:
*/
import java.io.*;
import java.util.*;
class PropertiesDemo 
{
	public static void main(String[] args) 
	{
		setAndGet();
	}
	public static void setAndGet()
	{
		Properties prop=new Properties();
		prop.setProperty("zhangsan","20");
		prop.setProperty("lisi","39");

		System.out.println(prop);
		System.out.println(prop.getProperty("lisi"));
		
		prop.setProperty("lisi","43");
		Set<String> names=prop.stringPropertyNames();
		for(String s:names)
		{
			System.out.println(s+":"+prop.getProperty(s));
		}
	}
}


十、IO(Properties存取配置文件)


/*
Properties存取:

想要将info.txt中键值数据存入到集合中进行操作。
1.用一个流和info.txt文件关联。
2.读取一行数据,将该行数据用"="号进行切割。
3.等号左边作为键,右边作为值。存入到Properties集合中。
*/
import java.io.*;
import java.util.*;
import java.io.*;
class PropertiesDemo 
{
	public static void main(String[] args)throws IOException
	{
		//setAndGet();
		//method_1();
		loadDemo();
	}
	public static void loadDemo()throws IOException
	{
		Properties prop=new Properties();
		FileInputStream fis=new FileInputStream("info.txt");

		//将流中的数据加载进集合。
		prop.load(fis);
		prop.setProperty("wangwu","21");

		FileOutputStream fos=new FileOutputStream("info.txt");
		prop.store(fos,"abc");//第二个参数:注释信息
		//System.out.println(prop);
		prop.list(System.out);
		fos.close();
	}
	public static void method_1()throws IOException
	{
		BufferedReader bufr=new BufferedReader(new FileReader("info.txt"));
		String line=null;
		Properties prop=new Properties();
		while((line=bufr.readLine())!=null)
		{
			String[] arr=line.split("=");
			//System.out.println("键:"+arr[0]+"\t值:"+arr[0]);
			prop.setProperty(arr[0],arr[1]);
		}
		bufr.close();

		System.out.println(prop);
	}
	public static void setAndGet()
	{
		Properties prop=new Properties();
		prop.setProperty("zhangsan","20");
		prop.setProperty("lisi","39");

		System.out.println(prop);
		System.out.println(prop.getProperty("lisi"));
		
		prop.setProperty("lisi","43");
		Set<String> names=prop.stringPropertyNames();
		for(String s:names)
		{
			System.out.println(s+":"+prop.getProperty(s));
		}
	}
}


十一、IO(Properties练习)


/*
用于记录应用程序运行次数。
如果使用次数已到,那么给出注册提示。

很容易想到:计数器。
课时该计数器定义在程序中随着程序的运行而在内存中存在,并进行自增。
可是随着该应用程序的退出,计数器也在内存中消失了,下次再启动该程序,
该计数器也在内存中消失了。
下一次再启动该程序,又重新开始从0计数。
程序即使结束,该计数器的值也存在,下次程序启动在会先加载该计数器的值并加1后再重新
存储起来。所以要建立一个配置文件,用于记录该软件的使用次数。

该配置文件使用键值对的形式,这样便于阅读数据并操作数据。
键值对数据是Map集合。数据是以文件形式相结合,使用IO技术,那么 Map+IO --> Properties

配置文件可以实现应用程序数据的共享。

*/
import java.io.*;
import java.util.*;
class RunCount 
{
	public static void main(String[] args)throws IOException 
	{
		Properties prop=new Properties();
		File file=new File("count.ini");
		if(!file.exists())
			file.createNewFile();
		FileInputStream fis=new FileInputStream(file);
		
		prop.load(fis);

		int count=0;
		String value=prop.getProperty("time");
		if(value!=null)
		{	
			count=Integer.parseInt(value);
			if(count>=3)
			{
				System.out.println("您好,试用次数已到。");
				return;
			}
			
		}

		count++;
		prop.setProperty("time",count+"");
		FileOutputStream fos=new FileOutputStream(file);
		prop.store(fos,"");
	}
}



十二、IO(PrintWriter)

打印流:

PrintWriterPrintStream

可以直接操作输入流和文件。


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

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

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

*/
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(new FileWriter("a.txt"),true);//true:刷新缓冲区

		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			out.println(line.toUpperCase());
			//out.flush();
		}
		out.close();
		bufr.close();
	}
}


十三、IO(合并流)

序列流:

SequenceInputStream:对多个流进行合并。


/*
SequenceInputStream:对多个流进行合并。
*/
import java.io.*;
import java.util.*;
class SequenceDemo 
{
	public static void main(String[] args)throws IOException 
	{
		Vector<FileInputStream> v=new Vector<FileInputStream>();
		v.add(new FileInputStream("e:\\1.txt"));
		v.add(new FileInputStream("e:\\2.txt"));
		v.add(new FileInputStream("e:\\3.txt"));

		Enumeration<FileInputStream> en=v.elements();

		SequenceInputStream sis=new SequenceInputStream(en);
		FileOutputStream fos=new FileOutputStream("e:\\4.txt");

		byte[] buf=new byte[1024];

		int len=0;
		while((len=sis.read(buf))!=-1)
		{
			fos.write(buf,0,len);
		}
		fos.close();
		sis.close();

	}
}


十四、IO(切割文件)

/*
切割,合并mp3文件:

*/
import java.io.*;
import java.util.*;
class SplitFile 
{
	public static void main(String[] args)throws IOException 
	{
		splitFile();
		merge();
	}
	public static void splitFile()throws IOException//切割
	{
		FileInputStream fis=new FileInputStream("e:\\1.mp3");
		FileOutputStream fos=null;

		byte[] buf=new byte[1024*1024];
		int len=0;
		int count=1;
		while((len=fis.read(buf))!=-1)
		{
			fos=new FileOutputStream("e:\\splitfiles\\"+(count++)+".part");
			fos.write(buf,0,len);
			fos.close();
		}
		fis.close();
	}
	public static void merge()throws IOException //合并
	{
		ArrayList<FileInputStream> a1=new ArrayList<FileInputStream>();
		for(int i=1;i<=4;i++)
		{
			a1.add(new FileInputStream("e:\\splitfiles\\"+i+".part"));
		}

		final Iterator<FileInputStream> it=a1.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("e:\\splitfiles\\0.mp3");
		byte[] buf=new byte[1024];
		int len=0;
		while((len=sis.read(buf))!=-1)
		{
			fos.write(buf,0,len);
		}
		fos.close();
		sis.close();
	}
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值