java 中获取file的长度为0_Java核心技术梳理-IO
一、引言
IO(輸入/輸出),輸入是指允許程序讀取外部數據(包括來自磁盤、光盤等存儲設備的數據)、用戶輸入數據。輸出是指允許程序記錄運行狀態,將程序數據輸出到磁盤、光盤等存儲設備中。
IO的主要內容包括輸入、輸出兩種IO流,這兩種流中又分為字節流和字符流,字節流是以字節為單位來處理輸入、輸出流,而字符流是以字符為單位來處理輸入、輸出流。
回到頂部
二、File 類
File 類是用來操作文件和目錄的,File能創建、刪除、重命名文件和目錄,File不能訪問文件內容本身,File 類可以通過文件路徑字符串來創建對象,創建完對象之后有很多方法來操作文件和目錄:
2.1 構造方法
- File(String pathname):根據一個路徑得到File對象
- File(String parent, String child):根據一個目錄和一個子文件/目錄得到File對象
- File(File parent, String child):根據一個父File對象和一個子文件/目錄得到File對
2.2 創建方法
//在當前路徑來創建一個File對象File file = new File("1.txt");//創建文件System.out.println(file.createNewFile());File file2 = new File("temp"); //創建對象對應的目錄System.out.println(file2.mkdir());2.3 重命名和刪除功能
//把文件重命名為指定的文件路徑file2.renameTo(new File("temp2"));//刪除文件或者文件夾file2.delete();注:重命名中如果路徑名相同,就是改名,如果路徑名不同,就是改名并剪切。刪除不走回收站,要刪除一個文件夾,請注意該文件夾內不能包含文件或者文件夾。
2.4 判斷功能
//判斷文件或目錄是否存在System.out.println(file.exists());//判斷是否是文件System.out.println(file.isFile());//判斷是否是目錄System.out.println(file.isDirectory());//是否為絕對路徑System.out.println(file.isAbsolute());//文件或目錄是否可讀System.out.println(file.canRead());//文件或目錄是否可寫System.out.println(file.canWrite());2.5 獲取功能
//返回文件內容長度System.out.println(file.length());//獲取文件或目錄名System.out.println(file.getName());//獲取文件或目錄相對路徑System.out.println(file.getPath());//獲取文件或目錄絕對路徑System.out.println(file.getAbsolutePath());//獲取上一級路徑System.out.println(file.getAbsoluteFile().getParent());//返回當前目錄的子目錄或文件的名稱String[] list = file1.list();for (String fileName : list) { System.out.println(fileName);}//返回當前目錄的子目錄或文件,返回的是File數組File[] files = file1.listFiles();//返回系統的所有根路徑File[] listRoots = File.listRoots();for (File root : listRoots) { System.out.println(root);}回到頂部
三、IO 流
實現輸入/輸出的基礎是IO流,Java把不同的源之間的數據交互抽象表達為流,通過流的方式允許Java程序使用相同的方式來訪問不同的數據源。用于操作流的類都在IO包中。
3.1 流的分類
按照不同的分類方式,流也可以分為不同類型
- 輸入流:從中讀取數據,而不能向其寫入數據
- 輸出流:向其寫入數據,而不能讀取數據
3.2 InputStream與Reader
InputStream和Reader是所有輸入流的抽象基類,這是輸入流的模板,InputStream中有三個方法
- int read() :從輸入流讀取單個字節,返回所讀取的字節數據。
- int read(byte b[]):從輸入流中最多讀取b.length個字節的數據,并將其存儲在數組b中。
- int read(byte b[], int off, int len):從輸入流中最多讀取len個字節的數據,并將其存儲在數組b中,放入的位置是從off中開始。
Reader中也有三個方法
- int read() :從輸入流讀取單個字符,返回所讀取的字符數據。
- int read(char cbuf[]):從輸入流中最多讀取cbuf.length個字符的數據,并將其存儲在數組cbuf中。
- int read(char cbuf[], int off, int len):從輸入流中最多讀取len個字符的數據,并將其存儲在數組cbuf中,放入的位置是從off中開始。
- 兩個類的方法基本相同,用法相同,只是操作單位不一樣
3.3 OutputStream與Writer
OutputStream與Writer是所有輸出流的抽象基類,是輸出流模板,OutputStream有三個方法:
- void write(int b):指定字節輸出到流中
- void write(byte b[]):將指定字節數組輸出到流中
- void write(byte b[], int off, int len):將指定字節數組從off位置到len長度輸出到流中
Writer中也有三個方法:
- void write(int b):指定字符輸出到流中
- void write(char buf[]):將指定字符數組輸出到流中
- void write(char cubf[], int off, int len):將指定字符數組從off位置到len長度輸出到流中
由于Writer是以字符為單位進行操作,那可以使用String 來代替,于是有另外的方法
- void write(String str):將str字符串輸出到流中
- void write(String str, int off, int len):將str從off位置開始長度為len輸出到流中
注:操作流時一定要記得關閉流,因為打開的IO資源不屬于內存資源,垃圾回收無法回收。
四、輸入/輸出流體系
Java的輸入輸出流提供了40多個類,要全部都記住很困難也沒有必要,我們可以按照功能進行下分類,其實是非常有規律的
一般如果輸入/輸出的內容是文本內容,應該考慮使用字符流,如果輸入/輸出內容是二進制內容,則應該考慮使用字節流。
4.1 轉換流
體系中提供了兩個轉換流,實現將字節流轉換成字符流,InputStreamReader將字節輸入流轉換成字符輸入流,OutputStreamWriter將字節輸出流轉換成字符輸出流,System.in代表標準輸入,這個標準輸入是字節輸入流,但是鍵盤輸入的都是文本內容,這個時候我們可以InputStreamReader轉換成字符輸入流,普通的Reader讀取內容不方便,我們可以使用BufferedReader一次讀取一行數據,如:
//先將System.in轉換成Reader 對象InputStreamReader inputStreamReader = new InputStreamReader(System.in);//再將Reader包裝成BufferedReaderBufferedReader bufferedReader = new BufferedReader(inputStreamReader);String line = null;while ((line = bufferedReader.readLine()) != null) { if (line.equals("exit")) { System.exit(1); } System.out.println("輸入的內容是:" + line);}BufferedReader具有緩沖功能,在沒有讀到換行符則阻塞,讀到換行符再繼續。
4.2 推回輸入流
推回輸入流PushbackInputStream和PushbackReader中都提供了如下方法:
- void unread(int b) :將一個字節/字符推回到推回緩沖區,從而允許重復讀取剛剛讀取的內容。
- void unread(byte[] b/char[] b, int off, int len) :將一個字節/字符數組里從off開始,長度為len字節/字符的內容推回到推回緩沖區,從而允許重復讀取剛剛讀取的內容。
- void unread(byte[] b/char[]):將一個字節/字符數組內容推回到推回緩沖區,從而允許重復讀取剛剛讀取的內容。
這兩個推回流都帶有一個推回緩沖區,當調用unread()方法時,系統將會把指定的內容推回到該緩沖區,而當每次調用read方法時會優先從推回緩沖區讀取,只有完全讀取了推回緩沖區的內容后,但還沒有read()所需的數組時才會從原輸入流中讀取。
//創建PushbackReader對象,指定推回緩沖區的長度為64PushbackReader pushbackReader = new PushbackReader(new FileReader("StreamTest.java"), 64);char[] buf = new char[32];//用以保存上次讀取的字符串內容String lastContent = "";int hasRead = 0;//循環讀取文件內容while ((hasRead = pushbackReader.read(buf)) > 0) { //將讀取的內容轉換成字符串 String content = new String(buf, 0, hasRead); int targetIndex = 0; if ((targetIndex = (lastContent + content).indexOf("new PushbackReader")) > 0) { //將本次內容和上次的內容一起推回緩沖區 pushbackReader.unread((lastContent + content).toCharArray()); //重新定義一個長度為targetIndex的char數組 if (targetIndex > 32) { buf = new char[targetIndex]; } //再次讀取指定長度的內容 pushbackReader.read(buf, 0, targetIndex); //打印讀取的內容 System.out.print(new String(buf, 0, targetIndex)); System.exit(0); } else { //打印上次讀取的內容 System.out.print(lastContent); //將本次內容設為上次讀取的內容 lastContent = content; }}五、RandomAccessFile
RandomAccessFile是Java輸入/輸出流體系中最豐富的文件內容訪問類,提供了眾多的方法來訪問文件內容,既可讀取文件內容,也可以向文件輸出數據,RandomAccessFile可以自由訪問文件的任意位置。
RandomAccessFile包含一個記錄指針,用以標識當前讀和寫的位置,當創建新對象時,指針位置在0處,而當讀/寫了N個字節后,指針就會向后移動N個字節,并且RandomAccessFile可以自動的移動該指針位置,當然我們也可以直接的獲取指針的位置。
- getFilePointer():獲取文件記錄指針的當前位置。
- seek(long pos):將文件記錄指針定位到pos位置。
RandomAccessFile有兩個構造函數:
- RandomAccessFile(File file, String mode):使用File文件,指定文件本身 RandomAccessFile(String name, String mode):使用文件名稱,指定文件
其中還有一個參數mode(訪問模式),訪問模式有4個值:
- r:以只讀方式打開文件
- rw:以讀、寫方式打開文件,如果文件不存在,則創建
- rws:以讀、寫方式打開文件,并要求對文件的內容或者元數據的每個更新都同步寫入到底層存儲設備
- rwd:以讀、寫方式打開文件,并要求對文件的內容的每個更新都同步寫入到底層存儲設備
總結
以上是生活随笔為你收集整理的java 中获取file的长度为0_Java核心技术梳理-IO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数的凹凸性证明_理解图灵机和递归函数的
- 下一篇: java程序员面试需要注意什么_Java