<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。
Java.io 包中的流支援很多種格式,比如:基本型別、物件、在地化字元集等等。
一個流可以理解為一個資料的序列。輸入流表示從一個源讀取資料,輸出流表示向一個目標寫資料。
檔案依靠流進行傳輸,就像快遞依託於快遞員進行分發
Java 為 I/O 提供了強大的而靈活的支援,使其更廣泛地應用到檔案傳輸和網路程式設計中。
下圖是一個描述輸入流和輸出流的類層次圖。
方式一:
/** * 建立檔案,第一種方式 */ @Test public void createFile01() { String filePath = "D://1.txt"; File file = new File(filePath); try { file.createNewFile(); System.out.println("檔案建立成功!"); } catch (IOException e) { throw new RuntimeException(e); } }
第二種方式:
/** * 建立檔案,第二種方式 */ @Test public void createFile02() { File parentFile = new File("D:\"); String fileName = "news.txt"; File file = new File(parentFile, fileName); try { file.createNewFile(); System.out.println("檔案建立成功!"); } catch (IOException e) { throw new RuntimeException(e); } }
第三種方式:
/** * 建立檔案,第三種方式 */ @Test public void createFile03() { String parentPath = "D:\"; String fileName = "my.txt"; File file = new File(parentPath, fileName); try { file.createNewFile(); System.out.println("檔案建立成功!"); } catch (IOException e) { throw new RuntimeException(e); } }
範例程式碼:
/** * 獲取檔案資訊 */ @Test public void info() { // 建立檔案物件 File file = new File("D:\news.txt"); // 獲取檔案名字 System.out.println(file.getName()); // 獲取檔案路徑 System.out.println(file.getAbsolutePath()); // 獲取檔案父親目錄 System.out.println(file.getParent()); // 獲取檔案大小(位元組) System.out.println(file.length()); // 檔案是否存在 System.out.println(file.exists()); // 是不是一個檔案 System.out.println(file.isFile()); // 是不是一個目錄 System.out.println(file.isDirectory()); }
案例一:判斷指定目標是否存在,如果存在就刪除
// 判斷指定目標是否存在,如果存在就刪除 String filePath = "D:\news.txt"; File file = new File(filePath); if (file.exists()) { if (file.delete()) { System.out.println("刪除成功!"); } else { System.out.println("刪除失敗!"); } } else { System.out.println("檔案不存在!"); }
案例二:判斷目錄是否存在,如果存在即刪除
// 判斷目錄是否存在,如果存在即刪除 String dirPath = "D:\demo"; File file1 = new File(dirPath); if (file1.exists()) { if (file1.delete()) { System.out.println("刪除成功!"); } else { System.out.println("刪除失敗!"); } } else { System.out.println("目錄不存在!"); }
案例三:判斷指定目錄是否存在,不存在就建立目錄
// 判斷指定目錄是否存在,不存在就建立目錄 String persondir = "D:\demo\a\b\c"; File file2 = new File(persondir); if (file2.exists()) { System.out.println("該目錄存在!"); } else { if (file2.mkdirs()) { System.out.println("目錄建立成功!"); } else { System.out.println("目錄建立失敗!"); } }
注意:建立多級目錄,使用mkdirs,建立一級目錄使用mkdir
InputStream抽象類是所有類位元組輸入流的超類
FileInputStream
檔案輸入流,從檔案中讀取資料,範例程式碼:
單個位元組的讀取,效率較低:
/** * read()讀檔案 */ @Test public void readFile01() throws IOException { String filePath = "D:\hacker.txt"; int readData = 0; FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(filePath); // 讀檔案,一個字元一個字元讀取,返回字元的ASCII碼,檔案尾部返回-1 while ((readData = fileInputStream.read()) != -1) { System.out.print((char)readData); } } catch (IOException e) { throw new RuntimeException(e); } finally { // 關閉流資源 fileInputStream.close(); } }
注意:使用位元組流的方式,無法讀取檔案中的中文字元,如需讀取中文字元,最好使用字元流的方式
使用byte陣列的方式讀取,這使得可以讀取中文,並且有效的提升讀取效率:
/** * read(byte[] b)讀檔案 * 支援多位元組讀取,提升效率 */ @Test public void readFile02() throws IOException { String filePath = "D:\hacker.txt"; int readData = 0; int readLen = 0; // 位元組陣列 byte[] bytes = new byte[8]; // 一次最多讀取8個位元組 FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(filePath); // 讀檔案,從位元組陣列中直接讀取 // 如果讀取正常,返回實際讀取的位元組數 while ((readLen = fileInputStream.read(bytes)) != -1) { System.out.print(new String(bytes, 0, readLen)); } } catch (IOException e) { throw new RuntimeException(e); } finally { // 關閉流資源 fileInputStream.close(); } }
使用範例:(向hacker.txt檔案中加入資料)
/** * FileOutputStream資料寫入檔案 * 如果該檔案不存在,則建立該檔案 */ @Test public void writeFile() throws IOException { String filePath = "D:\hacker.txt"; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(filePath); // 寫入一個位元組 // fileOutputStream.write('G'); // 寫入一個字串 String s = "hello hacker!"; // fileOutputStream.write(s.getBytes()); // 寫入字串指定範圍的字元 fileOutputStream.write(s.getBytes(),0,3); } catch (FileNotFoundException e) { throw new RuntimeException(e); } finally { assert fileOutputStream != null; fileOutputStream.close(); } }
我們發現,使用這樣的FileOutputStream構造器無法實現向檔案中追加內容,只能進行覆蓋,我們可以在初始化物件的時候這樣解決:
fileOutputStream = new FileOutputStream(filePath,true);
我們可以結合位元組輸入和輸出流模擬一個檔案拷貝的程式:
/** * 檔案拷貝 * 思路: * 建立檔案的輸入流,將檔案讀取到程式 * 建立檔案的輸出流,將讀取到的檔案資料寫入到指定的檔案 */ @Test public void Copy() throws IOException { String srcFilePath = "D:\hacker.txt"; String destFilePath = "D:\hello.txt"; FileInputStream fileInputStream = null; FileOutputStream fileOutputStream = null; try { fileInputStream = new FileInputStream(srcFilePath); fileOutputStream = new FileOutputStream(destFilePath); // 定義位元組陣列,提高效率 byte[] buf = new byte[1024]; int readLen = 0; while ((readLen = fileInputStream.read(buf)) != -1) { // 邊讀邊寫 fileOutputStream.write(buf, 0, readLen); } System.out.println("拷貝成功!"); } catch (IOException e) { throw new RuntimeException(e); } finally { if (fileInputStream != null){ fileInputStream.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } } }
字元輸入流FileReader用於從檔案中讀取資料
範例:
import java.io.FileWriter; import java.io.IOException; /** * 字元輸出流 */ public class FileWriteTest { public static void main(String[] args) throws IOException { String filePath = "D:\hacker.txt"; // 建立物件 FileWriter fileWriter = null; try { char[] chars = {'a', 'b', 'c'}; fileWriter = new FileWriter(filePath, true); // 寫入單個字元 // fileWriter.write('H'); // 寫入字元陣列 // fileWriter.write(chars); // 指定陣列的範圍寫入 // fileWriter.write(chars, 0, 2); // 寫入字串 // fileWriter.write("解放軍萬歲!"); // 指定字串的寫入範圍 fileWriter.write("hacker club", 0, 5); } catch (IOException e) { throw new RuntimeException(e); } finally { // FileWriter是需要強制關閉檔案或重新整理流的,否則資料會儲存失敗 fileWriter.close(); } } }
字元輸出流FileWrite用於寫資料到檔案中:
範例:
import java.io.FileWriter; import java.io.IOException; /** * 字元輸出流 */ public class FileWriteTest { public static void main(String[] args) throws IOException { String filePath = "D:\hacker.txt"; // 建立物件 FileWriter fileWriter = null; try { char[] chars = {'a', 'b', 'c'}; fileWriter = new FileWriter(filePath, true); // 寫入單個字元 // fileWriter.write('H'); // 寫入字元陣列 // fileWriter.write(chars); // 指定陣列的範圍寫入 // fileWriter.write(chars, 0, 2); // 寫入字串 // fileWriter.write("解放軍萬歲!"); // 指定字串的寫入範圍 fileWriter.write("hacker club", 0, 5); } catch (IOException e) { throw new RuntimeException(e); } finally { // FileWriter是需要強制關閉檔案或重新整理流的,否則資料會儲存失敗 fileWriter.close(); } } }
使用FileWriter,記得關閉檔案或者重新整理流!
到此這篇關於Java I/O流使用範例詳解的文章就介紹到這了,更多相關Java I/O流內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45