一、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);
}
}
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();
}
}