Java中的IO流基础(2)

               今天我们我们继续昨天的学习内容。

一.获取子目录中的内容

package com.java.IO;

import java.io.File;

public class FileDemo6 {
     public static void main(String[] args) {
	       /*获取指定目录下的文件(包括子目录下)
	        *用的是递归,在方法内部调用本方法。
	        */
    	   File file=new File("F:\\eclipse-workspace\\IOStream");
    	   getAllFile(file);
   }
     public static void getAllFile(File file) {
    	   File[] files=file.listFiles();
    	   for(File file1:files) {
    		   if(file1.isDirectory()) {
    			   getAllFile(file1);
    		   }else {
    			   System.out.println(file1);
    		   }
    	   }
     }
}
/*
 * F:\eclipse-workspace\IOStream\.classpath
   F:\eclipse-workspace\IOStream\.project
   F:\eclipse-workspace\IOStream\.settings\org.eclipse.jdt.core.prefs
   F:\eclipse-workspace\IOStream\1.txt
   F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo.class
   F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo2.class
   F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo3.class
   F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo4.class
*/

二.递归

               上述代码用到了递归方式,在来总结一下递归操作。

package com.java.IO;

public class FileDemo7 {
     public static void main(String[] args) {
		int sum=sum(10);
		System.out.println("sum="+sum);   //   sum=55
	}
     public static int sum(int end){
    	if(end==1) {
    	   return end;
    	}else {
    		return end+sum(end-1);
    		/*分析这段代码        return end+sum(end-1);
    		 * return  3 + sum(2)
    		 *             2 + sum(1)
    		 *                  +   1
    		 *在用递归的时候,在递归到最后面要有一个确定的返回值,
    		 *然后返回这个返回值,并将递归方法依次出栈。                 
    		 * */
    	}	
     }
}

三.删除目录

package com.java.IO;

import java.io.File;

public class FileDemo8 {
          public static void main(String[] args) {
        	  File file=new File("f:\\io");
			  deleteAll(file);
		}
          //利用递归在进行删除操作
          public static void deleteAll(File file) {
        	  File[] files=file.listFiles();
        	      for(File file1:files) {
        	         if(file.isDirectory()) {
        		          deleteAll(file);
        	            }
        	           file1.delete(); //删除文件
                  }
        	       file.delete();   /*删除文件夹,这个删除是用的递归,这个删除方法实在该for循环的内部。当完成后,
        	                         *执行外部的for循环,这个有点难理解
        	                        */
          }
}

四.字节输出流FileOutputStream

                 流按操作数据分为 字节流和字符流,按流的走向分为 输入流和输出流。其中输入和输出是以内存为参照的,

向内存输入数据,为输入流(读操作)。从内存输出数据,为输出流(写操作)。

                 字节流的抽象基类:InputStream 和 OutputStream。字符流的抽象基类:Reader 和 Writer。注意,由这4个

类派生出来的子类,其子类的后缀名都是父类名,如,InputStream 的子类 FileInputStream。

                 字节输入流InputStream,该抽象类是所有   字节输入流 的超类。

                 字节输出流OutputStream,该抽象类是所有   字节输出流 的超类。

                 我们先来将一段文本写入到文件中,代码如下:

package com.java.IO;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDemo9 {
      public static void main(String[] args) throws IOException {
		//将一段文本写入到文件中,用文件输出流 FileOutputStream
    	File file=new File("f:\\5.txt");
    	/*
    	 if(!file.exists()) {
    		file.createNewFile();
    	}
    	*/
    	//定义要写入的数据
    	String str="乔你那熊色";
    	//将要写入的数据转换为字节数组
    	byte[] byte1=str.getBytes();
    	//用文件输入流将文件写到文件夹
    	FileOutputStream fileOutputStream=new FileOutputStream(file);
    	fileOutputStream.write(byte1);
    	/*上述代码要注意的是:如果目的文件不存在,那么文件输出流就会自动创建文件,
    	 *如果目的文件存在,就创建一个新文件覆盖。
    	 */
    	
    	
	}
}

                    这个代码忘记了一个最重要的部分,就是fileOutputStream.close();  关闭资源。如果资源不关闭,就会占用

系统资源,导致电脑运行越来越慢。

五.IOException的异常处理

                 在写io流的时候,会出现很多的异常,怎么处理这些异常呢?代码演示如下:

package com.java.IO;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDemo9 {
      public static void main(String[] args){
    	//IOException IO的异常处理(try-catch-finally)
    	File file=new File("f:\\6.txt");
    	String str="乔你那熊色";
    	byte[] byte1=str.getBytes();
    	FileOutputStream fileOutputStream=null;
		try {
			fileOutputStream = new FileOutputStream(file);
			fileOutputStream.write(byte1);
		} catch (IOException e) {
			throw new RuntimeException("文件写入失败" + e);
		}finally {
			try {
				if(fileOutputStream!=null){
					fileOutputStream.close();
				}
			} catch (IOException e) {
				throw new RuntimeException("关闭失败" + e);   //什么时候才能关闭失败呢?
			}
		}
    		
	}
}

六.文件续写和换行符

package com.java.IO;

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

public class FileDemo10 {
      /*文件内容的续写,我们在创建FileOutputStream对象的时候,无论是通过file对象还是
       *String 路径,这两种构造方法都有另一个参数append,将这个第二个参数append设为
       *true,就能够将续写。
       *这里还需要注意的是:如果只是用一个参数的构造器,那么当文件不存在时,创建文件,存在时
       *就用一个空的同名文件覆盖。  如果用两个参数的构造器,那么文件不存在时,创建文件,存在时
       *直接在以存在的文件续写
      */
	   //换行符常量
       private static final String LINE_SEPARATOR=System.getProperty("line.separator");
	   public static void main(String[] args) {
		//  static String a="aaa";  方法中不能有静态变量。
			File file=new File("f:\\9.txt");
	    	String str=LINE_SEPARATOR+"乔你那熊色";
	    	byte[] byte1=str.getBytes();
	    	FileOutputStream fileOutputStream=null;
			try {
				fileOutputStream = new FileOutputStream(file,true); //--------------两个参数的构造器
				fileOutputStream.write(byte1);
			} catch (IOException e) {
				throw new RuntimeException("文件写入失败" + e);
			}finally {
				try {
					if(fileOutputStream!=null){
						fileOutputStream.close();
					}
				} catch (IOException e) {
					throw new RuntimeException("关闭失败" + e);   //什么时候才能关闭失败呢?
				}
			}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41160264/article/details/81609054