黑马程序员——Java基础——File、Properties类、 打印流、序列流

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

File

一、概述

1File类:文件和目录路径名的抽象表现形式

2、特点:

        1)用来将文件或文件夹封装成对象

        2)方便于对文件与文件夹的属性信息进行操作

        3File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变

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

 

二、File对象创建

构造方法摘要
File(File parent, String child) 
          根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname) 
          通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child) 
          根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

方式一:      

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

        将a.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。

 方式二:

            File f2=newFile("c:\\abc","b.txt");

        将文件所在目录路径和文件一起传入,指定文件路径。

 方式三:

            File d=new File("c:\\abc");

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

        将文件目录路径封装成对象。再创建文件对象。降低了文件于父目录的关联性。

小知识:

        File.separator表示目录分隔符,可以跨平台使用。相当于路径中的“\”(双斜杠\\windows中表示表示转义后的分隔符,但是在linux系统中就不是)。

 

三、File类的常见方法

        boolean   createNewFile();

        //在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。

        boolean    mkdir();//创建文件夹,只能创建一级文件夹

例:

        File dir=new File("abc");

        dir.mkdir();//创建abc这个文件夹

        boolean mkdirs();//创建多级文件夹

2、删除

        boolean delete();

        //删除文件或目录。文件存在,返回true;文件不存在或者正在被执行,返回false    

        void deleteOnExit();//在程序退出时删除指定文件

3、判断

        boolean canExecute();//是否是可执行文件

        boolean exists();//文件是否存在

        boolean isFile();//是否是文件

        boolean isDirectory();//是否是文件夹

        boolean isHidden();//是否是隐藏文件

        boolean isAbsolute();//文件是否是绝对路径

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

4、获取信息

        String getName();//获取文件名

        String getPath();

        //获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)

        String getParent();

        //获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果。

        String getAbsolutePath();//获取文件的绝对路径      

        long lastModified();//返回文件最后一次被修改的时间

        long length();//返回文件长度

5、列出文件及文件过滤

        static File[] listRoots();//列出可用的文件系统根目录

        String[] list();

        //列出当前目录下所有文件,包括隐藏。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。

        String[]list(FilenameFilter filter);

        //返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。

        //FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。

        File[] listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹

        File[] ListFiles(FilenameFilterfilter);//返回抽象路径名数组,获取目录中满足指定过滤器的文件或目录。

package com.test;

import java.io.*;
class  FileDome
{
	public static void main(String[] args) throws IOException
	{ 
		fileTest();
	}
	public static void fileTest()throws IOException //抛出异常
	{
		File f1 = new File("E://1.txt");
		File f2 = new File("E://文件夹//第二个");
		//f2.mkdir();//创建文件夹,只能创建一级目录
		f2.mkdirs();//创建多级文件夹
		System.out.println("exists:"+f2.exists());//判断存在必须先创建文件
		}
}

四、递归

1、定义

       当函数内每一次循环还可以调用本功能来实现,也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。

2、递归注意事项

        a、限定条件。是来结束循环调用,否则是死循环。

        b、注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的方法,所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。

/*
需求:列出指定目录下文件或文件夹,包含子目录,即列出指定目录下所有内容(带层次的)。

分析,因为目录中还有目录,只有使用同一个列出目录功能的函数完成即可,在列出过程中出现的还是目录的话,还可以再调用本功能,这就是利用递归原理。

*/
import java.io.*;
class  RecursionDemo
{
	public static void main(String[] args) 
	{
		//关联指定路径
		File dir=new File("e:\\Java Study\\Practice");
		
        //列出关联路径中所有的.java文件
		allFileList(dir,0);
	}

	//列出指定目录下的所以内容
	public static void allFileList(File dir,int level)
	{
		//有层次的输出
		System.out.println(getLevel(level)+dir);
		level++;
		File[] fileArr=dir.listFiles();//获取本目录下的所以文件和目录的抽象路径
		
        //遍历
		for (File file : fileArr)
		{
			if(file.isDirectory())
			{
				//如果目录下还是目录,则继续调用本函数
				allFileList(file,level);
			}
			else
				System.out.println(getLevel(level)+file);//显示(列出)文件
		}	
	}

	//带层次的列表
	public static String getLevel(int level)
	{
		StringBuilder sb=new StringBuilder();
		sb.append("|--");
		//每多一级目录,就多输出指定字符
		for (int x=level;x>0 ; x--)
		{
			//sb.append("|--");
			sb.insert(0,"|  ");
		}
		return sb.toString();
	}
}

 Properties

一、概述

1PropertiesHashtable的子类,它具备Map集合的特点。而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。

2、特点:

        1)可用于键值对形式的配置文件

        2)在加载时,需要数据有固定的格式,常用的是:键=

 

二、特有方法

1、设置

        Object setProperty(String key,String value);

        //设置键和值,调用Hashtable的方法put

2、获取

        String getProperty(String key);

        //指定key搜索value

        Set<String> stringPropertyName();

        //返回属性列表的键集,存入Set集合

3、加载流和存入流

        void load(InputStream ism);

        //从输入字节流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

        void load(Readerreader);

        //从输入字符流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

        voidlist(PrintStream out);//将属性列表输出到指定的输出流

        void store(OutputStreamout,String comments);

        //对应load(InputStream )将属性列表(键值对)写入输出流。comments属性列表的描述。

        void store(Writerwriter, String comments);

        //对应load(Reader)将属性列表(键值对)写入输出流。comments属性列表的描述。


打印流

一、概述

        1、打印流包括:PrintStreamPrintWriter

        2、该流提供了打印方法,可将各种类型的数据都原样打印。

 

二、字节打印流:PrintStream

构造方法中可接收的参数类型:

        1File对象。File

        2、字符串路径:String

        3、字符输出流:OutputStream

 

三、字符串打印流:PrintWriter

构造方法中可接受的参数类型

        1File对象: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);

		String line = null;

		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))//结束字符
			break;
			out.println(line.toUpperCase());
			//out.flush();
		}
		
		//关流
		out.close();
		bufr.close();

	}	
}

序列流

一、概述

1SequenceInputStream对多个流进行合并。也被称为合并流。

2、常用构造函数

        SequenceInputStream(Enumeration<?extends FileInputStream> e)

 

二、常见合并多个流文件步骤

        1、创建集合,并将流对象添加进集合

        2、创建Enumeration对象,将集合元素加入。

        3、创建SequenceInputStream对象,合并流对象

        4、创建写入流对象,FileOutputStream关联写入文件

        5、利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。


三、文件切割的原理?

通过读取流关联源文件,然后读取流将一个临时的数据进行了一个临时的缓冲,然后通过这个临时的缓冲区将数据分散到不同的文件当中。

也就意味着一个读取流对应着多个输出流。


/*
SequenceInputStream
合并流
需求:将三个文本文件中的数据合并到一个文本文件中
思路:1、创建一个Vector集合,将三个文本文件字节流添加到集合中
	  2、创建Enumeration对象,创建SequnceInputStream对象关联Enumeration
	  3、输出流关联新文本文件
	  4、反复读写操作
*/
import java.util.*;
import java.io.*;

class  SequenceInputStreamDemo
{
	public static void main(String[] args)throws IOException
	{
		Vector<InputStream> ve=new Vector<InputStream>();//创建vector集合,并添加相关流对象
		ve.add(new FileInputStream("1.txt"));
		ve.add(new FileInputStream("2.txt"));
		ve.add(new FileInputStream("3.txt"));

		Enumeration<InputStream> en=ve.elements();//创建枚举对象
		SequenceInputStream sis=new SequenceInputStream(en);//合并流

		FileOutputStream fos=new FileOutputStream("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();
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值