標籤:src 字串 兩種 print 重新命名 ring amr exce 沒有
一、File類
在Windows下的路徑分隔字元(\)和在Linux下的路徑分隔字元(/)是不一樣的,當直接使用絕對路徑時,跨平台會報No Such file or diretory異常。
File中還有幾個與separator類似的靜態常量,與系統有關,在編程中應盡量使用。
ps:File file = new File("G:"+ File.separator +"demo.txt");
File類是java.io包中唯一一個與檔案本身操作有關的類,檔案本身操作是指檔案的建立、刪除、重新命名等
.構造方法:public File(String pathName),傳入完整的路徑,WEB開發此方式比較好用。
.構造方法:public File(File parent,String child),傳入父路徑和子路經。
基本的檔案操作:
.建立新檔案:public boolean createNewFile() throws IOException;
.刪除檔案:public boolean delete();
.判斷檔案是否存在:public boolean exists();
| 1234567891011121314151617 |
import java.io.File;import java.io.IOException; public class TestFile { public static void main(String [] args) throws IOException{ File file = new File("G:\\demo.txt"); System.out.println("file:"+file); if(file.exists()){ file.delete(); System.out.println("執行了刪除檔案!"); }else{ file.createNewFile(); System.out.println("執行了建立檔案"); } }} |
如果進行檔案建立時有目錄,則需要先建立目錄之後才可以建立檔案。
.找到父路徑:public File getParentFile();
.建立目錄:(1)public boolean mkdirs();既可以在不存在的目錄中建立檔案夾又可以建立多級目錄(個人推薦使用此方法)
(2)public boolean mkdir();只能在已近存在的目錄中建立檔案夾
import java.io.File;import java.io.IOException;public class TestFile { public static void main(String [] args) throws IOException{ File file = new File("G:"+ File.separator +"Test"+ File.separator +"TestFile"+ File.separator +"demo.txt"); if(!file.getParentFile().exists()){//檔案不存在 file.getParentFile().mkdirs(); System.out.println("執行了建立多級目錄"); } if(file.exists()){//檔案存在 file.delete(); System.out.println("執行了刪除檔案!"); }else{ file.createNewFile(); System.out.println("執行了建立檔案"); } }}
除了上述基本的檔案和檔案夾的操作之外,還提供了一些取得檔案資訊的方法:
.判斷路徑是否是檔案:public boolean isFile();
.判斷路徑是否是檔案夾:public boolean isDirectory();
.最後一次修改時間:public long lastModified();
.取得檔案大小:public long length();
.修改檔案名稱:public boolean renameTo(File dest);
import java.io.File;import java.math.BigDecimal;import java.text.SimpleDateFormat;public class TestFileOne { public static void main(String [] args){ File file = new File("G:"+ File.separator +"Test"+ File.separator +"TestFile"+ File.separator +"1.jpg"); if(file.exists()){ System.out.println(file.isDirectory()? "是檔案夾" : "不是檔案夾"); System.out.println(file.isFile() ? "是檔案" : "不是檔案"); System.out.println("最後修改時間:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified())); System.out.println("檔案大小:" + new BigDecimal((file.length() / (double) 1024 / 1024)) .divide(new BigDecimal(1), 2,BigDecimal.ROUND_HALF_UP) + "M"); if(file.renameTo(new File("G:"+ File.separator +"Test"+ File.separator +"TestFile"+ File.separator +"hello.jpg"))){ System.out.println("重新命名成功"); }else{ System.out.println("重新命名失敗"); } } }}
列出指定檔案夾中的所有內容:
public File [] listFiles();
import java.io.File;public class TestFileTwo { public static void main(String [] args){ File file = new File("G:" + File.separator + "Test"); if(file.exists() && file.isDirectory()){ File [] list = file.listFiles(); for(int i = 0; i < list.length; i ++){ System.out.println("files:"+list[i]); } } }}
列出指定目錄中的所有檔案(包含所有子目錄中的檔案),遞迴調用
import java.io.File;public class TestFileThree { public static void main(String [] args){ File file = new File("G:" + File.separator + "Test"); print(file); } public static void print(File file){ if(file.exists() && file.isDirectory()){ File [] files = file.listFiles(); if(files.length > 0 && files != null){ for(int i = 0; i < files.length; i++){ print(files[i]);//遞迴調用 } } } System.out.println(file); }}
二、位元組流與字元流
使用File類只能進行檔案本身的操作,但是與內容的操作無關。如果想進行檔案內容操作可以使用一下兩組流:
.位元組流InputStream OutputStream
.字元流reader writer
不管使用哪種流,基本的操作流程是一樣的,以檔案操作為例:
.確定操作檔案的路徑
.通過位元組流或字元流的子類為位元組流和字元流類對象執行個體化
.進行流入、流出操作
.關閉流,流屬於資源操作,資源操作完成一定要關閉
1、位元組輸入資料流:OutputStream
java.io.OutputStream是可以進行位元組資料(byte)的輸出
OutputStream類中存在三個write()方法:
·輸出單個位元組:public void write(int b);
·輸出全部位元組:public void write(byte [] b);
·輸出部分位元組:public void write(byte [] b,int off,int len);
OutputStream是一個抽象類別,所以可以使用子類對其進行執行個體化。對檔案操作,可以使用FileOutputStream,這個類有兩個常用的構造方法:
public FileOutputStream(File file) throws FileNotFoundException,覆蓋;
public FileOutputStream(File file, boolean append) throws FileNotFoundException,追加;
對檔案進行覆蓋的輸出操作:
package com.java.io;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class TestFile { public static void main(String [] args) throws IOException{ File file = new File("G:" + File.separator + "Test" + File.separator + "demo.txt"); if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } //通過OutputStream的子類對象為父類對象執行個體化 OutputStream output = new FileOutputStream(file); //要輸出的資料 String msg = "Hello world."; //將字串轉換為位元組數組 byte [] data = msg.getBytes(); //輸出位元組數組 output.write(data); output.flush(); //關閉 output.close(); }}
不管執行幾次,都是對當前檔案的覆蓋。如果不想覆蓋,可以使用追加的方式建立FileOutputStream類對象
.追加內容:OutputStream output = new FileOutputStream(file, true);
單個位元組:
package com.java.io;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class TestFile { public static void main(String [] args) throws IOException{ File file = new File("G:" + File.separator + "Test" + File.separator + "demo.txt"); if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } //通過OutputStream的子類對象為父類對象執行個體化 OutputStream output = new FileOutputStream(file); //要輸出的資料 String msg = "Hello world.\r\n"; //將字串轉換為位元組數組 byte [] data = msg.getBytes(); //輸出位元組數組 for(int i = 0; i < data.length; i++){ output.write(data[i]); } //關閉 output.close(); }}
2、位元組輸入資料流:InputStream
在InputStream類中定義有三個read()方法:
·讀取單個位元組:public int read() throws IOException;
每次使用read()操作將讀取一個位元組資料,此時返回的是資料,如果資料已讀完,則int返回-1
.讀取內容到位元組數組:public int read(byte [] b) throws IOException();
將內容讀取到位元組數組中,返回讀取的個數,如果讀取完畢,則返回-1
.讀取內容到部分位元組數組:public int read(byte [] b,int off,int len) throws IOException();
將指定長度的內容讀取到位元組數組中,返回讀取個數,如果讀取完畢,則返回-1
InputStream是抽象類別,所以可以使用它的子類對其進行執行個體化。使用FileInputStream子類完成,其構造方法:
public FileInputStream(File file) throws FileNotFoundException;
使用InputStream讀取資料
package com.java.io;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;public class TestFileOne { public static void main(String[] args) throws Exception { File file = new File("G:"+File.separator+"Test"+File.separator+"demo.txt"); if(file.exists()){//檔案存在 InputStream input = new FileInputStream(file); byte [] data = new byte[1024];//此數組用於接受全部輸入資料 int len = input.read(data);//將資料儲存到數組中 System.out.println(""+new String(data, 0, len)); input.close(); } }}
實際開發中使用while迴圈讀取
package com.java.io;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;public class TestFileOne { public static void main(String[] args) throws Exception { File file = new File("G:"+File.separator+"Test"+File.separator+"demo.txt"); if(file.exists()){//檔案存在 InputStream input = new FileInputStream(file); byte [] data = new byte[1024];//此數組用於接受全部輸入資料 int temp = 0;//定義每次讀取進來的資料 int foot = 0;//定義數組角標 //(temp = input.read()) != -1 判斷temp是否等於-1,如果不是則繼續讀 while((temp = input.read()) != -1){ data[foot++] = (byte) temp; } input.close(); //列印 System.out.println(new String(data, 0, foot)); } }}
3、字元輸出資料流:Writer
位元組輸出資料流和字元輸出資料流的區別:位元組輸出資料流是以byte類型為主,而字元輸出資料流是以char為主,並且支援String的直接操作
Writer類中的操作方法:
·輸出字串:public void write(String str) throws IOException;
·輸出位元組數組:public void write(char [] cbuf) throws IOException;
但Writer是一個抽象類別,如果使用它進行檔案操作必須使用FileWriter子類
package com.java.io;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;public class TestFileWriter { public static void main(String [] args) throws IOException{ File file = new File("G:"+File.separator+"Test"+File.separator+"fileWrite.txt"); if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } Writer out = new FileWriter(file); String msg = "Hello world."; out.write(msg); out.close(); }}
4、字元輸入資料流
Reader是負責字元資料讀取的,使用read()方法實現讀取,但沒有直接返回String類型的讀取操作
·讀取資料:public int read(char [] cbuf) throws IOException;
package com.java.io;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.Reader;public class TestFileWriterOne { public static void main(String [] args) throws IOException{ File file = new File("G:"+File.separator+"Test"+File.separator+"fileWrite.txt"); if(file.exists()){ Reader in = new FileReader(file); char [] data = new char[1024]; int len = in.read(data); in.close(); System.out.println(new String(data,0,len)); } }}
兩種讀取操作本質上區別不打,只是字元操作的是String/char,而位元組操作的是byte;
5、位元組流和字元流的區別
·字元流:當程式進行中文處理時,字元流是最方便;
·位元組流:當程式處理位元據(圖片、音樂、電影)或網路資料轉送,或者儲存到磁碟資料一定是位元組;
除以上區別之外,位元組流在操作時直接與操作終端進行互動,而字元流需要經過緩衝區的處理後才可以進行操作,以OutputStream和Writer兩個類輸出檔案為例,如果OutputStream輸出的最後可以不關閉輸出資料流,但是如果是Writer類輸出的如果沒有關閉,那麼儲存在緩衝區之中的資料將無法輸出,或者強制重新整理緩衝區。
package com.java.io;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;public class TestWriter { public static void main(String [] args) throws IOException{ File file = new File("G:"+File.separator+"Test"+File.separator+"fileWrites.txt"); if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } Writer out = new FileWriter(file); String msg = "Hello world,I am a programer."; out.write(msg); out.flush(); //out.close(); }}
所謂緩衝區就是一塊記憶體,當資料讀取進來之後會先進入記憶體地區之中進行處理,所以才可以更好的處理中文
三、轉換流
既然存在位元組和字元兩種操作流,那麼兩種操作流之間是可以進行相互轉換的,主要使用兩個類: InputStreamReader、OutputStreamWriter
InputStreamReader是Reader的子類,所以InputStreamReader類對象可以自動轉型為Reader類執行個體。
OutputStreamWriter是Writer的子類,所以OutputStreamWriter類對象可以自動轉型為Writer類執行個體。
Java的File.separator