文件流【文件輸入流】

文件流:使用文件輸入流讀取文件中的數據:

public class FISDemo {public static void main(String[] args) throws IOException {//將fos.dat文件中的字節讀取回來/*fos.dat文件中的數據:00000001 00000010*/FileInputStream fis = new FileInputStream("fos.dat");

java.io.InputStream(所有字節輸入流的超類)定義著讀取字節的相關方法
? ? ? ? ? ? int read()
? ? ? ? ? ? 讀取1個字節并以int型整數返回讀取到的字節內容,返回的int值中對應的2進制的"低八位"
? ? ? ? ? ? 就是讀取到的數據。如果返回的int值為整數-1(這是一個特殊值,32位2進制全都是1)表達是流讀取到了末尾了。
?

int read(byte[] data)

文件輸入流重寫了上述兩個方法用來從文件中讀取對應的字節。

?fos.dat文件中的數據:
? ? ? ? ? ? ?00000001 00000010
? ? ? ? ? ? ?^^^^^^^^
? ? ? ? ? ?第一次讀取的字節

? ? ? ? ? ? ?當我們第一次調用:
? ? ? ? ? ? ?int d = fis.read();//讀取的是文件中第一個字節

? ? ? ? ? ? ?該int值d對應的2進制:
? ? ? ? ? ? ?00000000 00000000 00000000 00000001
? ? ? ? ? ? ?|------自動補充24個0-------| ^^^^^^^^
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 讀取到的數據
? ? ? ? ? ? ?而該2進制對應的整數就是1.

  int d = fis.read();//讀取到的就是整數1System.out.println(d);

fos.dat文件中的數據:
? ? ? ? ? ? ?00000001 00000010
? ? ? ? ? ? ? ? ? ? ? ^^^^^^^^
? ? ? ? ? ? ? ? ? ? ?第二次讀取的字節

? ? ? ? ? ? ?當我們第二次調用:
? ? ? ? ? ? ?d = fis.read();//讀取的是文件中第二個字節

? ? ? ? ? ? ?該int值d對應的2進制:
? ? ? ? ? ? ?00000000 00000000 00000000 00000010
? ? ? ? ? ? ?|------自動補充24個0-------| ^^^^^^^^
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 讀取到的數據
? ? ? ? ? ? ?而該2進制對應的整數就是2.

d = fis.read();//2System.out.println(d);

fos.dat文件中的數據:
? ? ? ? ? ? ?00000001 00000010 文件末尾
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?^^^^^^^^
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 沒有第三個字節

? ? ? ? ? ? ?當我們第三次調用:
? ? ? ? ? ? ?d = fis.read();//讀取到文件末尾了!

? ? ? ? ? ? ?該int值d對應的2進制:
? ? ? ? ? ? ?11111111 11111111 11111111 11111111
? ? ? ? ? ? ?該數字是正常讀取1個字節永遠表達不了的值。并且-1的2進制格式好記。因此用它表達讀取到了末尾。

d = fis.read();//-1System.out.println(d);fis.close();

文件復制

利用文件輸入流與輸出流實現文件的復制操作

public class CopyDemo {public static void main(String[] args) throws IOException {//用文件輸入流讀取待復制的文件
//        FileInputStream fis = new FileInputStream("image.jpg");FileInputStream fis = new FileInputStream("01.rmvb");//用文件輸出流向復制文件中寫入復制的數據
//        FileOutputStream fos = new FileOutputStream("image_cp.jpg");FileOutputStream fos = new FileOutputStream("01_cp.rmvb");/*原文件image.jpg中的數據10100011 00111100 00001111 11110000....^^^^^^^^讀取該字節第一次調用:int d = fis.read();d的2進制:00000000 00000000 00000000 10100011讀到的字節fos向復制的文件image_cp.jpg中寫入字節第一次調用:fos.write(d);作用:將給定的int值d的2進制的"低八位"寫入到文件中d的2進制:00000000 00000000 00000000 10100011寫出字節調用后image_cp.jpg文件數據:10100011*//*循環條件是只要文件沒有讀到末尾就應該復制如何直到讀取到末尾了呢?前提是:要先嘗試讀取一個字節,如果返回值是-1就說明讀到末尾了如果返回值不是-1,則說明讀取到的是一個字節的內容,就要將他寫入到復制文件中*/int d;//先定義一個變量,用于記錄每次讀取到的數據long start = System.currentTimeMillis();//獲取當前系統時間while ((d = fis.read()) != -1) {fos.write(d);}long end = System.currentTimeMillis();System.out.println("復制完畢!耗時:" + (end - start) + "ms");fis.close();fos.close();}
}

塊讀寫的文件復制操作

nt read(byte[] data) 一次性從文件中讀取給定的字節數組總長度的字節量,并存入到該數組中。 返回值為實際讀取到的字節量。若返回值為-1則表示讀取到了文件末尾。

塊寫操作 void write(byte[] data) 一次性將給定的字節數組所有字節寫入到文件中

void write(byte[] data,int offset,int len) 一次性將給定的字節數組從下標offset處開始的連續len個字節寫入文件中里面:


/*** 通過提高每次讀寫的數據,減少讀寫次數可以提高讀寫效率。*/
public class CopyDemo2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("01.rmvb");FileOutputStream fos = new FileOutputStream("01_cp.rmvb");/*塊讀:一次性讀取一組字節塊寫:一次性將寫出一組字節java.io.InputStream上定義了塊讀字節的方法:int read(byte[] data)一次性讀取給定字節數組length個字節并從頭開始裝入到數組中。返回值為實際讀取到的字節量如果返回值為-1則表示流讀取到了末尾。文件流重寫了該方法,作用是塊讀文件里的數據。java.io.OutputStream上定義了塊寫字節的方法:void write(byte[] data)一次性將給定的字節數組中所有的字節寫出。void write(byte[] data,int offset,int len)一次性將給定的字節數組data中從下標offset處開始的連續len個字節寫出。原文件數據(假設文件共6個字節):11110000 00001111 01010101 11111111 00000000 10101010byte[] buf = new byte[4];//創建一個長度為4的字節數組buf默認的樣子(每個元素若以2進制表現):{00000000,00000000,00000000,00000000}int len;//記錄每次實際讀取的字節數當第一次調用:len = fis.read(buf);由于字節數組buf的長度為4.因此可以一次性最多從文件中讀取4個字節并裝入到buf數組中返回值len表示的整數是這次實際讀取到了幾個字節。原文件數據(假設文件共6個字節):11110000 00001111 01010101 11111111 00000000 10101010^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^第一次讀取的4個字節buf:{11110000,00001111,01010101,11111111}len:4 表示本次讀取到了4個字節第二次調用:len = fis.read(buf);原文件數據(假設文件共6個字節):11110000 00001111 01010101 11111111 00000000 10101010 文件末尾了^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^本次實際只能讀取到2個字節buf:{00000000,10101010,01010101,11111111}|本次新讀的2字節數據| |---上次的舊數據---|len:2表示本次實際只讀取到了2個字節。它的意義就是告訴你buf數組中前幾個字節是本次真實讀取到的數據第三次調用:len = fis.read(buf);原文件數據(假設文件共6個字節):11110000 00001111 01010101 11111111 00000000 10101010 文件末尾了^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^buf:{00000000,10101010,01010101,11111111} 沒有任何變化!len:-1 表示本次讀取時已經是文件末尾了!!*//*00000000 8位2進制 1byte  1字節1024byte = 1kb1024kb = 1mb1024mb = 1gb1024gb = 1tb*//*編譯完該句代碼:byte[] buf = new byte[10240];在實際開發中,有時候用一個計算表達式更能表現這個值的含義時,我們不妨使用計算表達式long t = 864000000;long t = 60 * 60 * 24 * 1000;*/byte[] buf = new byte[1024 * 10];//10kbint len;//記錄每次實際讀取到的字節數long start = System.currentTimeMillis();while ((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}long end = System.currentTimeMillis();System.out.println("復制完畢,耗時:" + (end - start) + "ms");fis.close();fos.close();}
}

寫文本數據

String提供方法: byte[] getBytes(String charsetName) 將當前字符串轉換為一組字節

參數為字符集的名字,常


/*** 使用文件輸出流向文件中寫入文本數據*/
public class WriteStringDemo {public static void main(String[] args) throws IOException {/*1:創建一個文件輸出流2:將寫出的文字先轉換為2進制(一組字節)3:關閉流文件流有兩種創建方式:1:覆蓋模式,對應的構造器:FileOutputStream(String filename)FileOutputStream(File file)所謂覆蓋模式:文件流在創建是若發現該文件已存在,則會將該文件原內容全部刪除。然后在陸續將通過該流寫出的內容保存到文件中。        */FileOutputStream fos = new FileOutputStream("fos.txt",true);String line = "讓我再看你一遍,從南到北。";/*String提供了將內容轉換為一組字節的方法:getBytes()java.nio.charset.StandardCharsets*/byte[] data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);line = "像是北五環路蒙住的雙眼。";data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);       System.out.println("寫出完畢!");fos.close();}
}```### 文件輸出流-追加模式重載的構造方法可以將文件輸出流創建為追加模式- FileOutputStream(String path,boolean append)
- FileOutputStream(File file,boolean append)當第二個參數傳入true時,文件流為追加模式,即:指定的文件若存在,則原有數據保留,新寫入的數據會被順序的追加到文件中

用的是UTF-8。 其中中文字3字節表示1個,英文1字節表示1個。

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

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

相關文章

第六節:Vben Admin權限-后端控制方式

系列文章目錄 第一節:Vben Admin介紹和初次運行 第二節:Vben Admin 登錄邏輯梳理和對接后端準備 第三節:Vben Admin登錄對接后端login接口 第四節:Vben Admin登錄對接后端getUserInfo接口 第五節:Vben Admin權限-前端控制方式 文章目錄 系列文章目錄前言一、角色權限(后端…

Java面試題總結6

Spring中有哪些設計模式 簡單工廠:由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類 工廠方法:實現FactoryBean接口的bean是一類叫做factory的bean 單例模式:保證一個類僅有一個實例,并提供一個訪問它的全…

【辦公類-18-03】(Python)中班米羅可兒證書批量生成打印(班級、姓名)

作品展示——米羅可兒證書打印幼兒姓名 背景需求 2024年3月1日,中4班孩子一起整理美術操作材料《米羅可兒》的操作本——將每一頁紙撕下來,分類擺放、確保紙張上下位置正確。每位孩子們都非常厲害,不僅完成了自己的一本,還將沒有…

C++數據結構與算法——二叉搜索樹的屬性

C第二階段——數據結構和算法,之前學過一點點數據結構,當時是基于Python來學習的,現在基于C查漏補缺,尤其是樹的部分。這一部分計劃一個月,主要利用代碼隨想錄來學習,刷題使用力扣網站,不定時更…

C++編程面試復盤:數組降重+快排+函數指針+類模板

面試真題 真題1 #include <iostream> // 在函數 find_repetnum 的參數列表中&#xff0c;int& length 中的 & 符號表示引用。通過將 length 聲明為引用&#xff0c;函數可以修改傳入的 length 變量的值&#xff0c;并且這種修改會在函數外部生效。 void find_r…

Vue2:路由history模式的項目部署后頁面刷新404問題處理

一、問題描述 我們把Vue項目的路由模式&#xff0c;設置成history 然后&#xff0c;build 并把dist中的代碼部署到nodeexpress服務中 訪問頁面后&#xff0c;刷新頁面報404問題 二、原因分析 server.js文件 會發現&#xff0c;文件中配置的路徑沒有Vue項目中對應的路徑 所以…

React withRouter的使用及源碼實現

一 基本介紹 作用&#xff1a; 把不是通過路由切換過來的組件中&#xff0c;將react-router 的 history、location、match 三個對象傳入props對象上。比如首頁&#xff01; 默認情況下必須是經過路由匹配渲染的組件才存在this.props&#xff0c;才擁有路由參數&#xff0c;才能…

嵌入式學習筆記Day27

今天主要學習了進程間的通信&#xff0c;主要學習了通過管道進行通信 一、進程間的通信 進程間的通信方式有以下幾種&#xff1a; 1.管道 2.信號 3.消息隊列 4.共享內存 5.信號燈 6.套接字二、管道 2.1無名管道 無名管道只能用于具有親緣關系的進程間通信 函數接口&#x…

Nacos進階

目錄 Nacos支持三種配置加載方案 Namespace方案 DataID方案 Group方案 同時加載多個配置集 Nacos支持三種配置加載方案 Nacos支持“Namespacegroupdata ID”的配置解決方案。 詳情見&#xff1a;Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Namespace方案…

《TCP/IP詳解 卷一》第12章 TCP初步介紹

目錄 12.1 引言 12.1.1 ARQ和重傳 12.1.2 滑動窗口 12.1.3 變量窗口&#xff1a;流量控制和擁塞控制 12.1.4 設置重傳的超時值 12.2 TCP的引入 12.2.1 TCP服務模型 12.2.2 TCP可靠性 12.3 TCP頭部和封裝 12.4 總結 12.1 引言 關于TCP詳細內容&#xff0c;原書有5個章…

【C++ map和set】

文章目錄 map和set序列式容器和關聯式容器鍵值對setset的主要操作 mapmap主要操作 multiset和multimap map和set 序列式容器和關聯式容器 之前我們接觸的vector,list,deque等&#xff0c;這些容器統稱為序列式容器&#xff0c;其底層為線性序列的的數據結構&#xff0c;里面存…

【LV14 day4 字符設備驅動基礎框架】

一、字符設備驅動框架解析 設備的操作函數如果比喻是樁的話&#xff08;性質類似于設備操作函數的函數&#xff0c;在一些場合被稱為樁函數&#xff09;&#xff0c;則&#xff1a; 驅動實現設備操作函數 ----------- 做樁 insmod調用的init函數主要作用 --------- 釘樁 rm…

都說了能不動就別動,非要去調整,出生產事故了吧

MyBatis 替換成 MyBatis-Plus 背景介紹 一個老項目&#xff0c;數據庫用的是 MySQL 5.7.36 &#xff0c; ORM 框架用的 MyBatis 3.5.0 &#xff0c; mysql-connector-java 版本是 5.1.26 新來了一個干練的小伙&#xff0c;精力充沛&#xff0c;看著就是一個喜歡折騰的主 他…

leetcode 3.1

leetcode hot 100 雙指針1.三數之和2.接雨水 多維動態規劃1.最長公共子序列 雙指針 1.三數之和 三數之和 排序 雙指針的方法&#xff0c;固定一個數nums[i], 用兩數和找target - nums[i] 的數需要注意兩點: 1.需要去掉重復數字 while (l < r && nums[l] nums[…

社交APP開發能給用戶帶來什么

現在的社交軟件也非常的多&#xff0c;每款社交軟件都有自己的特色&#xff0c;社交軟件是日常中必備的軟件&#xff0c;不管是生活交流還是感情工作交流都是比較方便的&#xff0c;因為社交軟件滿足了日常的遠程交流問題&#xff0c;所以開發社交軟件也會逐漸的流行起來的。 …

Error: T doesn‘t have .length

Error: T doesn‘t have .length 在 TypeScript 中&#xff0c;當我們使用泛型 <T> 時&#xff0c;有時會遇到一個常見問題&#xff1a;編譯器提示錯誤&#xff0c;指出泛型類型 T 不具備 .length 屬性。在本文中&#xff0c;我們將探討這個問題的解決方案&#xff0c;并…

【Qt學習】QLCDNumber的介紹與實例使用(倒計時功能)

文章目錄 1. 介紹2. 實例 - QLCDNumber倒計時3. 資源文件 1. 介紹 QLCDNumber是Qt框架中用于顯示數字的控件&#xff0c;它模擬了一個液晶數字顯示屏。 在Designer界面中顯示如下&#xff1a; 有以下 常用屬性&#xff1a; 屬性描述intValue獲取或設置QLCDNumber顯示的整數…

Redis高級特性詳解:事務處理、發布訂閱、持久化和集群

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的基于內存的數據結構存儲系統&#xff0c;被廣泛應用于緩存、隊列、計數器等場景中。除了基本的鍵值存儲功能外&#xff0c;Redis還提供了許多高級特性&#xff0c;包括事務處理、發布訂閱、持久化和集群。在…

js截取圖片地址后面的參數和在路徑中截取文件名或后綴名

文章目錄 前言截取地址 &#xff1f;后面的參數在路徑中截取文件名或后綴名總結 前言 在處理網頁上的圖片資源或者其他類型的文件資源時&#xff0c;你可能會遇到需要使用這些技巧的情況。以下是一些具體的使用場景&#xff1a; 動態修改圖片參數&#xff1a;如果你有一個圖片U…

【BBuf的CUDA筆記】十四,OpenAI Triton入門筆記三 FusedAttention

0x0. 前言 繼續Triton的學習&#xff0c;這次來到 https://triton-lang.org/main/getting-started/tutorials/06-fused-attention.html 教程。也就是如何使用Triton來實現FlashAttention V2。對于FlashAttention和FlashAttention V2網上已經有非常多的介紹了&#xff0c;大家如…