Java_IO流(精讲)包含练习题及答案
Java_IO流(精講)包含練習題及答案——建議收藏
包含常用的所有屬性與函數的示例,并且對【字符流】【字節流】分別做的【讀寫】操作示例。
目錄
1、Java Io流的概念
按照流的流向分,可以分為輸入流和輸出流。
按照操作單元劃分,可以劃分為字節流和字符流。
IO流常用到的五個類和一個接口
2、File
文件操作常用屬性與函數(讀取類):?
文件操作常用屬性與函數(操作類):??
?練習題:
獲取E盤下所有文件名是示例:
3、字符流的文件讀取
單個讀取:
循環讀取:
4、字符流寫入
寫入測試:
練習題:
5、字符流復制文件
練習題:
6、字節流的概念
練習題:
1、Java Io流的概念
流:代表任何有能力產出數據的數據源對象或者是有能力接受數據的接收端對象。
流的本質:數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀的進行數據操作。
作用:為數據源和目的地建立一個輸送通道
Java IO所采用的模型 Java的IO模型設計非常優秀,它使用Decorator[?dek?re?t?(r)](裝飾者)模式,按功能劃分Stream[stri?m]英[stri?m]美,您可以動態裝配這些Stream,以便獲得您需要的功能。
例如,您需要一個具有緩沖的文件輸入流,則應當組合使用FileInputStream(字符流)和BufferedInputStream(字節流)。?
按照流的流向分,可以分為輸入流和輸出流。
- 輸入流: 只能從中讀取數據,而不能向其寫入數據。
- 輸出流:只能向其寫入數據,而不能向其讀取數據。
按照操作單元劃分,可以劃分為字節流和字符流。
字節流和字符流的用法幾乎完成全一樣,區別在于字節流和字符流所操作的數據單元不同,字節流操作的單元是數據單元是8位的字節,字符流操作的是數據單元為16位的字符。?
IO流常用到的五個類和一個接口
在整個Java.io包中最重要的就是5個類和一個接口。
5個類指的是File、OutputStream、InputStream、Writer、Reader;
一個接口指的是Serializable(序列化)。掌握了這些IO的核心操作那么對于Java中的IO體系也就有了一個初步的認識了。
2、File文件操作
File是一個標準的文件類 File類對象對應于文件系統中的一個目錄或文件 File類對象描述文件路徑、名字、長度、可否讀寫等屬性,可用來命名 文件、查詢文件屬性或處理目錄,但不能讀寫文件。
文件操作常用屬性與函數(讀取類):?
file.separator;//為系統的目錄符號/或\ pathSeparator;//為系統的分隔符; exists();//判斷是否存在這個文件 isFile();//判斷是文件 isDirectory();//判斷是目錄 getName();//文件名 getPath();//整個路徑名/相對路徑名 length();//文件長度(大小) canRead();//文件讀的屬性 canWrite();//文件寫的屬性 getAbsolutePath();//獲得文件路徑,如果是相對路徑根據項目路徑補充完整 lastModified();//最后一次修改時間測試編碼:
package IO_test;import java.io.File;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) {File file=new File("E:/");System.out.println(file.separator);//為系統的目錄符號/或\System.out.println(file.pathSeparator);//為系統的分隔符;System.out.println(file.exists());//判斷是否存在這個文件System.out.println(file.isFile());//判斷是文件System.out.println(file.isDirectory());//判斷是目錄System.out.println(file.getName());//文件名System.out.println(file.getPath());//整個路徑名/相對路徑名System.out.println(file.length());//文件長度(大小)System.out.println(file.canRead());//文件讀的屬性System.out.println(file.canWrite());//是否可寫//獲得文件路徑,如果是相對路徑根據項目路徑補充完整System.out.println(file.getAbsolutePath());System.out.println(file.lastModified());//最后一次修改時間System.out.println(file.getPath());//整個路徑名/相對路徑名} }效果:
文件操作常用屬性與函數(操作類):??
renameTo(new File);重命名 delete();刪除目錄 mkdir();創建目錄 mkdirs();創建多層目錄 createNewFile();創建新文件測試編碼:
package IO_test;import java.io.File; import java.io.IOException;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) {//重命名File file=new File("E:/test/demo.txt");file.renameTo(new File("E:/test/demo1.txt"));//創建單層目錄File fileMk=new File("E:/test/demo");fileMk.mkdir();//創建多層目錄File fileMks=new File("E:/test/demo/a/b/c/d/e/f/g");fileMks.mkdirs();//刪除目錄File delDir=new File("E:/test/demo/a/b/c/d/e/f/g");delDir.delete();//創建文件File fileCreate=new File("E:/test/demo/file.txt");try {fileCreate.createNewFile();} catch (IOException e) {e.printStackTrace();}} }效果:
練習題:
1、字符流處理數據的基本單位是( A )。A、2字節 B、1字節C、1024字節 D、1024B2、現有一篇中文的文章為.txt文件,我們應該使用哪種流操作( B ),因為( D )。A、字節流 B、字符流C、字節流每次都讀取一個字節,任何文件都能操作 D、由于是中文,一個中文占2個字符,用字節流去讀會出現亂碼,所以采用字符流。每次去讀2個字符,不會出現編碼錯誤。3、file.getPath()與file.getAbsolutePath()的說法正確的是(多選)( BD )。 A、getPath一定返回文件的絕對位置 B、getAbsolutePath一定返回文件的絕對位置 C、默認相對路徑返回結果相同 D、默認絕對路徑返回結果相同獲取E盤下所有文件名是示例:
//需要的包 import java.io.File; import java.util.Arrays; //編碼 File f = new File("E:/"); String []s = f.list(); System.out.println(Arrays.toString(s)); //獲得E盤下面所有文件的路徑: File [] files = f.listFiles(); System.out.println(Arrays.toString(files)); //獲取系統盤符 File [] files1 = File.listRoots(); System.out.println(Arrays.toString(files1));3、字符流的文件讀取
為什么用字符流讀取文本文件:
1、由于每個中文占用空間為2字節,故而使用字節流讀取會產生亂碼
2、每個中文占2字節,與char大小相同,所有的中文均與某個char值相對應
純文本的讀取,步驟:
1.建立聯系 file對象
2.選擇流: Reader FileReader
3.讀取:char[] flush=new char[1024];//或逐一讀取
4.關閉資源 fr.close()
字節流讀取文件VS字符流讀取純文本
1.使用流不同,前者使用“stream”后者是“reader”
2.讀取使用數組不同,前者是byte數組,后者是char數組
3.速度不同,后者速度要比前者快
單個讀取:
編碼示例:
package IO_test;import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) {FileReader fr = null;try {fr = new FileReader(new File("E:/test/demo1.txt"));int read=fr.read();System.out.println((char)read);} catch (IOException e) {e.printStackTrace();}} }效果:
循環讀取:
編碼示例:
package IO_test;import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) {FileReader fr = null;try {fr = new FileReader(new File("E:/test/demo1.txt"));while (true) {int read = fr.read();if (read == -1) {break;}System.out.print((char) read);}} catch (IOException e) {e.printStackTrace();}} }執行效果:
4、字符流寫入
寫入測試:
編碼示例:
package IO_test;import java.io.*;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) throws IOException {FileWriter fw= null;try {fw = new FileWriter(new File("E:/test/demo1.txt"));fw.write("I HAVE A GOOD IDEA!");} catch (IOException e) {e.printStackTrace();}finally {fw.flush();//刷新,寫完必須刷一下fw.close();} //每次可以寫入一個字符串, //統一寫完之后需要刷新將數據寫入到對應文件,并清空緩存區 //讀完要關閉,fw.close();一般在finally中寫} }練習題:
1、FileReader fr讀取的是一個文件還是一個字符串( A )。A、文件 B、字符串2、字符流的FileWriter在write某個字符串之后一定要執行哪個函數才能將數據寫進對應的文件( B )。A、writed() B、flush()C、wait() D、closes()3、FileWriter中flush函數的作用是( B )。A、刷新緩沖區的數據 ? B、清空緩沖區并完成文件寫入操作C、關閉寫入流 ? D、重新開啟緩沖區5、字符流復制文件
將某文件夾下的文件單獨復制一份,并在同一個文件夾內重新修改名稱后粘貼一份。
1、讀取源文件。
2、通過FileReader逐一讀取。
3、通過FileWriter將逐一讀取的字符流寫入到預先給予的位置上。
4、關閉寫入流、關閉讀取流。
編碼示例:
package IO_test;import java.io.*;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) throws IOException {FileReader fr = new FileReader(new File("E:/test/demo1.txt"));FileWriter fw = new FileWriter(new File("E:/test/demo2.txt"));int i = 0;char[] geshu = new char[10];while (true) {i = fr.read(geshu);if (i == -1) {break;}fw.write(geshu, 0, i);fw.write(i);}fw.flush();//里面慢,外面快} }效果如下:?
練習題:
1、使用Java IO流實現對文本文件的讀寫過程中,需要處理下列( B )異常。A、ClassNotFoundException B、IOExceptionC、SQLException D、RemoteException2、在Java的IO操作中,( D )方法可以用來刷新流的緩沖。A、void release() B、void close()C、void remove() D、void flush()3、下列對于FileReader fr=new FileReader("url.txt")方法的返回值正確的( B )。A、String str=fr.read();B、int str=fr.read();C、byte str=fr.read();D、char str=fr.read();6、字節流的概念
IO:數據從硬盤流向內存(Input),或者從內存流向硬盤(Output)。
字節流——傳輸過程中,傳輸數據的最基本單位是字節的流。
按操作數據單元分:
字節流、字符流
|-字節流:8位
|-字符流:16位
可以操作所有文件,包括文本文件、視頻、音頻、壓縮文件等等都可以用字節流讀寫。?
| 字節流 | 字符流 | |
| 輸入流 | InputStream | Reader |
| 輸出流 | OutputStream | Writer |
編碼示例:
這里采用【sql】與【MP4】文件進行操作,并且操作成功,無亂碼出現。
【sql】文件復制:
package IO_test;import java.io.*;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) throws IOException {FileInputStream fis = null;FileOutputStream fos = null;try {//將文件復制一份到同一文件夾下,并更換名稱fis = new FileInputStream(new File("E:\\test\\DoodDB.sql"));fos = new FileOutputStream(new File("E:\\test\\DoodDB1.sql"));byte[] buf = new byte[1024];//每次讀取1024的字節(1024b)while (true) {int i = fis.read(buf);if (i == -1) {break;}//當讀取不到時,結束循環fos.write(buf, 0, i);//每次將讀取的1024b存儲到寫入的緩沖區} fos.flush();//清空緩沖區,將內容寫到新文件內fos.close();fis.close();//關閉讀取寫入流}catch (Exception e) { e.printStackTrace(); }} }效果:
【MP4】文件復制
package IO_test;import java.io.*;/*** @author laoshifu* @date 2021年11月28日*/ public class Action {public static void main(String[] args) throws IOException {long start=System.currentTimeMillis();FileInputStream fis = null;FileOutputStream fos = null;try {//將文件復制一份到同一文件夾下,并更換名稱fis = new FileInputStream(new File("E:\\test\\2020info.mp4"));System.out.println("文件大小:"+fis.available());fos = new FileOutputStream(new File("E:\\test\\2020info_copy.mp4"));byte[] buf = new byte[1024];//每次讀取1024的字節(1024b)while (true) {int i = fis.read(buf);if (i == -1) {break;}//當讀取不到時,結束循環fos.write(buf, 0, i);//每次將讀取的1024b存儲到寫入的緩沖區} fos.flush();//清空緩沖區,將內容寫到新文件內fos.close();fis.close();//關閉讀取寫入流}catch (Exception e) { e.printStackTrace(); }long end=System.currentTimeMillis();System.out.println("消耗:"+(end-start)+"毫秒");} }效果如下:?
可看到文件效果:
練習題:
1、數據從硬盤流向內存( A ),或者從內存流向硬盤( D )。A、Input B、ReadC、Write D、Output2、字節流不善于操作的文件是( B )。A、圖片 B、中文文本 C、視頻 D、音樂3、下列函數那些不是FileOutputStream的write函數的重載方法 ( D )。A、write(byte[]b) ? B、write(int b)C、write(byte[]b,int off,int len) D、write(byte b,int len)以上為【Java_IO】的常用所有內容,希望能對大家有所幫助,但是有一些【服務器】容易出現的異常,由于復現麻煩,故而并未匯總。
例如:【IO流文件的相對路徑及獲取系統路徑方法_紅目香薰-CSDN博客】
希望能大家有所幫助,可以收藏,價值較高。
總結
以上是生活随笔為你收集整理的Java_IO流(精讲)包含练习题及答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的Go+语言初体验——ubuntu安装
- 下一篇: 【2022年蓝桥杯】蓝桥杯第一次海选考试