文件操作
一、文件類file
文件類(File)提供了一些方法可以用來操作文件和獲取文件的信息,包括:更改文件名、刪除文件、列出目錄下的文件以及文件對象屬性的描述信息等。(注意:Java把目錄當做一種特殊的文件來處理。)
二、構造方法
a) public File(String path);
b) public File(String path,String name);
c) public File(File parent,String chile);
例:
File file1=new File(“demo.txt”);//當前文件夾下的文件
File file2=new File(“c:/demo1.txt”);//絕對路徑
File file4=new File(“c:/example”,”demo.txt”);
目錄名 文件名
File file5=new File(file3,”demo.txt”);
File file6=new File(file3,”test”);
三、靜態常量
由於不同操作系統的文件分隔符以及路徑分隔符不同,因此,如果要獲取當前系統的文件和路徑的分隔符,可使用以下兩個靜態常量。
public static final char separatorChar;
public static final String separator;
例如,File file = new File("c:"+File.separator+"abc"+File.separator+"a.txt");
四、常用方法
1、訪問文件對象
public String getName() //返回文件對象名,不包含路徑名
public String getPath() //File對象中封裝的路徑是什麼,獲取的就是什麼
public String getAbsolutePath() //返回絕對路徑名,包含文件名
public String getParent() //返回父文件對象的路徑名,如果封裝的是相對路徑,返回null
public File getParentFile() //返回父文件對象
2、獲得文件屬性
public long length() //返回文件的字節長度
public boolean exists() //測試指定的文件是否存在
public long lastModified() //返回文件最後被修改的時間
3、文件操作
public boolean renameTo(Filedest) //文件重命名
public boolean delete() //刪除空目錄或文件
4、目錄操作
public boolean mkdir () //創建目錄,正常建立時返回true
public String[] list() //返回目錄中的所有文件名字符串
public File[] listFiles() //返回目錄中的所有文件對象
實例:列出指定目錄下的文件以及子文件夾中的文件。
分析:需要使用遞歸—方法自己調用自己。
注意:使用遞歸時,一定要有遞歸的終止條件,並且調用次數也不要過多,否則會出現內存溢出。
public void listDir(File dir){
//參數dir是一個File類型的對象,代表是要顯示的目錄
System.out.println(dir.getName()+"下的文件以及子目錄下的文件列表:");
File[] files=dir.listFiles();
for(int i=0;i<files.length;i++){
if(files[i].isFile())
System.out.println(files[i].getName());
else
listDir(files[i]);//遞歸調用
}
}
優化:
public String getLevel(int level){
StringBuilder sb = new StringBuilder();
sb.append("|--");
for(int x=0; x<level; x++){
sb.insert(0,"| ");
}
return sb.toString();
}
public void listDir(File dir,int level){
System.out.println(getLevel(level)+dir.getName());
level++;
File[] files = dir.listFiles();
for(int x =0; x<files.length; x++){
if(files[x].isDirectory())//如果遍歷到的是目錄。
listDir(files[x],level);//遞歸。
else
System.out.println(getLevel(level)+files[x].getName());
}
}
文件過濾器 FileFilter
FileFilter接口:用於抽象路徑名的過濾器。此接口的實例可傳遞給 File 類的 listFiles(FileFilter) 方法。
成員方法: boolean accept(File pathname)
測試指定抽象路徑名是否應該包含在某個路徑名列表中。
package file;
import java.io.*;
public class TestFileFilter {
public static void main(String[] args) {
File f=new File("f:\\aa");
MyFileFilter mff=new MyFileFilter("txt");
File[] files=f.listFiles(mff);
for(File f1:files){
System.out.println(f1.getName());
}
}
}
構造方法
package file;
import java.io.File;
import java.io.FileFilter;
public class MyFileFilter implements FileFilter {
String externName;
//通過構造函數設定好過濾器
public MyFileFilter(String externName){
this.externName=externName;
}
@Override
public boolean accept(File pathname) {//驗證是否符合過濾條件
// TODO Auto-generated method stub
if(pathname.isDirectory())
return false;
//不是目錄
String filename=pathname.getName();
int n=filename.indexOf(".");//找.的位置
if(n==-1||n==filename.length()-1)//.在字符串中沒有,返回false
return false;
if(filename.substring(n+1).equals(externName))
return true;
return false;
}
}
隨機文件操作 RandomAccessFile類
RandomAccessFile類可以對文件進行隨機讀寫操作。
1、構造方法—該對象只能對文件進行操作
RandomAccessFile(File file,String mode) ;
RandomAccessFile(String name,String mode);
注: r:只讀;rw:可讀可寫
例如:File file=new File(“d:\\mydata\\a.txt”);
RandomAccessFile rf=new RandomAccessFile( file,”rw”) ;
//
RandomAccessFile rfile=new RandomAccessFile(“d:\\lx\\a.txt”,”rw”);
2、讀寫數據的常用方法
讀、寫基本數據類型: readInt()、writeInt(int n)等;
讀、寫UTF字符串: readUTF()、writeUTF(String str);
讀取文件中的一行: readLine();
3、文件隨機讀寫流的讀取指針控制
long getFilePointer() ---得到當前的文件讀取指針。
void seek(long pos) ---把指針從開始移動到pos位置。
long length() ---得到文件的長度(有多少個字節) 。
void setLength(long newLength)
事例:
package file;
import java.io.*;
public class DemoRandomAccess {
//隨機訪問
public static void main(String[] args) throws IOException {
File f=new File("f:\\test.txt");
RandomAccessFile raf=new RandomAccessFile(f,"rw");
raf.writeInt(1234);
raf.writeDouble(1.235);
raf.seek(0);
int n=raf.readInt();
double d=raf.readDouble();
System.out.println(n);
System.out.println(d);
System.out.println(raf.getFilePointer());//找位置
raf.seek(4);//定位位置
f.readDouble();
System.out.println(d1);
raf.close();
}
}