java本地读取文件的io类_Java File类与文件IO流总结
1.File類
File類被定義為“文件和目錄路徑名的抽象表示形式”,這是因為File類既可以表示“文件”也可以表示“目錄”,他們都通過對應(yīng)的路徑來描述。通過構(gòu)造函數(shù)創(chuàng)建一個File類對象,則該對象就是指定文件的引用,可以通過該對象對文件操作。通過File對象,可以獲取文件的屬性值(文件大小,能否讀寫,最后修改時間等)。File對象不能對文件進行讀取和寫入的操作,如果想要對文件進行讀寫,那么要使用IO流。
以下函數(shù)是File類使用示例。它的功能是,將一個文件的路徑傳入函數(shù),函數(shù)判斷此路徑是否有文件,如果此路徑?jīng)]有指向任何文件或目錄,那么判斷這個路徑里是否有".",如果有,那么創(chuàng)建這個路徑的文件,如果沒有,創(chuàng)建這個目錄。如果有文件,則判斷此路徑是文件還是目錄,如果是文件,則顯示它的一系列屬性,如果是目錄,那么后續(xù)用遞歸的方式顯示它及其子目錄下的文件。文件路徑有兩種表示方法,一種是絕對路徑,一種是相對路徑。絕對路徑是帶盤符的,相對路徑是相對于當前目錄的路徑。
1 public voidtestFile(String path){2 File file = newFile(path);3 if(file.exists()){4 //如果文件存在,再獲取屬性值5 //TODO:獲取文件大小
6 if(file.isFile()){7 System.out.println("文件大小"+file.length());8
9 //TODO:文件是否可讀,可寫
10 System.out.println("是否能寫:"+file.canWrite());11 System.out.println("是否可讀:"+file.canRead());12 //TODO:獲取最后修改時間13 //Date date = new Date();
14 SimpleDateFormat sfm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");15 String str =sfm.format(file.lastModified());16 System.out.println("文件最后修改時間:"+str);17
18 }19 else if(file.isDirectory()){20 System.out.println("sdfsf");21 this.listFiles(file);22 //這個函數(shù)遞歸列出所有子目錄及文件,在后續(xù)會有提及
23 }24 }else{25 System.out.println("文件不存在"+path);26 if(path.contains(".")){27 try{28 //創(chuàng)建文件
29 file.createNewFile();30 } catch(IOException e) {31 //TODO Auto-generated catch block
32 e.printStackTrace();33 }34 }else{35
36 //創(chuàng)建目錄:file.mkdir(); 創(chuàng)建單目錄37 //file.mkdirs();循環(huán)創(chuàng)建目錄,沒有的話可以創(chuàng)建上層目錄
38 file.mkdirs();39 }40 }41 }
以下是遞歸調(diào)用listFiles(file)重載遞歸的函數(shù)實現(xiàn)。思想是先用listFiles獲取當前目錄下的所有列表,顯示所有列表的名字,如果當前列表還是個目錄,那么調(diào)用自身,進行子目錄的遍歷輸出。
1 public voidlistFiles(File file){2 File [] files = file.listFiles();//獲取當前目錄下所有列表
3 for(File one :files){4 System.out.println("名字:" +one.getName());5 //TODO:如果是目錄,繼續(xù)遍歷列出
6 if(one.isDirectory()){7 listFiles(one);8 }9 }10 }
2.字節(jié)流
字節(jié)流抽象類是InputStream和OutputStream,它們的實現(xiàn)的子類是FileInputStream和FileOutputStream。此處我們使用FileInputStream和FileOutPutStream解決文件讀寫問題。讀入的思想是當需要把文件的內(nèi)容讀入程序時,要申明一個Byte字節(jié)數(shù)組,將FileInputStream對象讀入數(shù)組。當沒讀完的時候,返回讀取的長度。當讀完的時候,返回-1。當使用完流的時候,要記得關(guān)閉流。FileOutputStream寫的時候也是需要將寫的東西轉(zhuǎn)換為Byte數(shù)組寫入文件,寫完關(guān)閉流。
1 public static void Input(String path) throwsIOException {2 //構(gòu)建一個InputStream對象 1、打開流
3 FileInputStream fin = newFileInputStream(path);4 byte[] buf = new byte[1024];5 int iread = 0;//讀取的實際長度6 //TODO:2、讀取文件內(nèi)容
7 while((iread = fin.read(buf)) != -1){8 System.out.println(newString(buf));9 System.out.println("*****************我已讀"+iread+"**************");10 }11 //TODO:3、關(guān)閉流
12 fin.close();13 }14 public static void Output(String path) throwsIOException {15 //1.打開
16 FileOutputStream oup = newFileOutputStream(path);17 String string = "道可道非常道";18 //2.寫
19 oup.write(string.getBytes());20 //3.關(guān)閉
21 oup.close();22 }
當讀完文件之后立刻要寫的時候,我們要注意一個問題,就是最后一次存入的時候,可能已經(jīng)數(shù)組里的內(nèi)容比最后一次讀入的多,那么就會最后一次多輸出一些上一次讀入數(shù)組時存的數(shù)據(jù)。為了解決這個問題,我們采用三個參數(shù)的write方式,避免出現(xiàn)亂碼。
public static void ReadAndWrite() throwsIOException{//1、打開
FileInputStream fin = new FileInputStream("d:\\uft.txt");
FileOutputStream fout= new FileOutputStream("d:\\www.txt");//一個讀一個寫,一塊一塊操作
int iread = 0;byte [] buf = new byte[200];while((iread = fin.read(buf))!=-1){
fout.write(buf,0,iread);
System.out.println(newString(buf));
}//關(guān)閉
fin.close();
fout.close();
}
3.字符流
字符流:操作的數(shù)據(jù)單元是16位字符,Reader、Writer? 文本文件。思想跟字節(jié)流類似,不同的是我們使用的字符流FileReader類繼承于Reader接口,字符流FileWriter類繼承于Writer接口。具體的操作步驟也是打開流,操作流,關(guān)閉流的步驟。
1 public static void Fileread(String path) throwsIOException{2 //1、打開流
3 FileReader fin = newFileReader(path);4 //2、
5 char[] buf = new char[100];//讀取的數(shù)據(jù)
6 int iread = 0;7 while((iread = fin.read(buf)) !=-1){8 String str = newString(buf);9 System.out.println("[讀了"+iread+"]"+str.substring(0, iread));10 }11 //3、
12 fin.close();13 }14 public static void testOut(String path,String str) throwsIOException{15 FileWriter fr = new FileWriter(path,true);16 fr.write(str);17 fr.close();18 System.out.println("*******************輸出完畢!!!*********************");19 }
當需要讀完了立馬就輸入文件的時候也是需要注意之前字節(jié)流的那個問題,寫的時候要用那個三個參數(shù)的write函數(shù),不然會將數(shù)組里的所有東西存入文件,會存入多余數(shù)據(jù)。
public static void testIO(String inPath,String outPath) throwsException{//d:\紅鯉魚.txt ->d:\紅鯉魚.out2.txt//1
FileReader fin = newFileReader(inPath);
FileWriter fout= newFileWriter(outPath);//2
char[] buf = new char[100];//讀取的數(shù)據(jù)
int iread = 0;while((iread = fin.read(buf))!=-1){
String str= newString(buf);
fout.write(buf,0,iread);
System.out.println("["+iread+"]"+str.substring(0, iread));
}//3
fin.close();
}
4.帶緩沖的字符流
BufferedReader和BufferedWriter建立的時候需要傳入一個Writer或者Reader,構(gòu)造函數(shù)也可以指定緩沖區(qū)大小。也就是,BufferedReader是高層流,FileReader是底層流。最后要關(guān)閉的時候,要先關(guān)閉高層流再關(guān)閉底層流。
public static void testOut2() throwsIOException{
StringWriter out= newStringWriter();
BufferedWriter fout= new BufferedWriter(out,3);
String string= "ABCDEFG哈哈哈";for(charc:string.toCharArray()){
fout.write(c);
System.out.println(out.getBuffer().toString());
}
}public static void testIoBuffer(String path1,String path2) throwsException{
FileReader in= newFileReader(path1);
BufferedReader fin= newBufferedReader(in);
FileWriter out= new FileWriter(path2,true);
BufferedWriter fout= newBufferedWriter(out);
String s;while((s =fin.readLine())!=null){
fout.write(s);
fout.newLine();
System.out.println(s);
}//關(guān)閉
fout.close();
fin.close();
out.close();
in.close();
}
總結(jié)
以上是生活随笔為你收集整理的java本地读取文件的io类_Java File类与文件IO流总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java状态模式所有情况_轻松掌握Jav
- 下一篇: qn模块java脚本_BAT批处理实现自