黑马程序员_IO流(二)

本文详细探讨了Java IO流与File类的基本概念、常用方法及应用实例,包括文件操作、目录管理、文件属性获取等核心功能。通过实际代码示例,展示了如何高效地进行文件和目录的创建、读写、遍历与删除操作,以及如何利用File类封装文件和目录对象以简化复杂的文件系统交互。同时,介绍了Properties文件的使用,展示了如何将其作为配置文件和持久化存储设备。此外,还涉及了字符打印流与字节打印流的特性与用法,以及SequenceInputStream的整合多个流的功能。本文旨在提供全面的Java IO流与File类的实践指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


IO流(二)


File类

File的概述:

操作数据源的时候,大多的数据源都是来自文件或者文件夹,上次说到文件名可以通过字符串直接传入,但是这样一来得到的就是只有文件里面的数据流,有时候需要用到文件的属性等,想要得到文件的属性,就要用的将文件封装成为对象,通过文件对象,就可以访问到文件的属性。

①用来将文件或者文件夹封装成为对象

②方便对文件或者文件夹的属性信息进行操作

③File类对象可以作为参数传递给IO流

下面了解一些常用方法:

File类的构造方法:

File(String parent ):通过给定的抽象路径得到文件对象

File(String parent,String child):通过parent字符串和child字符串的结合得到文件路径,创建File类对象

File(File parent ,String child):在得到在文件或者文件夹的对象下,将child文件或者文件夹封装成为File类对象

例子:

package cn.itheima.IO;

import java.io.File;

public class FileDmeo1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//封装一个相对路径,封装的路径是什么,得到的对象的路径就是什么
		//这里封装的到的对象是:test.txt
		File file1 = new File("test.txt");
		//这个构造函数和第一个其实差不多,他就是把两个字符串连接起来,再进行创建File对象
		File file2 = new File("D:\\javaProject\\Itheima","test.txt");
		//先得到想要封装的文件或者文件夹的上级目录,封装成为对象
		File file = new File("D:\\javaProject\\Itheima");
		//传入将要封装的文件或者文件夹的父目录的对象,在该对象和字符串创建File对象
		File file3 = new File(file,"test.txt");
		
		System.out.println(file);
		System.out.println(file1);
		System.out.println(file2);
		System.out.println(file3);
		//得到的结果
//		D:\javaProject\Itheima
//		test.txt
//		D:\javaProject\Itheima\test.txt
//		D:\javaProject\Itheima\test.txt

	}

}

File类常见方法:

CreatNewFile():在指定的位置创建文件,如果文件不存在,创建,反之,创建失败,和IO不同,IO流创建文件的时候文件存在就会覆盖该文件

delete():删除文件或者文件夹,删除的文件若不存在则反回false,有文件,只能删除一次

delteOnExit():在程序退出时删除指定文件,

exitsts():判断文件是否存在,在判断文件的各种属性的时候,应该先判断文件对象封装的类容是否存在。

isDirectory():判断是否是目录文件

isAbsolute():判断封装的路径是否为绝对路径

lastModified():文件的最后修改时间

getPath():File类封装的路径,封装的是什么路径,得到的就是什么样的路径

getAbsolutePath():获得封装的文件路径的绝对路径

getParent():获取封装文件的上一级目录,如:File file = new File("test.txt");得到的父目录为null,File file = new File("abc\\test.txt");得到的父目录的值为abc

renameTo(new File):改变文件名,参数中还可以指定改变后文件的名字以及改变后的文件存储的位置


文件目录:

listRoots():列出可用的文件系的根,也就是列出本机盘符

list():  打印指定目录下的文件夹或者文件名称(包含隐藏文件),调用list()的File对象必须是封装了一个目录,且该目录必须存在。

lsit(FilenameFilter f);过滤文件,只需要自己想要的文件,比如说获取某一个文件夹下面的.java文件,实现FilenameFilter接口,并覆盖实现accept方法

listFiles();得到当前文件夹下面的所有文件或者文件的对象,返回的一个Fiel数组

例子:

package cn.itheima.IO;

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

public class listRootsDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		//getRoots();
		//getlist();
		//getJavaFile1();
		//getJavaFile();
		getlistFiles();
	}

	private static void getlistFiles() {
		// TODO Auto-generated method stub
		File file = new File("D:\\javaProject\\Itheima");
		File[] fi=file.listFiles();
		for(File f : fi){
			System.out.println(f);
		}
		
	}

	private static void getJavaFile() {
		// TODO Auto-generated method stub
		   File file = new File("D:\\javaProject\\Itheima");
		   if(file.length()==0){
			   return;
		   }
		   String[] str = file.list(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				return name.endsWith(".java");
			}
		});
		   for(String s:str){
			   System.out.println(s);
			   
		   }
		
	}

	//自定义:得到指定文件路径下的.java文件
	private static void getJavaFile1() throws IOException{
		// TODO Auto-generated method stub
	   File file = new File("D:\\javaProject\\Itheima");
	   if(file.length()==0){
		   return;
	   }
	  
	   String[] str = file.list();
	   for(String s : str){
		   if(s.endsWith(".java"))
			   System.out.println(s);
		  
	   }
		
	}

	private static void getlist() {
		// TODO Auto-generated method stub
		File file = new File("c:\\");
		//当前目录下的所有文件,包含隐藏文件,必须是封装一个目录,若果封装的是一个文件,产生异常,
		//如果目录下没有文件,返回null
		String[] str =file.list();
		for(String s : str){
			System.out.println(s);
		}
		
	}

	private static void getRoots() {
		//listRoots获取本机中盘符
		File[] files = File.listRoots();
		for(File file : files){
			System.out.println(file);
		}
	}

}

得到一个文件夹里面的所有内容,输入在打印台上,然后删除这个文件夹

思路:

得到文件里面所有的信息:如果文件夹下面还有文件夹,得判断文件夹下面是否有文件夹,知道文件夹下面的只是文件,这里就要使用到递归思想

删除文件:再得到文件的前提,从最底层目录删除,依次向上删除,知道指定文件夹,也使用递归

下面是自己写的实例:

package cn.itheima.IO;

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

public class getAllFile {

	/**
	 *获取指定文件夹所有的内容
	 *并且删除此文件夹下所有内容:
	 *思路:从里向外删除,使用递归
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		String dir ="D:\\javascript";
		getAll(dir);
		
	}

	private static void getAll(String dir) throws IOException {
		File file = new File(dir);
		File[] files = file.listFiles();
		for(File f : files){
			//判断是否是文件夹
			if(f.isDirectory()){
				dir=f.getAbsolutePath();
				getAll(dir);
			}
			System.out.println(f.getName());
			f.delete();
		}
		file.delete();
	}

}



Properties使用:

properties是hashtable的子类,具备了Map集合的特点,里面存储都是键值对,是集合和IO技术想结合的集合容器,它可以作为配置文件使用,可作为持久化设备存储。

下面通过Property的一个实例来了解其用法和他所拥有的方法:

package cn.itheima.IO;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;



public class PropertiesDemo {

	/**
	 *
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		loadFile();
	
	}

	private static void loadFile() throws IOException{
		// TODO Auto-generated method stub
		//加载一个指定的文件,该文件里存储的是键值对,将其加载进Properties中
		//源:文件(硬盘)  操作字符流,使用Reader系列    目的:文件(硬盘)
		FileReader fr = new FileReader("test2.txt");
		
		//创建Properties对象
		Properties p = new Properties();
		
		//将流加载进Properties中
		
		p.load(fr);
		
	
		//改变其中某个key的值
		p.setProperty("zhangsan","98");
		System.out.println(p);
		//将Properties作为持久化存储设备
		
		FileWriter fw = new FileWriter("test3.txt");
		
		//Properties中的store是将Properties加载到指定的流中,参数二是一个注释,不被Properties所加载
		p.store(fw, "haha");
		
		fr.close();
		fw.close();
		
		
		
	}

}
Properties中的load方法理解:

读取相应的字符流信息,通过每次读取一行,在”=“处进行字符串的分隔,分隔得到的左面即为Properties的key值,右面为vaule值,经过setProperty(String key,String vaule)就可以将读取到的数据加入Properties中。其他的一些方法都很容易理解,这里就不做详细介绍了


PrintWriter(字符打印流)与PrintStream(字节打印流)类

两者都可以理解为打印流,就是为其他的流增加了一些功能,使其能够打印出数据的原样性,也可直接操作文件

PrintStream类构造函数可以接收的参数类型:①文件对象               PrintWriter类的构造函数可以接收的参数类型:  ① 文件对象        

                                                                          ②字符串路径                                                                                         ②字符串路径

                                                                         ③字节输出流                                                                                          ③字节输出流

                                                                                                                                                                                          ④Writer(字符输出流)

两者中都可以对基本数据类型进行直接的操作,writer接受的参数就可以决定对那一种类型的数据进行操作,都比较简单这里主要介绍PrintWriter中的几个现象

在PrintWriter的PrintWriter(OutputStream out, boolean autoFlush)构造函数中,可以通过设置autoFlush为true,在使用Println将数据打印出去的时候,就会

实现自动刷新,而不需指定flush,当要将数据写入文件的时候也是一样的,只是的注意OutputStream中要将文件封装成为一个字节输出流,autoFlush的值true即可


SequenceInputStream 类

可以将多个流对象整合成为一个流对象,它有两个构造函数,SequenceInputStream(InputStream s1,InputStream s2)接受两个流对象,先读取s1,再读取s2,

有三个以上的流对象的时候,就要使用SequenceInputStream(Enumeration<? extends InputStream> e)的构造函数,首先要将所有的流对象放入Enumeration中,

通过Vector可以将流对象加入Enumeration中,就可以将几个流合并成为一个流

借助实例理解:

package cn.itheima.IO;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

public class SequenceInputDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		Vector<FileInputStream> v = new Vector<FileInputStream>();
		v.add(new FileInputStream("test1.txt"));
		v.add(new FileInputStream("test2.txt"));
		v.add(new FileInputStream("test3.txt"));
		FileOutputStream fos = new FileOutputStream("demo.txt");
		Enumeration<FileInputStream> en= v.elements();
		SequenceInputStream s = new SequenceInputStream(en);
		byte[] buf = new byte[1024];
		int len=0;
		while((len=s.read(buf))!=-1){
			fos.write(buf,0,len);
		}
		s.close();
		fos.close();
	}

}

IO流还有一些相关的知识,将会写在下一次博客中






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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值