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

------- android培训 java培训 、期待与您交流! ----------

第十二部分:文件列表方法示例

1、文件列表使用的是File类的关键方法:

a、static File[] listRoots():列出可用的文件系统根。

b、File[] listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

c、String[] list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。


2、list()使用代码示例:

public class HelloDemo {
	public static void main(String[] args) throws Exception {
		File f = new File("E:\\Test");
		String[] names = f.list();
		for(String name : names)
		{
			System.out.println(name);
		}
	}
}
输出结果:
1 - 副本 (5).txt
1 - 副本.txt
1.txt
新建文件夹
新建文件夹 - 副本
新建文件夹 - 副本 (2)


3、listRoots使用方法示例:

public class HelloDemo {
	public static void main(String[] args) throws Exception {
		File[] files = File.listRoots();
		for(File f:files)
		{
			System.out.println(f);
		}
	}
}

输出结果:

C:\
D:\
E:\
F:\
G:\


4、listFiles()方法使用示例:

public class HelloDemo {
	public static void main(String[] args) throws Exception {
		File dir = new File("E:\\Test");
		File[] files = dir.listFiles();
		for(File f : files)
		{
			System.out.println(f.getName()+":"+f.length());
		}
	}
}
输出结果:

1 - 副本 (5).txt:0
1 - 副本.txt:0
1.txt:0
新建文件夹:4096
新建文件夹 - 副本:0
新建文件夹 - 副本 (2):0

5、仅限式txt格式的文件方法示例:

在list()方法中传入FilenameFilter对象参数,并覆写accept方法。

import java.io.File;
import java.io.FilenameFilter;

public class HelloDemo {
	public static void main(String[] args) throws Exception {
		File dir = new File("E:\\Test");
		String[] arr1 = dir.list(new FilenameFilter() {
			public boolean accept(File dir,String name)//覆写accpet方法。注意参数
			{
				return name.endsWith(".txt");//返回指定的文件名
			}
		});
		for(String s : arr1)
		{
			System.out.println(s);
		}
	}
}
输出结果:

1 - 副本 (5).txt
1 - 副本.txt
1.txt


5、使用递归列出指定目录下的所有内容

public class HelloDemo {
	public static void main(String[] args) throws Exception {
		File dir = new File("E:\\Test");
		showDir(dir);
	}
	public static void showDir(File dir)
	{
		System.out.println(dir);
		File[] files = dir.listFiles();
		for(int x = 0; x<files.length; x++)
		{
			if(files[x].isDirectory())
				showDir(files[x]);
			else 
				System.out.println(files[x]);//也可以使用files[x].toString()
		}
	}
}
输出结果:

E:\Test
E:\Test\1 - 副本 (5).txt
E:\Test\1 - 副本.txt
E:\Test\1.txt
E:\Test\新建文件夹
E:\Test\新建文件夹\新建 Microsoft Word 文档 - 副本 (2).doc
E:\Test\新建文件夹\新建 Microsoft Word 文档 - 副本.doc
E:\Test\新建文件夹\新建 Microsoft Word 文档.doc
E:\Test\新建文件夹 - 副本
E:\Test\新建文件夹 - 副本 (2)

6、将一个指定目录下的txt文件的绝对路径,存储到一个文本文件中
思路:
a、 对指定的目录进行递归
b、 获取递归过程中所有的java文件的路径
c、 将这些路径存储到集合中
d、 将集合中的数据写入到一个文件中


public class HelloDemo {
	public static void main(String[] args) throws Exception {
		File dir = new File("E:\\Test");
		List<File> list = new ArrayList<File>();//list存储File对象
		fileToList(dir, list);
		System.out.println(list.size());
		File file = new File(dir, "javalist.txt");//这个方法可以在dir目录下创建一个"javalist.txt"示例
		writeToFile(list, file.toString());
	}

	// fileToList可以遍历这个目录下所有的文件和文件夹及其子文件夹下所有文件,然后添加到List容器内
	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(".txt"))
					list.add(file);
			}
		}
	}
	//该方法可以将list里的元素写入文本中
	private static void writeToFile(List<File> list, String javaListFile) throws IOException {
		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 e;
		} finally {
			try {
				if (bufw != null)
					bufw.close();
			} catch (IOException e) {
				throw e;
			}
		}
	}
}

第十三部分:打印流

1、打印流:提供了打印方法,可以将各种数据类型的数据原样打印。
2、打印流分为:
a、字节打印流PrintStream。
构造函数可以接收的参数类型:
file对象 File
字符串路径 String
字节输出流 OutputStream
b、字符打印流PrintWriter
构造函数可以接收的参数类型
file对象 File
字符串路径 String
字节输出流 OutputStream
字符输出流 Writer
应用:web开发中最常用,例如将信息打印到客户机中
需要注意的是:
在构造函数中如果传入参数true,则不需要flush方法,而且配合println方法使用。
如果要写入”a.txt“文件中,需要自动刷新的话传入参数true
PrintWriter(new FileWriter("a.txt"),true)
如果想要使用缓冲的话:
PrintWriter(new BufferedWriter(new FileWriter("a.txt")),true)
3、需求:从键盘录入,在控制台输出


public class HelloDemo {
	public static void main(String[] args) throws Exception {
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

		PrintWriter out = new PrintWriter(System.out, true);// 设置为true,则flush()方法不需要,需要配合println方法

		String line = null;
		while ((line = bufr.readLine()) != null) {
			if ("over".equals(line))
				break;
			out.println(line.toUpperCase());
			// out.write(line.toUpperCase());不带自动换行,上面那句带换行
			// out.flush();
			// 如果不用flush方法,则PrintWriter(System.out,true);
		}
		out.close();
		bufr.close();
	}

}

第十四部分:合并流

1、SequenceInputStream:序列流,对多个流进行合并操作。多个源对应一个操作。
2、需求:建立三个文件数据,变成一个数据。
思路,要使用到Vector集合和枚举器,使用的是FileInputStream流。然后调用read方法。
class  
{
	public static void main(String[] args)throws IOException
	{
		Vector<FileInputStream> v = new Vector<FileInputStream>();
		v.add(new FileInputStream("d:\\1.txt"));
		v.add(new FileInputStream("d:\\2.txt"));
		v.add(new FileInputStream("d:\\3.txt"));
		Enumeration<FileInputStream> en = v.elements();
		//关键句,传入的参数是枚举器对象
		SequenceInputStream sis = new SequenceInputStream(en);
		FileOutputStream fos = new FileOutputStream("d:\\4.txt");
		byte[] buf = new byte[1024];
		int len = 0;
		while((len=sis.read(buf))!=-1)
		{
			fos.write(buf,0,len);//输出结果是1、2、3三个文本数据合并到4.txt
		}
		fos.close();
		sis.close();
	}
}
3、切割文件
class 
{
	public static void main(String[] args)
	{
		splitFile();
	}
	//合并
	public static void merge()
	{
		ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
		for(int x=1;x<=3;x++)
		{
			al.add(new FileInputStream("c:\\a\\"+x+".part"));
		}

		final Iterator<FileInputStream> it = al.iterator();
		Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
		{
			public boolean hasMoreElements()
			{
				return it.hasNext();
			}
			public FileInputStream nextElements()
			{
				return it.next();
			}
		}

		SequenceInputStream sis = new SequenceInputStream(en);
		FileOutputStream fos = new FileOutputStream("c:\\1.bmp");
		byte[] buf = new byte[1024];
		int len = 0 ;
		while((len=sis.read(buf))!=-1)
		{
			fos.write(buf,0,len);
		}
		fos.close();
		sis.close();
	}
	//切割文件
	public static void splitFile()throws IOException
	{
		//关联文件
		FileInputStream fis = new FileInputStream("d:\\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("d:\\a\\"+(count++)+".part");
			fos.write(buf,0,len);
			fos.close();
		}
		fis.close();
	}
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值