Java IO 系統

Java IO系統

File類

用來處理文件目錄,既可以代表一個特定文件的名稱,也可以代表一組文件的名稱,如果代表的是一個文件組,可以調用File.list()方法返回一個字符數組。

list()不傳遞任何參數時返回該目錄下所有文件或文件名的字符數組(不會遞歸遍歷目錄里面的內容【只返回第一層】)如果想要過濾返回結果,可以傳遞給它一個FilenameFilter對象,該接口只有一個方法accept, 接收一個代表某個特定文件所在目錄的File對象 dir 和一個包含了文件名的String name, list會對dir中的每個文件執行accept ,如果accept結果為true, 就把這個name加入list的結果中。

@FunctionalInterface
public interface FilenameFilter {boolean accept(File dir, String name);
}
public String[] list(FilenameFilter filter) {// 策略模式,根據filter是否為null,具有不同的策略String names[] = list();if ((names == null) || (filter == null)) {return names;}// 內部使用了ArrayListList<String> v = new ArrayList<>();for (int i = 0 ; i < names.length ; i++) {if (filter.accept(this, names[i])) {v.add(names[i]);}}return v.toArray(new String[v.size()]);}

例:

package Note.iosystem;import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;class DirFilter implements FilenameFilter {private Pattern pattern;DirFilter (String regex){pattern = Pattern.compile(regex);}@Overridepublic boolean accept(File dir, String name) {return pattern.matcher(name).matches();}
}public class DirList {public static void main(String[] args) {File file = new File("./src/Note/iosystem");String filter = ".*\\.java";String [] filenames = file.list(new DirFilter(filter));assert filenames != null;for (String filename:filenames) {System.out.println(filename);}}
}

使用匿名內部類使得代碼更加簡潔

package Note.iosystem;import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;public class DirList2 {public static void main(String[] args) {File file = new File("./src/Note/iosystem");String filter = ".*\\.java";String [] filenames = file.list(new FilenameFilter() {private Pattern pattern  = Pattern.compile(filter);@Overridepublic boolean accept(File dir, String name) {return pattern.matcher(name).matches();}});assert filenames != null;for (String filename:filenames) {System.out.println(filename);}}
}

其他常用方法

1. 構造方法

File(String pathname) 通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例。 通過將給定的路徑名字符串轉換為抽象路徑名來創建新的File實例。 如果給定的字符串是空字符串,則結果是空的抽象路徑名。

public static void main(String[] args) {// Java 中一個 “\” 表示轉義開始File file = new File("E:\\桌面文件\\JAVA\\src\\demo.txt");}

File(String parent, String child) 從父路徑名字符串和子路徑名字符串創建新的 File實例。

File file1 = new File("E:\\桌面文件\\JAVA\\src", "demo.txt");

第一個參數傳入父級路徑字符串,第二個參數傳入相對父級路徑的子路徑名

File(File parent, String child) 從父抽象路徑名和子路徑名字符串創建新的 File實例。

File file2 = new File("E:\\桌面文件\\JAVA\\src");
File file3 = new File(file2, "demo.txt");

File(URI uri) 通過將給定的 file: URI轉換為抽象路徑名來創建新的 File實例。

2 成員方法

2.1 創建
成員方法功能參數介紹返回值介紹異常備注
public boolean createNewFile()創建文件,如果存在就不創建——創建成功返回true,文件存在或創建失敗返回falseIOException路徑不存在拋出IOException異常
public boolean mkdir()創建文件夾返回是否創建成功IOException父路徑不存在返回false
public boolean mkdirs()創建多級目錄返回是否成功IOException路徑不存在就創建
2.2 刪除
成員方法功能參數介紹返回值介紹異常備注
public boolean delete()刪除文件或文件夾返回是否刪除成功1. 文件不存在返回false 2. 刪除文件夾時只能刪除空文件夾
2.3 重命名或移動
成員方法功能參數介紹返回值介紹異常備注
public boolean renameTo(File dest)重命名文件dest:重命名文件的新的抽象路徑名返回是否重命名成功可以使用這個方法實現移動(剪貼)功能
2.4 判斷
成員方法功能參數介紹返回值介紹異常備注
public boolean isDirectory()判斷是否是目錄返回是否是目錄只有是目錄且目錄存在時返回true
public boolean isFile()判斷是否是文件返回是否是文件
public boolean isHidden()判斷是否是隱藏文件··UNIX中,以.開頭的是隱藏文件,而window中,特殊標記過的是隱藏文件
public boolean exists()判斷文件或目錄是否存在返回是否存在
public boolean canWrite()判斷文件是否可寫返回是否可寫
public boolean canRead()判斷文件是否可讀返回是否可讀
public boolean isAbsolute()判斷路徑是否是絕對路徑在UNIX系統上,如果前綴為"/" ,路徑名是絕對的。 在Windows系統上,前面是盤符或///為絕對路徑
2.5 獲取功能
成員方法功能參數介紹返回值介紹異常備注
public String getName()返回文件或目錄名稱String這個方法只是對路徑字符串的分割操作,不檢查路徑是否存在
public String getParent()返回文件或文件夾父路徑名字符串String也只是字符串的分割操作,不檢查路徑或文件是否真實存在
public File getParentFile()返回文件或文件夾的父路徑的File對象File內部調用的是getParent()方法
public String getPath()返回文件路徑String
public String getAbsolutePath()返回絕對路徑String同樣不關心文件是否存在
public File getAbsoluteFile()返回絕對形式的File對象File
public String getCanonicalPath()返回文件規范路徑名字符串StringIOException先轉換成絕對路徑,然后刪除.,..等冗余名稱等。。
public File getCanonicalFile()返回文件規范路徑名的File對象IOException
public long lastModified()返回文件上次修改時間Long 返回一個時間戳如果文件不存在返回0
public long length()返回文件長度Long 文件長度,以字節為單位文件不存在返回0
public String[] list([FilenameFilter filter])返回該目錄下所有文件和目錄的數組可以傳入一個FilenameFilter filter,表示列出滿足過濾器的文件或目錄名
public File[] listFiles([FilenameFilter filter])類似于上面

流總覽

流對象代表任何有能力產出數據的源對象或任何有能力消費數據的目標對象,Java中IO類分為輸入和輸出兩部分,對應輸入流和輸出流任何繼承自InputStreamReader的類都包含基本方法read()用來讀字節或字節數組(字符),任何繼承自OutputStreamWriter的類都包含基本方法write()用來寫字節或字節數組。

輸入輸出是相對于當前程序而言的

InputStream和OutputStream

Java1.0中,所有輸入相關的類都從InputStream繼承而來,所有輸出相關的類都從OutputStream繼承而來,也就是字節流。

InputStream

InputStream用來表示從不同輸入源產生輸入的類,這些輸入源包括:

  1. 字節數組
  2. String對象
  3. 文件
  4. 管道
  5. 一個由其他種類的流組成的序列,我們可以把它們合并到同一個流里
  6. 其他數據源,如Interest連接等

每種數據源都對應一個具體的InputStream的子類
在這里插入圖片描述

OutputStream

他的子類決定了輸出要去往的目標,包括:

  1. 字節數組
  2. 管道
  3. 文件

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fkHU1P7l-1585581131272)(image/Java11_IO系統/image-20200328131236501.png)]

Reader 和 Writer

Java1.1 中加入了 Reader 和 Writer類,來提供兼容Unicode和面向字符的IO功能,對于數據的來源和去向,字節流中有的字符流差不多都有對應的。

因此,最明智的做法是盡量嘗試使用Reader和Writer,一旦編譯無法通過,我們會發現不得不使用面向字節的類庫。

——《Java編程思想》

在這里插入圖片描述

常用流

文件流

FileInputStream,FileOutputStream,FileReader, FileWriter

package Note.iosystem;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class CopyFile {private String sourcePath, targetPath;CopyFile (String source, String target) {sourcePath = source;targetPath = target;}public void copy() throws IOException {FileInputStream fis = new FileInputStream(this.sourcePath);// 構造器第二個參數append傳遞true表示開啟追加寫模式FileOutputStream fos = new FileOutputStream(this.targetPath, true);byte [] bytes = new byte[1024];int readResult = 0;while(readResult >= 0) {// read方法傳遞一個長度為n的字節數組,每次讀取n位, 返回實際讀取的位數,讀到// 文件結束符返回 -1readResult  = fis.read(bytes);if(readResult > 0) {// write方法可以傳遞一個偏移量和長度,表示寫比特數組的0位開始,// 長度為readResult的數據fos.write(bytes, 0, readResult);}}// 記得要關閉流對象fis.close();fos.close();}public static void main(String[] args) throws IOException {CopyFile copyFile = new CopyFile("E:\\桌面文件\\媒體\\生而為人.m4a","E:\\桌面文件\\生而為人.m4a");copyFile.copy();}}
package Note.iosystem;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CopyFileByChar {private String sourcePath, targetPath;CopyFileByChar (String source, String target) {sourcePath = source;targetPath = target;}public void copy() throws IOException {FileReader fr = new FileReader(this.sourcePath);FileWriter fw = new FileWriter(this.targetPath, true);int readResult = 0;char [] chars = new char[1024];while(readResult >= 0) {readResult = fr.read(chars);if(readResult > 0){fw.write(chars, 0, readResult);}}fr.close();fw.close();}public static void main(String[] args) throws IOException {CopyFileByChar copyFileByChar = new CopyFileByChar("./src/Note/iosystem/DirList.java","./src/Note/iosystem/DirListCopyByChar.txt");copyFileByChar.copy();}
}

緩沖流

BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream

package Note.iosystem;import java.io.*;public class BufferDemo {private String from, to;public BufferDemo(String from, String to) {this.from = from;this.to = to;}public void copy() throws IOException {BufferedReader bfr = new BufferedReader(new FileReader(this.from));
//        char [] chars = new char[1024];
//        bfr.read(chars);BufferedWriter bfw = new BufferedWriter(new FileWriter(this.to));String line = bfr.readLine();while (line != null) {bfw.write(line);bfw.newLine();line = bfr.readLine();}bfr.close();bfw.close();}public static void main(String[] args) throws IOException {BufferDemo bd = new BufferDemo("./src/Note/iosystem/DirList.java","./src/Note/iosystem/DirListCopyByChar.txt");bd.copy();}
}

轉化流

InputStreamReader, OutputStreamWriter 允許設置編碼方式,將字節流轉換為字符流

package Note.iosystem;import java.io.*;public class ConversionStream {public static void main(String[] args) throws IOException {String filePath = "./src/Note/iosystem/DirList.java";String filePathGBK = "./src/Note/iosystem/DirListGBK.java";InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath));OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePathGBK), "GBK");char [] chars = new char[1024];int result = isr.read(chars);while (result >= 0) {osw.write(chars);result = isr.read(chars);}isr.close();osw.close();}
}

序列化流

  1. 想要將一個對象序列化,必須實現Serializable接口(他是一個標記接口)

  2. 反序列化時,對象對應的class文件必須存在,否則拋出ClassNotFoundException

  3. 類實現Serializable接口后,Java文件編譯成class文件時,會添加一個作為唯一標識的serialVersionUID,這個序列號在序列化時會寫入序列化文件,用來在反序列化時判斷class文件是否一致, 如果在序列化之后修改了類的定義但沒有重新序列化對象,在反序列化時就會拋出InvalidClassException異常,因為修改類定義會重新生產序列號。

    • 可以給定一個確定的序列化來解決這個問題,必須是static final long 的:

          private final static long serialVersionUID = 1L;
      
  4. 用static修飾的屬性值不會被序列化(靜態屬性優先加載),除此之外如果不想序列化某個屬性的值,可以使用transient修飾

package Note.iosystem.serialization;import java.io.Serializable;public class Person implements Serializable {private String name;private transient int age;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public Person(String n, int a) {this.age = a;this.name = n;}
}
package Note.iosystem.serialization;import java.io.*;public class ObjectOSDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {String outputPath = "./src/Note/iosystem/objectOutput";Person person = new Person("zhangSan", 17);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outputPath));oos.writeObject(person);oos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream(outputPath));Person p = (Person) ois.readObject();System.out.println(p);ois.close();}
}

… more …

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457483.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux Crontab 任務管理工具命令以及示例

Crontab 是 Linux 平臺下的一款用于循環執行例行任務的工具,Linux 系統由 cron (crond) 這個系統服務來控制任務 , Linux系統本來就有很多的計劃任務需要啟動 , 所以這個系統服務是默認開機啟動的 。 Linux 為使用者提供的計劃任務的命令就是 Crontab Crontab 是 Linux 下用來周…

Linux 網絡編程詳解一(IP套接字結構體、網絡字節序,地址轉換函數)

IPv4套接字地址結構 struct sockaddr_in {uint8_t sinlen;&#xff08;4個字節&#xff09;sa_family_t sin_family;&#xff08;4個字節&#xff09;in_port_t sin_port;&#xff08;2個字節&#xff09;struct in_addr sin_addr;&#xff08;4個字節&#xff09;char sin_zer…

地籍cad的lisp程序大集合_AutoCAD-LISP程序100例

{:soso_e179:}AutoCAD-LISP程序100例.JPG (143.82 KB, 下載次數: 28)2011-10-18 14:42 上傳有說明很好&#xff01;頂如果您使用 AutoCAD,下面的內容對您一定有幫助。在某些方面能大大提高您的工作效率。下面的程序均以源程序方式給出&#xff0c;您可以使用、參考、修改它。bg…

javascript中數組的22種方法

前面的話數組總共有22種方法&#xff0c;本文將其分為對象繼承方法、數組轉換方法、棧和隊列方法、數組排序方法、數組拼接方法、創建子數組方法、數組刪改方法、數組位置方法、數組歸并方法和數組迭代方法共10類來進行詳細介紹對象繼承方法數組是一種特殊的對象&#xff0c;繼…

javascript/jquery高度寬度詳情解說分析

為什么80%的碼農都做不了架構師&#xff1f;>>> 一、window對象表示瀏覽器中打開的窗口 二、window對象可以省略 一、document對象是window對象的一部分 二、瀏覽器的HTML文檔成為Document對象 window.location和document.location window對象的location屬性引用的…

農用地包括哪些地類_土地地類一覽表

一級類二級類三級類含義編號三大類名稱編號名稱編號名稱1農用地指直接用于農業生產的土地&#xff0c;包括耕地&#xff0c;園地&#xff0c;林地&#xff0c;牧草地及其他的農業用地11耕地指種植農作物、土地&#xff0c;包括熟地、新開發復墾整理地&#xff0c;休閑地、輪歇地…

紅黑樹插入時的自平衡

紅黑樹插入時的自平衡 紅黑樹實質上是一棵自平衡的二叉查找樹&#xff0c;引入帶顏色的節點也是為了方便在進行插入或刪除操作時&#xff0c;如果破壞了二叉查找樹的平衡性能通過一系列變換保持平衡。 紅黑樹的性質 每個節點要么是紅色&#xff0c;要么是黑色根節點必須是黑…

說一下自己對于 Linux 哲學的理解

查閱了一些資料&#xff0c;官方的哲學思想貌似是&#xff1a; 一切皆文件由眾多單一目的的小程序&#xff0c;一個程序只實現一個功能&#xff0c;多個程序組合完成復雜任務文本文件保存配置信息盡量避免與用戶交互什么&#xff0c;你問我的理解&#xff1f;哲學思想&#xff…

UWP學習記錄

微軟{X:Bind}、{Binding}資料網站 &#xff1a; https://msdn.microsoft.com/windows/uwp/xaml-platform/x-bind-markup-extension在View的ItemTemplate中綁定ViewModel的方法&#xff1a;1 <ItemsControl Name"XX" ItemsSource"{x:Bind VM.XXModels,ModeOne…

dw1000信標碼_DW1000方案工牌型UWB標簽,助力10厘米高精度室內定位!

DW1000方案工牌型UWB標簽&#xff0c;助力10厘米高精度室內定位&#xff01;發布日期&#xff1a;2019-04-01 瀏覽次數&#xff1a;244次微能信息(95power)推出一款工牌型UWB標簽VDU1510 &#xff0c;廣泛應用于超寬帶UWB定位系統&#xff0c;最高可實現10cm高精度人員定位。工…

【Java】HashMap源碼(1.7)

Life is not a ridiculous number of life, the meaning of life lies in life itself HashMap源碼 散列集 數組和鏈表可以保持元素插入的順序&#xff0c;對數組來說&#xff0c;他的優點是擁有連續的存儲空間&#xff0c;因此可以使用元素下標快速訪問&#xff0c;但缺點在…

Docker 基本用法

1.安裝&#xff1a; wget http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm rpm -ivh epel-release-6-8.noarch.rpm yum install docker-io -y2.獲取鏡像 pull docker pull ubuntu docker pull ubuntu:14.043.運行這個鏡像&#xff0c;在其中運行bash應用…

畫刷的使用

1.畫刷的定義&#xff1a; HBRUSH hBrush; windows 自定義的畫刷&#xff1a; WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH和NULL_BRUSH &#xff08;也叫HOLLOW_BRUSH&#xff09; 獲取方法如下&#xff1a; hBrush (HBRUSH) GetStockObject (GRAY_BR…

dataframe 控對象_iOS知識 - 常用小技巧大雜燴

1&#xff0c;打印View所有子視圖po [[self view]recursiveDescription]2&#xff0c;layoutSubviews調用的調用時機* 當視圖第一次顯示的時候會被調用。* 添加子視圖也會調用這個方法。* 當本視圖的大小發生改變的時候是會調用的。* 當子視圖的frame發生改變的時候是會調用的。…

【Java】jdk 1.8 新特性——Lambda表達式

Lambda表達式 jdk 1.8 新加入的特性&#xff0c;簡化了簡單接口的實現 函數式接口 函數式中只有一個待實現的方法&#xff0c;可以使用FunctionalInterface注解標注函數式接口.這個接口中只能有一個待實現的方法&#xff0c;但可以包含默認方法&#xff0c;靜態方法以及Obje…

【Todo】Java8新特性學習

參考這篇文章吧&#xff1a; http://blog.csdn.net/vchen_hao/article/details/53301073 還有一個系列轉載于:https://www.cnblogs.com/charlesblc/p/6123380.html

jsp調整字體大小font_html font標簽如何設置字體大小?

首先我們先來看看htmlfont標簽是如何來設置字體大小的&#xff1a;都只到htmlfont標簽是個專門用來設置字體的標簽&#xff0c;雖然在html5中用的會很少(因為都用css樣式來設置font標簽里面的屬性)&#xff0c;但是個人覺得font標簽還是相當強大的標簽的&#xff0c;為什么這么…

runtime官方文檔

OC是一種面向對象的動態語言&#xff0c;作為初學者可能大多數人對面向對象這個概念理解的比較深&#xff0c;而對OC是動態語言這一特性了解的比較少。那么什么是動態語言&#xff1f;動態語言就是在運行時來執行靜態語言的編譯鏈接的工作。這就要求除了編譯器之外還要有一種運…

【Java】synchronized關鍵字筆記

Java Synchronized 關鍵字 壹. Java并發編程存在的問題 1. 可見性問題 可見性問題是指一個線程不能立刻拿到另外一個線程對共享變量的修改的結果。 如&#xff1a; package Note.concurrency;public class Demo07 {private static boolean s true;public static void mai…

sql語句分析是否走索引_MySql 的SQL執行計劃查看,判斷是否走索引

在select窗口中&#xff0c;執行以下語句&#xff1a;set profiling 1; -- 打開profile分析工具show variables like %profil%; -- 查看是否生效show processlist; -- 查看進程use cmc; -- 選擇數據庫show PROFILE all; -- 全部分析的類型show index from t_log_account; ##查看…