IO流:(Input Output) 輸入輸出流 java
輸入:將文件讀到內存中。windows
輸出:將文件從內存輸出到其餘地方。數組
IO計數的做用:主要就是解決設備和設備之間的數據傳輸問題。緩存
好比:硬盤到--->內存,內存數據--->硬盤中 把鍵盤中的數據寫入到內存。app
IO的應用場景:jvm
好比:打卡機打出信息表、註冊的時候圖片的上傳、下載 功能、解析XML測試
數據保存到本地,數據一個永久保存。數據保存到磁盤上是以文件的形式存在的。spa
java中如何操做文件:操作系統
java是經過File文件類來操做文件和文件夾。orm
File(File parent, String child)
根據 parent 抽象路徑名和 child 路徑名字符串建立一個新 File 實例。
File(String pathname)
經過將給定路徑名字符串轉換爲抽象路徑名來建立一個新 File 實例。
File(String parent, String child)
根據 parent 路徑名字符串和 child 路徑名字符串建立一個新 File 實例。
java是跨平臺的不一樣的操做系統上均可以運行。
目錄分隔符:
不一樣的系統目錄 的分隔符是不同的。
在Windows系統上目錄分隔符:\ ,可是Linux系統上的目錄分隔符是 / 。
注意點:在Windows上 \ 或者 / 均可以做爲目錄的分隔符,若是你用的反斜槓,
將U盤中的文件拷貝到電腦中:輸入流--->讀到內存--->經過輸出流讀到電腦磁盤中。
代碼是在內存中運行的。
路徑問題:
絕對路徑 : 文件在硬盤上的完整路徑。絕對路徑通常都是以盤符開頭 D:\\a.txt 絕對路徑
相對路徑 : 相對路徑就是資源文件相對當前程序所在的路徑
File中經常使用的方法:
建立:
CreateNewFile() 在指定位置建立一個空文件,成功就返回true,若是已存在就不建立而後返回false
mkdir() 在指定位置建立目錄,這隻會建立最後一級目錄,若是上級目錄不存在就拋異常。
mkdirs() 在指定位置建立目錄,這會建立路徑中全部不存在的目錄。
renameTo(File dest) 重命名文件或文件夾,也能夠操做非空的文件夾,文件不一樣時至關於文件的剪切,剪切時候不能操做非空的文件夾。移動/重命名成功則返回true,失敗則返回false。
刪除:
delete() 刪除文件或一個空文件夾,若是是文件夾且不爲空,則不能刪除,成功返回true,失敗返回false。
deleteOnExit() 在虛擬機終止時,請求刪除此抽象路徑名錶示的文件或目錄,保證程序異常時建立的臨時文件也能夠被刪除
建立文件的方法:
File file = new File("D:\\aa"); System.out.println("經過指定的路徑建立一個空的文件"+file.createNewFile()); |
建立文件夾的方法:
File dir = new File("D:\\cc"); //1.不可以有同名的文件或文件夾 2.只能建立單級文件夾 System.out.println("建立文件夾成功嗎"+dir.mkdir()); File dirs = new File("D:\\bb\\aa");System.out.println("建立文件夾成功嗎?"+dirs.mkdirs()); |
文件夾的重命名:
File file = new File("D:\\aa.txt"); System.out.println("是否找到該文件夾?"+file.exists()); File destFile = new File("D:\\aabb"); //指的是重命名的名字 System.out.println("重命名成功嗎?"+file.renameTo(destFile)); |
文件的重命名:
File file = new File("D:\\aa"); System.out.println("重命名成功嗎?"+file.renameTo(new File("D:\\aa.txt"))); //若是更改盤符 : renameTo 是作剪切的操做。 File file = new File("D:\\aa.txt"); System.out.println("重命名成功嗎"+file.renameTo(new File("G:\\aa.txt"))); |
刪除:
//1.delete() : 刪除文件或空的文件夾。 直接刪除掉 File file = new File("D://a.txt"); System.out.println("刪除成功嗎?"+file.delete()); file.deleteOnExit();//用來刪除臨時文件 System.out.println("哈哈"); file.deleteOnExit(); //在jvm退出的時候刪除。 |
判斷方法:
exists() 文件或文件夾是否存在。
isFile() 是不是一個文件,若是不存在,則始終爲false。
isDirectory() 是不是一個目錄,若是不存在,則始終爲false。
isHidden() 是不是一個隱藏的文件或是不是隱藏的目錄。
isAbsolute() 測試此抽象路徑名是否爲絕對路徑名。
獲取方法:
getName() 獲取文件或文件夾的名稱,不包含上級路徑。
getPath() 返回絕對路徑,能夠是相對路徑,可是目錄要指定
getAbsolutePath() 獲取文件的絕對路徑,與文件是否存在不要緊
length() 獲取文件的大小(字節數),若是文件不存在則返回0L,若是是文件夾也返回0L。
getParent() 返回此抽象路徑名父目錄的路徑名字符串;若是此路徑名沒有指定父目錄,則返回null。
lastModified() 獲取最後一次被修改的時間。
文件夾相關:
staic File[] listRoots() 列出全部的根目錄(Window中就是全部系統的盤符)
list() 返回目錄下的文件或者目錄名,包含隱藏文件。對於文件這樣操做會返回null。
list(FilenameFilter filter) 返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操做會返回null。
listFiles() 返回目錄下的文件或者目錄對象(File類實例),包含隱藏文件。對於文件這樣操做會返回null。
listFiles(FilenameFilter filter) 返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操做會返回null。
獲取最後一次被修改的時間:
System.out.println("最後一次修改的時間:"+file.lastModified()); long time = file.lastModified(); Date date = new Date(time); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("最後一次修改的時間:"+dateFormat.format(date)); |
文件夾的操做;
File[] files = File.listRoots(); // 獲取windows電腦中全部的盤符 for (File file : files) { System.out.println("盤符:"+file); } |
//獲取指定文件夾下文件和子目錄的字符串名稱 ,子目錄中的東西是獲取不到的。 File file = new File("D:\\java "); String[] nameStrings = file.list();
for (String string : nameStrings) {
System.out.println(string);
} /*File file = new File("D:\\java "); File[] files = file.listFiles(); for (File file2 : files) { System.out.println("name:"+file2.getName()); //判斷file2指的是文件仍是文件夾 if(file2.isDirectory()){ //從子目錄中在次獲取值 File[] nextFiles = file2.listFiles(); for (File file3 : nextFiles) { System.out.println("subname:"+file3.getName()); } } }*/ |
查找指定的後綴名的文件:
File file = new File("D:\\java課件及資料"); //定義一個過濾器 //FilenameFilter 一個接口 String[] strings = file.list(new MyFilter());
for (String string : strings) {
System.out.println(string); } |
IO流的分類:
流按照操做數據的類型分爲兩種:字節流,字符流
字節流:讀取的是文件的二進制數據,不會對二進制作處理。不會解析成看得懂的數據。
字符流:讀取的也是二進制數據,他會將這個二進制的數據轉化爲咱們可以識別的字符(解碼)。字符流是以字符爲單位的。
字符流 = 字節流 + 解碼。
按照流的方向能夠分爲:輸入流,輸出流
判斷流是輸入仍是輸出:以當期的應用程序爲參考,觀察出具是流入仍是流出,若是流入就是輸入流,若是流出就是輸出流。
字節流:
InputStream:此抽象類是表示字節輸入流的全部類的超類,抽象的類。
如何判斷一個流是字節輸入流:
判斷一下他的類名是不是以InputStream結尾。
使用 FileInputStream: 是InputStream的子類
讀取文件的四種方式:
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Demo1 {
/** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub // getFile(); // getFile2(); // getFile3(); getFile4(); }
//方式四:經過建立緩衝區和循環的方式來讀取 public static void getFile4() throws IOException{
//1.找目標文件 File file = new File("D:\\java課件"); //2.創建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.建立一個緩衝區 byte[] b = new byte[1024]; // 通常寫1024倍數 //4.讀取數據 int count = 0; while((count = fileInputStream.read(b))!=-1){
System.out.println(new String(b,0,count)); } //5.關閉資源 fileInputStream.close(); }
//方式三:建立緩衝區來讀取數據 缺陷不可以讀取一個完整的文件 public static void getFile3() throws IOException{ //1.找目標文件 File file = new File("D:\\a.txt"); //2.創建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.建立一個緩衝區 byte[] b = new byte[1024]; //4.讀數據 //緩衝區來讀數據 : 數據存在哪裏 //數據是存在緩存區字節數組中的 //返回值就是文件的大小。 int count = fileInputStream.read(b); System.out.println(count); //String裏面幫咱們作了解碼功能 System.out.println(new String(b, 0, count));
//5.關閉資源 fileInputStream.close();
}
//方法二:用循環來讀取字節數 缺點讀取的效率不高 public static void getFile2() throws IOException{
//1.找目標文件 File file = new File("D:\\a.txt"); //2.創建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.讀數據 /*for(int i = 0;i<file.length();i++ ){//有多少個字節就去多少次 char c = (char)fileInputStream.read(); System.out.print(c); }*/
int content = 0; //經過while循環調用read()的方法 ,若是返回的值以-1表示文件沒有內容了。 while((content = fileInputStream.read())!= -1){
System.out.print((char)content); }
//4.關閉資源 fileInputStream.close(); }
//方法一:每次只讀取一個字節 public static void getFile() throws IOException{
//1.找到目標文件 File file = new File("D:\\a.txt"); //2.創建通道 FileInputStream fileInputStream = new FileInputStream(file); //3.讀取文件中的數據 //read() 只獲取一個字節 int data = fileInputStream.read(); //a 第一個字節 int data2 = fileInputStream.read(); System.out.println("獲取的數據:"+data2); //4.關閉資源(釋放資源) fileInputStream.close(); }
}
|
字節輸出流 :
OutPutStream : 他也是全部字節輸出流的超類 ,也是一個抽象的類 ,使用子類
-----FileOutputStream 文件輸出流
FileOutputStream 的使用步驟:
1.找到目標文件
2.創建通道
3.寫入數據
4.關閉資源
FileOutputStream的使用注意事項:
1.使用FileOutputStream寫數據的時候,若是目標文件不存在,那麼就會本身建立一個目標文件對象。
2.使用FileOutputStream寫數據的時候,若是目標文件存在,先將裏面的數據清空,在寫入數據。
3.使用FileOutputStream寫數據的時候,若是目標文件存在,想將數據在原有的基礎上追加,這個
時候就應該使用FileOutputStream(File file, boolean append) 構造方法, append若是爲true表示
能夠追加數據,反之不信。
4..使用FileOutputStream寫數據的時候,用write(int a)方法寫數據,雖然接收的是int ,但實際上只有一個字節的數據,
操做的是低八位的二進制 ,其餘的24位所有丟掉。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; public class Demo2 {
/** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub writeData();
//writeData2();
FileInputStream inp = new FileInputStream(new File("D:\\a.txt")); byte[] b = new byte[1024]; inp.read(b); System.out.println(Arrays.toString(b));
}
//方式二: public static void writeData2() throws IOException{ //1.找目標文件 File file = new File("D:\\a.txt"); //2.建立一個通道 FileOutputStream outputStream = new FileOutputStream(file,true); // 在這一步建立的文件。 //3.創鍵一個字節數組 String str = "hello word"; //將字符串變爲字節數組 byte[] b = str.getBytes();
//4.寫入數據 outputStream.write(b);
//5.關閉資源 outputStream.close();
}
//方式一 public static void writeData() throws IOException{ //1.找目標文件 File file = new File("D:\\a.txt");
//2.建立一個通道 FileOutputStream outputStream = new FileOutputStream(file);
//3.開始寫入數據 /*int a = 10; // 4個字節 outputStream.write(a); //每次輸出一個字節 outputStream.write('b'); outputStream.write('c');*/
// 0000-0000 0000-0000 0000-0001 1111-1111 == 511 int a = 127; outputStream.write(a); // 255 //4.關閉資源 outputStream.close(); }
} |