【Java基础】——IO流(中)


一、 File 类

1、概述

①什么是File类:用于封装一个路径,封装的路径可以是文件或文件夹。是文件和目录路径名的抽象表现形式。
②File类的特点:
a、将文件或文件夹封装成对象,方便于对文件与文件夹的属性信息进行操作。
b、File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
c、File对象可以作为参数传递给流的构造函数。

2、File对象创建—— File 的构造方法

①File(String pathName)//根据指定路径创建File对象。可以将已有的和未出现的文件或者文件夹封装成对象。
      如: File f =new File("a.txt");。
②File(String pathName, String child)//根据指定的父路径和子路径(包括文件)创建文件对象。
      如: File f2=newFile("c:\\abc","b.txt")
③File(File parent, String child)//根据指定的File类型父路径和子路径创建文件对象,将文件目录路径封装成对象降低了文件于父目录的关联性。
      如: File d=new File("c:\\abc");
            File f3=new File(d,"c.txt")
注意:File仅仅是一个路径的表示,不代表具体的事物一定是存在的。

3、File类常用的成员方法

①创建功能

  • boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
  • boolean mkdir():创建文件夹,一次只能创建一个文件夹。
  • boolean mkdirs():创建多级文件夹。

②删除功能

  • boolean delete():文件对象存在,返回true;不存在或者正在被执行,返回false
  • void deleteOnExit();在程序退出时删除指定文件对象。

③判断功能

  • boolean exists() :文件对象是否存在.
  • isFile():是否是文件
  • isDirectory();是否是文件夹
  • isHidden();是否是隐藏文件
  • isAbsolute();是否是绝对路径
  • boolean renameTo(File file)://文件重命名
  •  boolean canExecute();//是否是可执行文件
记住:在判断文件对象是否是文件或者目录时,必须要判断该文件对象封装的内容是否存在。通过exists判断。

④获取信息功能

  • getName()://返回文件对象表示的文件或文件夹名称
  • getParent()://返回File对象目录的父目录即不包含最后一级子目录,如果是相对路径且只有单极目录则返回null
  • getPath()://获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)
  • getAbsolutePath()//获取文件的绝对路径 
  • long lastModified()//返回文件对象最后一次被修改的时间
  • long length() //返回文件长度,即文件大小

⑤列出文件及文件过滤功能

  • static File[] listRoots();//列出可用的文件系统根目录,即系统盘符
  • String[] list();//列出当前目录下所有文件的名称,包括隐藏。该file对象必须是且该目录还必须存在。
  • File[] listFiles();//获取当前文件夹下的所有文件和文件夹
  • String[] list(FilenameFilter filter)//获取目录中满足指定过滤器的文件,如:需要得到指定类型的文件。
  • FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法accept(File dir,String name),返回的是boolean型,把不符合条件(即返回值为false)的文件过滤
  • File[] ListFiles(FilenameFilter filter);//获取目录中满足指定过滤器的文件或目录,如果元素中还有子目录,则需用到递归。
  • int compareTo(File pathName)//按字母顺序比较两个抽象路径名
⑥重命名功能
  • public boolean renameTo (File dest ) 重新命名文件
代码演示:File类常用功能演示
package com.huang.io.file;

import java.io.File;
import java.io.IOException;

/*
 * File类常见方法演示
 */
public class FileDemo {

	public static void main(String[] args) throws IOException {
		method_5();
	}

	public static void method_5() {
		File f1 = new File("c:\\Test.java");
		File f2 = new File("d:\\hahah.java");

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

	}

	public static void method_4() {
		File f = new File("file.txt");

		sop("path:" + f.getPath());
		sop("abspath:" + f.getAbsolutePath());
		sop("parent:" + f.getParent());// 该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
										// 如果相对路径中有上一层目录那么该目录就是返回结果。

	}

	public static void method_3() throws IOException {
		File f = new File("d:\\java1223\\day20\\file2.txt");

		f.createNewFile();

		f.mkdir();

		// 记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
		// 通过exists判断。
		sop("dir:" + f.isDirectory());
		sop("file:" + f.isFile());

		sop(f.isAbsolute());
	}

	public static void method_2() {
		File f = new File("file.txt");

		sop("exists:" + f.exists());

		sop("execute:" + f.canExecute());

		// 创建文件夹
		File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");

		sop("mkdir:" + dir.mkdirs());
	}

	public static void method_1() throws IOException {
		File f = new File("file.txt");
		sop("create:" + f.createNewFile());
		sop("delete:" + f.delete());

	}

	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

二、递归

1、递归概述

递归就是方法定义中调用方法本身的现象。

2、递归注意事项

①要有出口,否则就是死递归。

②次数不能太多,否则会造成内存溢出。

③构造方法不能递归使用。

3、递归应用举例(递归遍历目录)

package cn.itcast_03;

import java.io.File;

/*
 * 需求:把D:\java练习目录下所有的java结尾的文件的绝对路径给输出在控制台。
 * 
 * 分析:
 * 		A:封装目录
 * 		B:获取该目录下所有的文件或者文件夹的File数组
 * 		C:遍历该File数组,得到每一个File对象
 * 		D:判断该File对象是否是文件夹
 * 			是:回到B
 * 			否:继续判断是否以.java结尾
 * 				是:就输出该文件的绝对路径
 * 				否:不搭理它
 */
public class FilePathDemo {
	public static void main(String[] args) {
		// 封装目录
		File srcFolder = new File("D:\java练习");

		// 递归功能实现
		getAllJavaFilePaths(srcFolder);
	}

	private static void getAllJavaFilePaths(File srcFolder) {
		// 获取该目录下所有的文件或者文件夹的File数组
		File[] fileArray = srcFolder.listFiles();

		// 遍历该File数组,得到每一个File对象
		for (File file : fileArray) {
			// 判断该File对象是否是文件夹
			if (file.isDirectory()) {
				getAllJavaFilePaths(file);
			} else {
				// 继续判断是否以.java结尾
				if (file.getName().endsWith(".java")) {
					// 就输出该文件的绝对路径
					System.out.println(file.getAbsolutePath());
				}
			}
		}
	}
}

三、 Properties 类

1、概述

Properties 是 Hashtable 的子类,它具备Map集合的特点。而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。可用于键值对形式的配置文件

2、特有方法

①设置
    Object setProperty(String key,String value);//设置键和值,源码是调用Hashtable的方法put(k,v)方法。
②获取
    String getProperty(String key);//返回指定键所映射的值
    Set<String> stringPropertyName();//返回属性列表的键集,存入Set集合

③加载流和存入流
a、将流中的数据加载进集合。
    void load(InputStream ism);//从输入字节流中读取属性列表(键和元素对)
    void load(Reader reader);//从输入字符流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。
b、将集合中数据加载进流
  • void store(OutputStreamout,String comments);//对应load(InputStream)将属性列表(键值对)写入输出流。
  • void store(Writerwriter, String comments);//comments:属性列表的描述即注释。
④将属性列表输出到指定的输出流。
  • void list(PrintStream out);
  • void list(PrintWriter out);
⑤练习:将文件中的键值对存储到集合中
package com.huang.io.file;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
/**
 *@author huangxiang
 *@date 创建时间:2015年5月26日上午1:53:29
 *@version 1.0
 */
/*
 * Properties练习
 * 将文件中的键值对存储到集合中 。 
 * 思路: 1.创建读取流对象并与文件关联。
 *  	2.读取一行数据,将该数据用“=”切割。
 * 		3.将等号左边作为建,右边作为值,存入集合中。
 */

public class PropertiesTest {
	public static void main(String[] args) throws IOException {
		method();
		// method_2();
	}

	// 方法一
	public static void method() {
		// 创建读取流对象并与文件关联。
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("f:\\b.txt"));

			// 创建集合
			Properties pro = new Properties();

			String line = null;
			while ((line = br.readLine()) != null) {
				String[] str = line.split("=");
				pro.put(str[0], str[1]);

			}
			System.out.println(pro);
		} catch (Exception e) {
			throw new RuntimeException("文件读取失败");
		} finally {
			try {
				if (br != null)
					br.close();
			} catch (Exception e) {
				throw new RuntimeException("流关闭失败");
			}

		}

	}

	// 方法二
	public static void method_2() {
		// 创建读取流对象,并和文件关联。
		BufferedReader br = null;

		try {
			br = new BufferedReader(new FileReader("f:\\a.java"));
			// 创建集合
			Properties pro = new Properties();

			// 将流中数据加载进集合
			pro.load(br);

			System.out.println(pro);

		} catch (Exception e) {
			throw new RuntimeException("文件读取失败");
		}

		finally {
			try {
				if (br != null)
					br.close();
			} catch (Exception e) {
				throw new RuntimeException("流关闭失败");
			}
		}

	}
}

四、打印流

1、字节打印流: PrintStream

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

2、字符打印流: PrintWriter

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

注意:当接收的参数是流时,其重载方法(out,boolean)可以创建带自动刷新的打印流对象。
    如果 boolean 为 true ,则 println、printf 或 format 方法将刷新输出缓冲区
代码演示如下:

package com.huang.io.file;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
/**
 *@author huangxiang
 *@date 创建时间:2015年5月27日上午2:06:30
 *@version 1.0
 */

/*
 * 打印流练习
 * 1.将键盘录入的数据存入文本文件中。
 *  思路: 1.创建读取流对象。
 *		 2.用写入流创建文件 
 * 		 3.通过循环的读写将数据存入文件中。 
 *		 4.关闭资源。
 */

public class PrintTest {
	public static void main(String[] args) {
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			pw = new PrintWriter(new FileWriter("src.txt"), true);

			String line = null;
			while ((line = br.readLine()) != null)// 一次读取一行数据,判断是否达到流末尾
			{
				if ("over".equals(line))
					break;
				pw.println(line);// 将数据写入流中并刷新
			}

		} catch (Exception e) {
			System.out.println("文件写入失败");
		} finally {
			try {
				if (br != null)
					br.close();
			} catch (Exception e) {
				System.out.println("读取流关闭失败");
			}
			try {
				if (pw != null)
					pw.close();
			} catch (Exception e) {
				System.out.println("写入流关闭失败");
			}
		}
	}
}


五、序列流

1、概述

①SequenceInputStream 对多个流进行合并。也被称为合并流。
②常用构造函数
    a、SequenceInputStream(InputStream s1, InputStream s2)//将两个流合并
    b、SequenceInputStream(Enumeration<?extends FileInputStream> e)//将多个流合并
    方法1:创建Vector集合对象,将流添加进集合,在用elements()方法枚举。
    方法2:创建ArrayList对象,将流加进集合,使用匿名内部类创建 Enumeration 子类对象并覆盖其方法。
        这样ArrayList中的流全部加进Enumeration中。

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

    1、创建集合,并将流对象添加进集合
    2、创建Enumeration对象,将集合元素加入。
    3、创建SequenceInputStream对象,合并流对象
    4、创建写入流对象,FileOutputStream关联写入文件
    5、利用SequenceInputStream对象和FileOutputStream对象对数据进行反复读写操作。


练习一:将三个流合并为一个

package com.huang.io.file;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

/**
 * @author huangxiang
 * @date 创建时间:2015年5月26日上午1:59:27
 * @version 1.0
 */
// 四、序列流练习
/*
 * 1.将三个java文件合并到一个文本文件中。 
 * 思路: 1.创建Vector集合,将三个java文件字节流存入集合中。
 * 		2.创建Enumeration对象,将集合元素加入。 
 * 		3.创建SequenceInputStream对象,关联Enumeration
 * 		4.创建输出流关联新文本文件。 5.循环读写数据。
 */

public class SequenceInputStreamTest {
	public static void main(String[] args) throws IOException {
		merge();

	}

	public static void merge() throws IOException {
		// 创建Vector集合合并流对象
		Vector<InputStream> v = new Vector<InputStream>();
		v.add(new FileInputStream("PrintTest.java"));
		v.add(new FileInputStream("FileTest.java"));
		v.add(new FileInputStream("Test.java"));

		// 创建Enumeration对象
		Enumeration<InputStream> en = v.elements();

		// 创建合并流对象,合并流
		SequenceInputStream sis = new SequenceInputStream(en);

		// 创建输出流对象,写入数据
		FileOutputStream fos = new FileOutputStream("merge.txt");

		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = sis.read(buf)) != -1) {
			fos.write(buf, 0, len);
		}
		// 关闭资源
		sis.close();
		fos.close();
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值