天天看点

file类,递归,io流File类递归IO流

文章目录

  • File类
    • 构造方法:
    • File类的创建功能:
    • File类的删除功能
    • 重命名功能:
    • File的判断功能
    • File类的获取功能
      • 基本获取功能
      • 高级获取功能
    • 高级获取功能
  • 递归
  • IO流
    • BufferedInputStream
    • BufferedOutputStream
    • 字符流
    • InputStreamReader
      • OutputStreamWriter:字符输出流(字符流通向字节流的桥梁):转换流
      • FileReader/FileWriter ---继承自InputStreamReader/OutputStreamWriter
      • BufferedReader
      • BufferedWriter
    • 内存操作流:操作临时数据

File类

构造方法:

  • public File(String pathname):里面当前文件夹/文件的路径 (推荐方式)
  • public File(String parent,String child):parent的字符串路径名和child的字符串路径名构造一个File
  • public File(File parent,String child):参数1:需要描述parent的字符串路径名和子文件字符串路径名:构造一个File

File类的创建功能:

  • public boolean createNewFile()throws IOException:创建文件
  • public boolean mkdir():创建目录(文件夹):如果存在该文件夹,返回值false
  • public boolean mkdirs():
  • 创建目录(文件夹):创建多级目录,如果父目录不存在,会自动创建!
               
  • 如果描述文件或者文件夹没有指定盘符,相对路径:默认是当前项目路径下

File类的删除功能

  • public boolean delete():删除目录/文件,
               
  • 如果删除的是目录,那么前提条件:目录必须为空

重命名功能:

  • 针对某个文件操作
  • public boolean renameTo(File dest):
  • 需求:将当前项目下的高圆圆.jpg — 杨桃.jpg
  • 情况1:
  • 当前文件的路径和该名后的路径相同,仅仅是改名字
               
  • 情况2:
  • 当前文件的路径名和该后面的路径名不相同,剪切并重命名
               

File的判断功能

  • public boolean isFile():判断是否是文件
               
  • public boolean isDirectory():判断是否是文件夹(目录)
               
  • public boolean canRead():判断是否可读
               
  • public boolean canWrite():判断是否可写
               
  • public boolean exists():判断所file表示的文件/目录是否存在
               
  • public boolean isAbsolute():判断是否是绝对路径
               
  • public boolean isHidden():判断是否是隐藏文件
               

File类的获取功能

  • 基本获取功能

  • public String getAbsolutePath():获取绝对路径名
  • public String getPath():当前文件所表示的路径
  • public long length():获取文件长度
  • public long lastModified():获取当前文件最后一次修改的时间(long:毫秒值)
               

高级获取功能

  • public File[] listFiles():获取的是某个盘符下/目录File数组(目录中的文件)
  • public String[] list():获取某个盘符/目录的下的所有文件以及目录的字符串数组
    分析:
     * 	1)描述下d盘符			d:\\		
     * 	 File类描述
     * 
     *  2)获取当前盘符下所有的文件/文件夹所表示字符串数组/目录下的文件的File数组
     *  3)判断如果当前字符串数组或者File数组不为空,遍历获取到每一个文件/目录
     *  4)判断当前file是否是表示的文件
     *  		再次判断是否以".jpg"结尾---->String --> endsWith(".jpg")
     *  5)输出即可!
               
    public class FileTest {
    	
    	public static void main(String[] args) {
    		
    		//描述下d盘符			d:\\	
    		File file = new File("d:\\") ;
    		//System.out.println(file);
    		
    		//public File[] listFiles()
    		File[] fileArray = file.listFiles() ;
    		//防止空指针
    		if(fileArray!=null) {
    			//遍历
    			for(File f:fileArray) {
    				//System.out.println(f);
    				//判断f对象是否描述的文件
    				if(f.isFile()) {
    					//是文件
    					//还需要判断:当前文件是否以.jpg结尾
    					if(f.getName().endsWith(".jpg")) {
    						//是以.jpg结尾
    						//输出
    						System.out.println(f.getName());
    					}
    				}
    				
    			}
    		}
    	}
    }
               

    高级获取功能

    ​ public String[] list(FilenameFilter filter)

    ​ public File[] listFiles(FilenameFilter filter)

    在调用这个方法的时候,列表已经获取到了
     *  	FilenameFilter:文件名称过滤器
     *  			抽象方法:
     *  	public class FileTest2 {
    	
    	public static void main(String[] args) {
    		
    		
    		//描述一下D盘
    		File file = new File("D:\\") ;
    		
    		//public File[] listFiles(FilenameFilter filter):高级功能:获取file表示的目录中文件的File数组
    			//参数为:文件名称过滤器
    		File[] fileArray = file.listFiles(new FilenameFilter() {
    			
    			@Override
    			public boolean accept(File dir, String name) {
    				//return false;
    				//业务:
    				/**
    				 * "所有的以".jpg"结尾的文件!"
     *  					dir表示是否文件
     *  					name是否"以.jpg结尾"
    				 */
    				/*
    				 File file = new File(dir,name) ;
    				boolean flag1 = file.isFile() ; //true:是文件
    				boolean flag2 = name.endsWith(".jpg") ;//true:文件名称是以.jpg结尾
    				//System.out.println(name);
    				return flag1 && flag2 ;
    				*/
    				//一步走:
    				return new File(dir,name).isFile() && name.endsWith(".jpg") ;
    			}
    		}) ;
    		
    		//遍历File数组
    		if(fileArray!=null) {
    			for(File f:fileArray) {
    				System.out.println(f.getName());
    			}
    		}
    	
    	}
    }
    		boolean accept(File dir,String name):是否将文件添加到文件列表中
     *  			返回值为true:添加到指定文件列表中;		
     *  				方法业务:根据具体的情况判断
     *  					"所有的以".jpg"结尾的文件!"
     *  					dir表示是否文件
     *  					name是否"已.jpg结尾"
               

    递归

    什么是方法递归呢?
     * 	方法递归:
     * 		就是方法本身调用方法一种现象!
     * 
     * Math.max(10,Math.max(40,70)) ; 方法嵌套方法
     * 举例:	
     * 	伪代码
     * 		public void show(int n){ //10
     * 			//出口条件(方法结束条件)
     * 			if(n<0){
     * 
     * 				
     * 				System.exit(0) ;//Java虚拟机终止了
     * 			}
     * 			System.out.println(n) ;
     * 			show(n--)  ;
     * 		}
     * 
     * 递归:
     * 		1)必须定义一个方法:方法调用方法
     * 		2)满足一定的规律
     * 		3)方法必须有出口条件(结束条件)--->否则:就是死递归!
     * 		
     *
     *注意事项:
     *		构造方法不存在递归!
               
需求
 * 		需要删除带内容的目录
 * 		删除当前项目下:demo文件夹
 * 
 * 分析:
 * 		1)描述下当前demo文件夹:File file = new File("demo") ;
 * 		2)定义一个方法:delete(file) 递归删除的方法(删除目录)
 * 			2.1)高级获取功能:获取当前file所表示的文件以及文件夹的File数组[]
 * 			2.2)判断当前File数组不为空
 * 					判断当前file是否是文件夹 isDirectory()
 * 						是文件夹,回到2)步继续调用
 * 
 * 					不是文件夹,是文件
 * 						直接删除:调用delete()删除(查看删除的是
 * 那个文件:获取文件名称)
 * 						
 *				2.3)删除文件夹:调用delete()删除当前空目录
           
public class Test3 {
	
	public static void main(String[] args) {
		
		//1)使用File 描述当前项目下的demo文件夹
		File srcFile = new File("demo") ;
		
		//2)定义一个删除目录的方法
		delete(srcFile) ;
	}
	
	private static void delete(File srcFolder) {
		//获取srcFolder文件夹下面的所有文件以及文件夹的File数组
		File[] fileArray = srcFolder.listFiles() ;
		if(fileArray!= null) {
			//遍历
			for(File file :fileArray) {
				//获取到每一个file对象,判断当前是否是文件夹
				if(file.isDirectory()) {
					//回到2)进行递归删除
					delete(file);//aaa  bbb ccc
				}else {
					//不是文件夹,直接删除
					System.out.println(file.getName()+"---"+file.delete());
				}
			}
			//删除目录
			System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
		}
		
	}
}
           

IO流

IO流
 * 	在设备之间进行数据传输的操作!
 * 	
 * 按流的方向划分:
 * 		输入流
 * 		输出流
 * 
 * 按流的类型划分
 * 		字节流
 * 
 * 				字节输入流:InputStream
 * 				字节输出流:OutputStream
 * 		字符流
 * 				字符输入流:Reader
 * 				字符输出流:Writer
 * 
 * 字符流是在字节输入流之后出现的,解决了中文乱码问题!  
 * 一般情况:针对某个文本文件进行读写复制操作: 优先采用字符流 (使用记事本打开并且能读懂!)
 * 
 * 字节流 
 * 		
 * 				字节输入流:InputStream
 * 				字节输出流:OutputStream
 * 
 * 两个抽象类,不能直接实例化,提供了一些具体的子类
 * 			XXXInputStream
 * 			XXXOutputStream
 * 	都是字节输入流和字节输出流的子类
 * 	
 * 需求:需要在当前项目下输出文件:fos.txt文件,并同时输出内容:"hello,OutputStream"
 * 		
 * FileOuputStream:针对文件操作:文件输出流(文件字节输出流)
 * public FileOutputStream(String name):
 * public FileOutputStream(File file)
 * 推荐使用第一种:直接跟当前的具体路径!

 * 使用步骤
 * 	1)创建OutputStream字节输出流对象,同时指向某个文件路径
 * 	2)写数据:给文件中写入内容
 *  3)关闭相关的系统资源
           
文件字节输入流:FileInputStream
 * 
 * 构造方法
 * public FileInputStream(String name)throws FileNotFoundException
 * 读数据
 * 		public abstract int read():一次读取一个字节
 * 		public int read(byte[] b) throws IOException:一次读取一个字节数组
 * 
 * 使用步骤
 * 	1)创建FileInputStream对象:指向哪个文件
 * 	2)读数据 :public abstract int read():读取一个字节
 * 		展示结果
 * 	3)关闭资源
           
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 
 * 读写复制操作
 * 
 * 在d盘下有一个FileInputStreamDemo.java文件的内容
 * 
 * 
 * 复制到当前项目路径下:Copy.java文件中
 * 
 * 分析:
 * 	1)封装d盘的文件FileInputStreamDemo.java ---源文件
 * 		使用输入流读取FileInputStreamDemo.java文件的内容
 * 
 * 	2)封装目标文件:当前项目下:Copy.java 
 * 		使用文件字节输出流写数据,将上面的内容复制进来!
 * 
 * 	3)两种方式
 * 			要么1)一次读取一个字节
 * 			要么2)一次读取一个字节数组
 * 
 * 
 * 复制图片文件/视频文件...
 * 
 * 
 *
 */
public class CopyFileDemo {
	
	public static void main(String[] args) throws IOException {
		
		//封装d盘的文件FileInputStreamDemo.java ---源文件
		//创建字节文件输入流对象
		FileInputStream fis = new FileInputStream("d:\\FileInputStreamDemo.java") ;
		
		//封装目标文件:当前项目下:Copy.java 
		FileOutputStream fos = new FileOutputStream("Copy.java") ;
		
		/*
		//读写复制操作
		//方式1):1次读取一个字节
		int by = 0 ;
		while((by=fis.read())!=-1) {
			//读一个字节,写一个字节到fos流对象中
			fos.write(by);
		}
		*/
		
		//方式2:一次读取一个字节数组
		//定义一个数组
		byte[] bytes = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bytes))!=-1) {
			//写一个字节数组:从0开始,写入实际字节数
			fos.write(bytes, 0, len);
		}
		
		//释放资源
		fos.close();
		fis.close();
	}
}

           

BufferedInputStream

  • BufferedInputStream extends InputStream:字节缓冲输入流
  • 构造方法
  • BufferedInputStream(InputStream in)

BufferedOutputStream

  • BufferedOutputStream extends OutputStream:字节缓冲输出流
  • 构造方法
  • public BufferedOutputStream(OutputStream out)
  • 创建一个缓冲输出流对象,默认缓冲区大小
  • 目前:当前缓冲流只是在流中提供了byte[] 缓冲区,默认足够大,一般通过带一个参的构造方法创建!
  • 只是提供缓冲区,具体文件读写复制操作还是需要用底层流(InputStream/OutputStream)

字符流

InputStreamReader

InputStreamReader:字符输入流 (字符流通向字节流的桥梁)字符转换输入流

*

  • 构造方法:
  • public InputStreamReader(InputStream in):使用默认字符集进行解码(gbk格式)
  • public InputStreamReader(InputStream in, String charsetName)
  • 使用指定的字符集进行解码
  • 成员方法:
  • 读的功能
  • public int read():读单个字符
  • public int read(char[] cbuf):读字符数据
  • public int read(char[] cbuf,int offset,int len)读字符数组的一部分

OutputStreamWriter:字符输出流(字符流通向字节流的桥梁):转换流

  • 构造方法
  • public OutputStreamWriter(OutputStream out):gbk格式 使用默认字符集进行编码的字符输出流
  • public OutputStreamWriter(OutputStream out, Charset cs)
  • 使用指定的字符集构造出一个字符输出流
  • 成员方法
  • public void write(int c):写入单个字符
               
  • public void write(char[] cbuf):写入字符数组
               
  • public abstract void write(char[] cbuf,int off,int len) 写入字符数组的一部分
               
  • public void write(String str):写入字符串内容
               
  • public void write(String str,int off,int len):写入字符串一部分
               
  • flush()和close()
  • 一个刷新流:将缓冲的数据刷新出来(中文:默认gbk格式:一个中文对两个字节),流刷新之后还可以
  • 继续写入数据;
  • close()方法:将跟该流相关的系统资源释放掉,
  • 不再指向当前操作的文件,关闭之后不能再写入数据否则出现IOException

为了简化字符流读写复制操作:

*

  • 提供了字符转换输入流和字符转换输出流的便捷类
  • FileReader/FileWriter —继承自InputStreamReader/OutputStreamWriter

  • FileReader(String pathname)
  • FileWriter(String pathname)

BufferedReader

  • BufferedReader:字符缓冲输入流
  • 构造方法
  • BufferedReader(Reader r):构造一个字符缓冲输入流提供默认缓冲区大小
  • 特有功能:
  • public String readLine():一次读取一行内容,当读取到\n(换行了),就终止!
  • *Scanner(InputStream in)

    *BufferedReader(Reader r):可以作为键盘录入(使用流的方式)

BufferedWriter

  • BufferedWriter:字符缓冲输出流
  • 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
  • public BufferedWriter(Writer out):构造一个缓冲输出流,默认缓冲区大小
  • 成员方法
  • 特有功能
  • public void newLine():写入行的分隔符(换行)
               
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * 
 * 键盘录入:
 * 
 * 1)Scanner(InputStream in)
 * 2)BufferedReader(Reader r):可以作为键盘录入(使用流的方式)
 *
 *
 */
public class Demo {
	
	public static void main(String[] args) throws IOException {
		
		/*
		Scanner sc = new Scanner(System.in) ;
		
		System.out.println("请您输入String数据:");
		String str = sc.nextLine() ;
		System.out.println(str);
		*/
		
		//使用BufferedReader(Reader r):可以作为键盘录入
		/*
		//分步走
		InputStream in = System.in ;
		
		//创建Reader流对象
		Reader r = new InputStreamReader(in) ; //字符转换流:通向字节流的桥梁
		
		//创建BufferedReader流对象
		BufferedReader br = new BufferedReader(r) ;
		*/
		
		//一步走
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in)) ;
		
		System.out.println("请您输入一个数据:"); //"100" 数字字符串
		//利用BufferedReader:的readLine()读取一行数据
		String line = br.readLine() ; 	//"100"
		//String---int: Integer.parseInt(String str)
		int num = Integer.parseInt(line) ;
		System.out.println("您录入的字符串是:"+num);
		
		
	}
}

           
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 使用BufferedReader/BufferedWriter:读写复制操作:文本文件复制
 * 利用特有功能(一种新的方式)
 * 
 * 项目下的Demo.java---复制到D盘下:a.java文件中
 * 使用BufferedReader:字符缓冲输入流的readLine():一次读取一行
 * 使用BufferedWriter:newLine()可以实现换行
 * 
 * 总结针对文本文件的复制操作:
 * 		InputStreamReader/OutputStreamWriter:一次读取一个字符
 * 		InputStreamReader/OutputStreamWriter:一次读取一个字符数组
 *  (同上)
 * 		FileReader/FileWriter一次读取一个字符
 * 		FileReader/FileWriter一次读取一个字符数组
 * 
 * 		BufferdReader/BufferedWriter:一次读取一个字符
 * 		BufferdReader/BufferedWriter:一次读取一个字符数组
 * 		BufferedReader/BufferedWriter:一次读取一行
 * 
 * 		
 * 
 */
public class Test {
	public static void main(String[] args) throws IOException {
		
		//封装源文件
		BufferedReader br = new BufferedReader(new FileReader("Demo.java")) ;
		//封装目标文件
		BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a.java")) ;
		
		
		//读写
		String line = null ;
		while((line=br.readLine())!=null) {
			//读一行,bw写一行
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		
		//释放资源
		bw.close();
		br.close();
	}

}

           
  • 内存操作流:操作临时数据

  • ByteArrayOutputStream:内存操作输出流
  • 构造方法:
  • public ByteArrayOutputStream(){}:构造一个默认的缓冲大小的输出流对象
  • 成员方法
  • public byte[] toByteArray():将内存操作输出流中流对象—数组格式
  • ByteArrayInputStream:内存操作输入流
  • 构造方法:
  • public ByteArrayInputStream(byte[] buf):使用指定的字节数组作为缓冲区,构造
               

dReader(new FileReader(“Demo.java”)) ;

//封装目标文件

BufferedWriter bw = new BufferedWriter(new FileWriter(“D:\a.java”)) ;

//读写
	String line = null ;
	while((line=br.readLine())!=null) {
		//读一行,bw写一行
		bw.write(line);
		bw.newLine();
		bw.flush();
	}
	
	//释放资源
	bw.close();
	br.close();
}
           

}

* ## 内存操作流:操作临时数据
 * ByteArrayOutputStream:内存操作输出流
 * 构造方法:
 * 	public ByteArrayOutputStream(){}:构造一个默认的缓冲大小的输出流对象
 * 	成员方法
 *  public byte[] toByteArray():将内存操作输出流中流对象---数组格式
 * 	
 * ByteArrayInputStream:内存操作输入流
 * 构造方法:
 * 		public ByteArrayInputStream(byte[] buf):使用指定的字节数组作为缓冲区,构造
 * 内存操作输入流