第53節:Java當中的IO流(上)

dav2100發表於2021-09-09

圖片描述

標題圖

Java當中的IO流

Java中,字串string可以用來操作文字資料內容,字串緩衝區是什麼呢?其實就是個容器,也是用來儲存很多的資料型別的字串,基本資料型別包裝類的出現可以用來解決字串和基本資料型別之間的轉換問題.

"字串" 轉換parseXxx() -- 基本資料型別"123456" -> parseInt -> 123456

基本資料型別包裝類的出現,也提供了更多的操作.

對於集合框架,物件多來,便於儲存和操作.

add put 新增儲存, Collection - IteratorMap - Set - Iterator

IO流的出現是為了儲存資料和讀取資料的操作.資料儲存到記憶體中如,物件,字串,日期,系統資訊等.記憶體和硬碟的關係是input輸入和output輸出的關係.所以輸出輸出就可以簡稱io了哦.(還不知道為啥io?因為input和output)

Java提供了io技術的操作,資料是在硬碟上的,在檔案中體現的,所以要了解檔案的相關資訊,在學習過程中,遇到不會的就百度,先百度,一般問題都可以解決的.

瞭解Java中的File檔案

java.io類 Filejava.lang.Object
 -> java.io.File知道的實現介面:Serializable,Comparable<File>

檔案繼承和實現:

public class File extends Object implements Serializable,Comparable<File>

File的欄位:

欄位 說明
pathSeparator 返回一個靜態的字串,為static string,與系統有關的路徑分隔符 ,表示為一個字串
pathSeparatorChar 返回為一個靜態的字元,為static char,與系統有關的路徑分隔符
separator 返回一個靜態的字串,為static string,與系統有關的預設名稱分隔符,表示為一個字串
separatorChar 返回為一個靜態的字元,為static char,與系統有關的預設名稱分隔符

構造方法:

欄位 說明
File(File parent, String child) 根據 parent 抽象路徑名和 child 路徑名 字串建立一個新的File例項
File(String pathname) 透過將給定的路徑名 字串 轉換為抽象路徑名來建立一個新File例項
File(String parent, String child) 根據parent路徑名 字串和 child 路徑名 字串建立一個新File例項
File(URI uri) 透過將給定的 file; URI 轉換為一個抽象路徑名 來建立一個新的 File 例項.

File

public File(String pathname)透過將給定路徑名 字串轉換為抽象路徑名來建立一個新 File 例項.
引數為pathname: 路徑名 字串
丟擲:NullPointerException,如果pathname為null的話
Filepublic File(String parent, String child)
根據parent路徑名,字串型別,和 child 路徑名, 字串型別, 建立一個新的File例項.
引數:parent為父路徑名字串
child為子路徑名字串
丟擲的異常為:
NullPointerException:如果child為null

建構函式

File(File parent, String child)
File(String pathname)
File(String parent, String child)
File(URI uri)
import java.io.File;public class FileDemo{
 public static void main(String[] args){ // 建立路徑
  String pathName = "e:\java\demo";// 建立檔案物件,將demo資料夾封裝成File物件
  File f = new File(pathName);
 }
}

同理可以改為檔案路徑:

// File(String pathname)String pathName = "e:\java\demo\demo.java";
File f = new File(pathName);// 將檔案封裝成File物件

結果為:

e:\java\demo\demo.java

Java中的File物件,可以封裝不存在的檔案和資料夾,雖然沒有,但是也可以生成建立,變成物件.

// File(String parent, String child)File f = new File("e:\java\demo","demo.java");// 同樣可以建立,結果為:e:\java\demo\demo.java

File(File parent, String child)

// File(File parent, String child)// 是將parent 封裝成File物件了File dir = new File("e:\java\demo");
File f = new File(dir,"demo.java");// 結果為:e:\java\demo\demo.java

要點:

磁碟機代號: "/"標題為UNIX中的根目錄,"\\"表示為 Microsoft Windows UNC 路徑名.

private static final String PILE_SEPARATOR = System.getProperty("file.separator");// File f = new File("e:" + PILE_SEPARATOR + "java\demo\demo.java");File f = new File("e:" + PILE_SEPARATOR + "java"+ PILE_SEPARATOR +"demo"+ PILE_SEPARATOR +"demo.java");

separator 相關

欄位 說明
file.separator 檔案分隔符,如"/"
path.separator 路徑分隔符,如":"
line.separator 行分隔符,如:"/n"
separatorpublic static final String separator
與系統有關的預設 -> 名稱分隔符,表示為字串
separatorCharpublic static final char separatorChar
與系統有關的預設 -> 名稱分隔符
pathSeparatorCharpublic static final char pathSeparatorChar
與系統有關的 -> 路徑分隔符

進一步最佳化:

File.pathSeparator: -> String-FileFile.pathSeparatorChar: -> char-FileSeparator: -> String-FileSeparatorChar: -> char-Fileclass: -> Class<java.io.File>File.listRoots(): -> File[]-File
// File.separatorFile f = new File("e:" + File.separator + "java"+ File.separator +"demo"+ File.separator +"demo.java");

File方法

欄位 說明
canExecute() 返回型別為boolean,是用來測試程式是否執行了此抽象路徑名錶示的檔案
canRead() 返回型別為boolean,是用來測試程式是否可以讀取此抽象路徑名錶示的檔案
canWrite() 返回型別為boolean,是用來測試程式是否修改此抽象路徑名錶示的檔案
compareTo(File pathname) 返回型別為Int型別,是按照字母順序進行比較的兩個抽象路徑名
createNewFile() 返回boolean型別,當且僅當不燦在具有此抽象路徑名指定名稱的檔案時,,不可分地建立一個新的空檔案
createTempFile(String prefix, String suffix) 返回型別為static File,在預設臨時檔案目錄中建立一個空檔案,使用給定字首和字尾生成其名稱
createTempFile(String prefix, String suffix, File directory) 返回為static File,在指定目錄中建立一個新的空檔案,使用給定的字首和字尾字串生成其名稱
delete() 返回為boolean型別,用來刪除此抽象路徑名錶示的檔案或目錄
deleteOnExit() 返回void,在虛擬機器終止時,請求刪除此抽象路徑名錶示的檔案或目錄
equals(Object obj) 返回的型別為boolean,測試此抽象路徑名與給定物件是否相等
exists() 返回型別為boolean,測試此抽象路徑名錶示的檔案或目錄是否存在
getAbsoluteFile() 返回型別為File,返回此抽象路徑名的絕對路徑名形式
getCanonicalFile() 返回型別為File,返回此抽象路徑名的規範形式

檔案屬性:

檔案型別
位置
大小
佔用空間
修建時間
修改時間
訪問時間
屬性

FileMethodDemo

public class FileMethodDemo{
 public static void main(String[] args){  // 封裝檔案 java目錄檔案
  File file = new File("e:\java\demo\demo.java");
 }
}
File file = new File(" ");
System.out.println(file);// 結果為 空
               // 結果什麼也沒顯示如果:
File file = new File(".");// 結果.
如果:
File file = new File("hello.txt");// 結果hello.txt// 如果想要什麼路徑可以用改方法,自己也可以查apiSystem.out.println(file.getAbsolutePath());// 可以得到結果 預設路徑

可以檢視系統資訊,為SystemInfo檔案,看看預設路徑

File file = new File("hello.java");// 相對路徑String absPath = file.getAbsolutePath();// 拿的是new File()中的寫啥拿啥, File中封裝的路徑是啥,就拿啥哦~String path = file.getPath();// 獲取檔名String filename = file.getName();// 檔案長度long size = file.length();// 檔案修改時間long time = file.lastModified();// 可以修改時間String date = DateFormat.getDateInstance(DateFormat.LONG).format(new Date(time));String date = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG).format(new Date(time));

用檔案類方法,對檔案進行建立和刪除操作

File.canExecute(): 為可不可以執行,就是檔案型別為xxx.exe的,相信你也看過這種.
返回型別為boolean

檔案可讀可寫:

File.canRead(): 可讀
返回型別為boolean
File.canWrite(): 可寫
返回型別為boolean

建立檔案

file.createNewFile();// 宣告異常import java.io.IOExceptionpublic static void main(String[] args) throws IOException {
}
public class FileMethodDemo{ public static void main(String[] args) throws IOException {  // 建立檔案
  File file = new File("e:\hello.txt");  // 檔案不存在,則建立為true
  // 檔案存在,則不建立為false
  // 路徑錯誤,記憶體不夠,則IOException
  boolean b = file.createNewFile();
  System.out.println("b=" + b);
 }
}

刪除檔案

File file = new File("e:\hello.txt");
boolean b = file.delete();// 徹底刪除,不存在回收站中// 注意如果檔案不存在,進行刪除為false如果檔案正在使用,進行刪除為false

對檔案進行判斷存不存在

boolean b = file.exists();
System.out.println("b="+b);

對目錄進行建立,刪除,判斷

dir.mkdir(); 為建立一個目錄
dir.mkdirs(); 為建立一個路徑,建立目錄中的目錄

File dir = new File("e:\hello)";boolean b = dir.mkdir();// 建立目錄
File dir = new File("e:\hello\da\shu\dashu)";boolean b = dir.mkdirs();// 建立多級目錄

刪除目錄

File dir = new File("e:\hello\da\shu\dashu)";
boolean b = dir.delete();// 注意刪除目錄,無法直接刪除,只能刪除最後一個目錄
如果目錄中還有目錄,也不能一次性刪除

要判斷是檔案還是目錄

File.isFile(); // 判斷是否是檔案File.isDirectory(); // 判斷是否是目錄

為啥要判斷呢?

File file = new File("e:\hello.txt");// hello.txtFile file = new File("e:\hello");// hello也可以是檔案哦~給個
file.createNewFile();// 就可以建立了哦~沒有副檔名的檔案

因為這個可以是目錄也可以是檔案啊~不信自己建立一個,叫名為hello.txt的目錄試試.

使用方法

File dir = new File("e:\java");// 遍歷目錄,獲取目錄檔名String[] names = dir.list();for(String name : names) {
 System.out.println(name);
}

listFiles():
返回型別為File[]
返回一個抽象路徑名陣列,路徑名

File dir = new File("e:\java");
File[] files = dir.listFile();for(Files file : files){
 System.out.println(file.getName());
}// 如果目錄不存在丟擲: 
java.lang.NullPointerException// Java的健壯性要進行健壯性的判斷,防止錯誤

對檔案進行過濾,進行篩選

// 獲取目錄下的所有檔案File dir = new File("e:\java");
File[] files = dir.listFiles();for(Files file : files){ // 進行篩選  
 if(file.getName().endsWith(".java")){
  System.out.println(file.getName());
 }
}

listFiles()
返回型別為File[]
返回一個抽象路徑名的陣列,路徑名為表示此抽象路徑名錶示的目錄中的檔案

listFiles(FileFilter filter)
返回為File[]
返回為抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定的過濾器的檔案和目錄

listFiles(FilenameFilter filter)
返回為File[]
返回為抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定的過濾器的檔案和目錄

介面FilenameFilter

java.io
介面FilenameFilterpublic interface FilenameFilter

方法:

方法 說明
accept(File dir, String name) 返回型別為boolean ,測試指定檔案是否應該包含在某一檔案列表中
acceptboolean accept(File dir, String name)引數:
dir為檔案所在目錄
name為檔名
public class FilenameFilterByJava implements FilenameFilter { @Override
 public boolean accept(File dir, String name) {  return name.endsWith(".java");
 }
}
File dir = new File("E:\java");
File[] files = dir.listFiles(new FilenameFilterByJava());for(File file : files){
 System.out.println(files.getName());
}

listFiles內部程式碼

public File[] listFiles(FilenameFilter filter){ // 使用了File類中的方法list(),獲取了所有名稱陣列
 String s[] = list();// 健壯性判斷
 if(s == null) return null; // 建立一個集合,型別為File型別
 ArrayList<File> files = new ArrayList<>(); // 遍歷資料名字
 for(String str : s)  if((filter == null) || filter.accept(this, s))
   files.add(new File(s, this));  // 集合轉陣列,不用增刪操作
  return files.toArray(new File[files.size()]);
}
public class FilenameFilterByBuffix implements FilenameFilter { private String suffix; public FilenameFilterByBuffix(String suffix){  super();  this.suffix = suffix;
 } @Override
 public boolean accept(File dir, String name){  return name.endsWith(suffix);
 }
}
// 這時候改為File dir = new File("E:\java");// File[] files = dir.listFiles(new FilenameFilterByJava());File[] files = dir.listFiles(new FilenameFilterByBuffix(".java"));

資料夾過濾

public class FileFilterByDir implements FileFilter{ @Override 
 public boolean accept(File pathname){  return pathname.isDirectory();
 }
}
public class FileMethodDemo{
 public static void main(String[] args){
  File dir = new File("E:\java");
  File[] files = dir.listFiles( new FileFilterByDir() );  for(File file : files){
   System.out.println(file);
  }
 }
}

FileTest

public class FileTest{
 public static void main(String[] args){
  File dir = new File("E:\java");
  File[] files = dir.listFiles();  // 遍歷
  for(File file :  files){   if(file.isDirectory()){

    File[] filess = file.listFiles();
    fot(File f : filess){
     System.out.println(f.getName());
    }
   }
   System.out.println(file.getName());
  }
 }
}

昇華

File dir = new File("e:\java");
listAll(dir);// 建立一個方法public static void listAll(File dir){
 System.out.println("dir:" + dir.getName());
 File[] files = dir.listFiles(); for(File file : files){ 
  if(file.isDirectory()){
   listAll(file);
  }else{
   System.out.println("file:" + file.getName());
   } 
 }
}

File 類中的方法

// onepublic static void main(String[] args){
 show();
}public static void show(){
 show();
}// java.lang.StackOverflowError棧記憶體溢位// twopublic static void main(String[] args){
 show();
}public static void show(){
 showdashu();
}public static void showdashu(){
 show();
}

求和新大陸

public static void main(String[] args){ // 總和
 int sum = getSum(4);
 System.out.println("sum="+sum);
}public static int getSum(int num){ // 如果求和數字,匯入為1,則返回為1
 if(num == 1){  return 1;
 } // 求和
 return num + getSum(num-1);
}
// 4int getSum(4){ if(4==1){  return 1;
 } return 4 + getSum(4-1);
}// 3int getSum(3){ if(3==1){  return 1;
 } return 3 + getSum(3-1);
}// 2int getSum(2){ if(2==1){  return 1;
 } return 2 + getSum(2-1);
}// 1 int getSum(1){ if(1==1){  return 1;
 } return 1 + getSum(1-1);
}// 注意如果數字大,就會不斷進棧,會導致棧溢位

佇列

遍歷子目錄,如果有子目錄就將目錄儲存到容器中,然後遍歷容器,從容器中取出子目錄,遞迴的方法,容易將棧溢位.如果在容器中目錄中沒有目錄了,就可以取出來了.

佇列結構,先進先出

// 泛型class Queue<E>{
 // 構造佇列物件
 private LinkedList<E> link; public Queue(){
  link = new LinkedList<E>();
 } // 新增元素
 public void myAdd(E obj){  //第一個
  link.addFirst(obj);
 } // 獲取
 public E myGet(){  // 最後
  return link.removeLast();
 }// 進行判斷
 public boolean isNull(){  return link.isEmpty();
 }
}
File dir = new File("e:\java");
Queue<File> queue = new Queue<File>();// 遍歷目錄File[] files = dir.listFiles();for(File file : files){ // 判斷有子目錄,就儲存到佇列中
 if(file.isDirectory()){  queue.myAdd(file);
}else{
 System.out.println(file.getName());
}
}
System.out.println(queue.isNull());// 遍歷while(!queue.isNull()){ // 遍歷子目錄
 File subDir = queue.myGet();
 File[] subFiles = subDir.listFiles(); for(File subFile : subFiles){  if(subFile.isDirectory()){   // 繼續將子目錄儲存到佇列中
   queue.myAdd(subFile);
   }else{
    System.out.println(subFile.getName());
   }
  }
 }
}

IO流-資料儲存操作

輸入輸出流-IO流操作:輸出output,輸入input

java.io 為透過資料流,序列化和檔案系統提供系統輸入和輸出的

java.io類 OutputStreamjava.lang.Object-> java.io.OutputStream實現的介面:Closeable,Flushable知道的子類ByteArrayOutputStream,FileOutputStream,FilterOutputStream,ObjectOutputStream,OutputStream,FiledOutputStream
public abstract class OutputStreamextends Objectimplements Closeable, Flushable

抽象類OutputStream表示為輸出位元組流的所有類的超類,構造方法OutputSteam(),操作位元組

OutputStream為輸出位元組流的超類,是操作位元組資料的,具有輸出位元組流的基本功能哦~

public abstract class OutputStreamextends Objectimplements Closeable, Flushable輸出流是把這些位元組傳送到某個接收器中

方法:

欄位 說明
close() 返回型別void,是用來關閉此輸出流並且釋放與此流有關的所有系統資源
flush() 返回型別為void,是用來重新整理此輸出流並且強制寫出所有緩衝的輸出位元組
write(byte[] b) 返回型別為void,是將b.length個位元組從指定的byte陣列中寫入此輸出流
write(byte[] b, int off, int len) 返回型別為void,是將指定byte陣列中從offlen個位元組寫入輸出流
write(int b) 返回型別為abstract void,是將指定的位元組寫入此輸出流

從類java.lang.Object 繼承的方法有:

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait,

FileOutputStream
往檔案寫

public class FileOutputStreamDemo{ public static void main(String[] args){  // 建立資料夾
  File dir = new File("hello");  // 健壯性
  if(!dir.exists()){
   dir.mkdir();
  }  // 建立檔案
  File file = new File(dir,"hello.txt");  // 用於建立操作檔案的位元組輸出流物件
  // 輸出流建立檔案,不存在就建立新的,存在就刪掉進行覆蓋
  FileOutputStream fos = new FileOutputStream(file);  // 呼叫父類的write
 byte[] data = "dashucoding".getBytes();
 fos.write(data) // 關閉流
 fos.close();
 }
}



作者:達叔小生
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4479/viewspace-2818749/,如需轉載,請註明出處,否則將追究法律責任。

相關文章