IO流3(File類、Properties、遞歸、打印流、序列流)



一、File


         1.概述

                  文件和目錄路徑名的抽象表示形式,該類將文件或者文件夾封裝成對象,方便對文件與文件夾的屬性信息進行操作,File                     對象可以作爲參數傳遞給流的構造函數(流只操作數據); 

         2.構造方法

                 可以將已有的和未出現的文件夾或者文件封裝成對象;

                 File(String pathname);通過將指定路徑名字符串轉換爲抽象路徑名來創建一個新file示例,pathname-文件路徑名(字符串) 
                        例:File f1=new File(a.txt);

                 File(String parent,String child);parent-路徑名字符串,child-parent路徑下的文件; 
                       例:File d=new File(c:\abc,b.txt);

                File(File parent,String child);根據parent抽象路徑名和child路徑名字符串創建一個新File實例;parent-父抽象路徑名;child-                     子路徑名字符串; 
                       例:File f=new File(c:\abc)File f1=new File(f,c.txt);

         3.常用方法

                 1)創建
               boolean createNewFile();在指定位置創建文件,如果該文件已經存在,則不創建,返回false.
        和輸出流不一樣,輸出流對象一建立創建文件,而且文件已經存在,會覆蓋,
               boolean mkdik():創建文件夾。
               boolean mkdirs():創建多級文件夾。
                 2)刪除。
               boolean delete(); 刪除失敗返回false。
               void deleteOnExit(); 在程序退出時刪除指定文件。
                 3)判斷。
               boolean exists():文件是否存在。
               isFile();是否是文件
               isDirectory();是否是目錄
               isHidden();是否是隱藏文件
                      isAbsolute();是否爲絕對路徑名
                 4)獲取信息。
               getName();返回文件或目錄的名稱
               getPath();返回路徑名字符串
               getParent();返回父目錄路徑名
               getAbsolutePath();返回路徑名的絕對路徑名字符串
               lastModified();返回文件最後一次修改的時間
               length();返回文件的長度

class FileDmeo
{
	public static void main(String[] args) throws IOException
	{
		method_4();
		//consMethod();
	}
	public static void method_4()
	{
		File f = new File("e:\\java\\a.txt");

		sop("path:"+f.getPath());
		sop("abspath:"+f.getAbsolutePath());
		sop("parent:"+f.getParent());//該方法返回的是絕對路徑中的父目錄。如果獲取的是相對路徑,則返回null。
									//如果相對路徑中有上一層目錄,那麼該目錄就是返回結果。
	}
	public static void method_3()
	{
		File f = new File("file.txt");
		
		//記住在判斷文件對象是否是文件或者目錄時,必須要先判斷該文件對象封裝的內容是否存在。
		//通過exists判斷。
		sop("dir:"+f.isDirectory());
		sop("file:"+f.isFile());
	}
	public static void method_2()
	{
		File f = new File("file.txt");
		sop("exists:"+f.exists());

		//創建文件夾
		File dir = new File("e:\\java\\ab");

		sop("mkdir:"+dir.mkdir());
	}
	
	public static void method_1() throws IOException
	{
		File f = new File("e:\\java\\file.txt");

		//sop("create:"+f.createNewFile());
		sop("delete:"+f.delete());
	}
	//創建File對象
	public static void consMethod()
	{
		//將a.txt封裝成file對象。可以將已有的和未出現的文件或者文件夾封裝成對象。
		File f1 = new File("e:\\java\\a.txt");

		File f2 = new File("e:\\java","b.txt");
		
		File d = new File("e:\\java");
		File f3 = new File(d,"c.txt");

		sop("f1:"+f1);
		
		sop("f2:"+f2);
		
		sop("f3:"+f3);

		File f4 = new File("c:"+File.separator+"java"+File.separator+"zzz"+File.separator+"a.txt");//可以實現跨平臺
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);		
	}
}

FilenameFilter

             FilenameFilter是一個接口,用於抽象路徑名的過濾器,該接口僅有一個方法: 

             accept(File dir,String name)dir-文件所在目錄,name-文件的名稱 
             當且僅當該名稱包含在文件列表中時返回true,否則返回false實際應用中複寫該方法,例:

//列出a目錄下的所有.bmp文件;
File dir=new File("d:\\java10\\a");
String[] arr=dir.list(new FilenameFilter()
{
    public boolean accept(File dir,String name)
    {
        return name.endsWith(".bmp");
    }
});//匿名內部類創建FilenameFilter對象並複寫accept方法過濾.bmp文件;

二、遞歸

            

              函數自身直接或者間接的調用到了自身。
              一個功能在被重複使用,並每次使用時,參與運算的結果和上一次調用有關。這時可以用遞歸來解決問題。
              P.S.
             1.遞歸一定明確條件,否則容易棧溢出。
             2.注意一下遞歸的次數。

需求:對指定目錄進行所有內容的列出(包含子目錄中的內容),也可以理解爲深度遍歷。

import java.io.File;

public class FileListDemo{
	public static void main(String[] args){
			File dir = new File("D:\\Java\\jdk1.6.0_02\\include" );
			listAll(dir,0);
	}

	public static void listAll(File dir, int level){
			System.out.println(getSpace(level) + "dir:" +
			dir.getAbsolutePath());
			// 獲取指定目錄下當前的所有文件夾或者文件對象
			level++;
			File[] files = dir.listFiles();

			for (int x = 0; x < files.length; x++){
				if (files[x].isDirectory()){
					listAll(files[x],level);
				}
				System.out.println(getSpace(level) + "file:" +files[x].getAbsolutePath());
			}
	}

	private static String getSpace( int level){
			StringBuilder sb = new StringBuilder();

			sb.append( "|--" );
			for (int x = 0; x < level; x++){
				sb.append( "| " );
			}
			return sb.toString();
	}
 }



需求:利用遞歸求1到10的和。

public class DiGuiDemo{
	public static void main(String[] args){
			int sum = getSum(10);
			System.out.println(sum);
	}

	public static int getSum(int num){
			if(num == 1)
				return 1;
			return num + getSum(num - 1);
	}
 }


 Properties集合

         Map
                |--Hashtable
                |--Properties
         特點:
                1. 該集合中的鍵和值都是字符串類型。
                2. 集合中的數據可以保存到流中,或者從流中獲取。
                3. 通常該集合用於操作以鍵值對形式存在的配置文件。

示例:Properties集合的存和取。

import java.util.Properties;
import java.util.Set;

public class PropertiesDemo{
	   public static void main(String[] args){
		      propertiesDemo();
		}

		public static void propertiesDemo(){
			  //創建一個Properties集合
			  Properties prop = new Properties();

			  //存儲元素
			  prop.setProperty( "zhangsan","10" );
			  prop.setProperty( "lisi","20" );
			  prop.setProperty( "wangwu","30" );
			  prop.setProperty( "zhaoliu","40" );
 
			  //修改元素
			  prop.setProperty( "wangwu","26" );

			  //取出所有元素
			  Set<String> names = prop.stringPropertyNames();

			  for(String name : names){
					String value = prop.getProperty(name);
					System.out.println(name + ":" + value);
			  }
		 }
}



需求:獲取指定目錄下,指定擴展名的文件(包含子目錄中的),並且將這些文件的絕對路徑寫入到一個文本文件中。
簡單說:就是建立一個指定擴展名的文件的列表。


           思路:
                  1. 必須進行深度遍歷。
                  2. 要在遍歷的過程中進行過濾,將符合條件的內容都存儲到容器中。
                  3. 對容器中的內容進行遍歷並將絕對路徑寫入到文件中。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Test{
	public static void main(String[] args) throws IOException {
		File dir = new File("d:\\code" );
		FilenameFilter filter = new FilenameFilter(){
			public boolean accept(File dir,String name){
				return name.endsWith(".java" );
			}
		};

		List<File> list = new ArrayList<File>();
		getFiles(dir,filter,list);
		File destFile = new File(dir,"javalist.txt" );
		write2File(list,destFile);
	}
 /*
  對指定目錄中的內容進行深度遍歷,並按照指定過濾器,進行過濾。
  將過濾後的內容存儲到指定容器 List 中。
  */
		public static void getFiles(File dir,FilenameFilter filter,List<File>
list){
			File[] files = dir.listFiles();
 
			for(File file : files){
			// 遞歸
				if(file.isDirectory()){
					getFiles(file,filter,list);
				} else{
			// 對便利到的文件進行過濾器的過濾。將符合條件 File 對象,存儲到List 集合中
					if(filter.accept(dir,file.getName())){
						list.add(file);
					}
				}
		}
 }

  public static void write2File(List<File> list,File destFile) throws IOException{
			BufferedWriter bufw = null;
			try{
					bufw = new BufferedWriter(new FileWriter(destFile));
 
					for(File file : list){
						bufw.write(file.getAbsolutePath());
						bufw.newLine();
						bufw.flush();
					}
				} finally{
						if(bufw!=null)
							try{
									bufw.close();
								} catch(IOException e){
										throw new RuntimeException(" 關閉失敗 ");
								}
						}
				 }
  }



IO流中的其他流

       

         打印流
                        PrintWriter與PrintStream:可以直接操作輸入流和文件。
                        

                       PrintStream爲其他輸出流添加了功能,使它們能夠方便地打印各種數據值表示形式。
                       與其他輸出流不同,PrintStream永遠不會拋出IOException。
                       PrintStream打印的所有字符都使用平臺的默認字符編碼轉換爲字節。
                       在需要寫入字符而不是寫入字節的情況下,應該使用PrintWriter類。
            

                       PrintStream:
                               1. 提供了打印方法可以對多種數據類型值進行打印,並保持數據的表示形式
                               2. 它不拋IOException
                       構造函數,接收三種類型的值:
                              1. 字符串路徑
                              2. File對象

                              3. 字節輸出流

示例:

import java.io.PrintStream;

public class PrintStreamDemo{
	public static void main(String[] args) throws Exception {
		PrintStream out = new PrintStream("print.txt" );
 
		//write(int b)方法只寫最低8位
		out.write(97); //a
		//print方法將97先變成字符串保持原樣將數據打印到目的地
		out.print(97); //97
		out.close();
	}
}


                      PrintWriter:字符打印流
                      

                      構造函數參數:
                             1. 字符串路徑
                             2. File對象
                             3. 字節輸出流
                             4. 字符輸出流

示例:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.IOException;

public class PrintWriterDemo{
	public static void main(String[] args) throws IOException {
		BufferedReader bufr = new BufferedReader(new
		InputStreamReader(System.in));
		PrintWriter out = new PrintWriter(System.out);

		String line = null;
		while((line = bufr.readLine()) != null){
			if("over" .equals(line))
					 break;
			out.println(line.toUpperCase());
			out.flush();
		}

		out.close();
		bufr.close();
	}
}


                 

序列流
        SequenceInputStream:對多個流進行合併。


需求:將1.txt、2.txt、3、txt文件中的數據合併到一個文件中。

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

public class SequenceInputStreamDemo{
	public static void main(String[] args) throws Exception {
		Vector<FileInputStream> v = new Vector<FileInputStream>();

		v.add( new FileInputStream("1.txt" ));
		v.add( new FileInputStream("2.txt" ));
		v.add( new FileInputStream("3.txt" ));

		Enumeration<FileInputStream> en = v.elements();

		SequenceInputStream sis = new SequenceInputStream(en);

		FileOutputStream fos = new FileOutputStream("4.txt" );

		byte[] buf = new byte[1024];
		int len = 0;

		while((len = sis.read(buf)) != -1){
			fos.write(buf,0,len);
		}

		fos.close();
		sis.close();
	}
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章