使用randomaccessfile類將一個文本文件中的內容逆序輸出_Java 中比較常用的知識點:I/O 總結...

Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基于數據流進行輸入輸出,這些數據流表示了字符或者字節數據的流動序列。

數據流是一串連續不斷的數據的集合,就象水管里的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。數據寫入程序可以是一段、一段地向數據流管道中寫入數據,這些數據段會按先后順序形成一個長的數據流。對數據讀取程序來說,看不到數據流在寫入時的分段情況,每次可以讀取其中的任意長度的數據,但只能先讀取前面的數據后,再讀取后面的數據(不能隨機讀取)。不管寫入時是將數據分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全一樣的。

簡而言之:數據流是一組有序,有起點和終點的字節的數據序列。包括輸入流和輸出流。

當程序需要讀取數據的時候,就會建立一個通向數據源的連接,這個數據源可以是文件,內存,或是網絡連接。類似的,當程序需要寫入數據的時候,就會建立一個通向目的地的連接。

數據流分類:

流序列中的數據既可以是未經加工的原始二進制數據,也可以是經一定編碼處理后符合某種格式規定的特定數據。因此Java中的流分為兩種: 1) 字節流:數據流中最小的數據單元是字節 2) 字符流:數據流中最小的數據單元是字符, Java中的字符是Unicode編碼,一個字符占用兩個字節。

概覽

Java.io包中最重要的就是5個類和一個接口。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個接口指的是Serializable。掌握了這些就掌握了Java I/O的精髓了。

Java I/O主要包括如下3層次:

  1. 流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等
  2. 非流式部分——如:File類、RandomAccessFile類和FileDescriptor等類
  3. 其他——文件讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地操作系統相關的文件系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

主要類如下:

  1. File(文件特征與管理):用于文件或者目錄的描述信息,例如生成新目錄,修改文件名,刪除文件,判斷文件所在路徑等。
  2. InputStream(字節流,二進制格式操作):抽象類,基于字節的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特征。
  3. OutputStream(字節流,二進制格式操作):抽象類。基于字節的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。
  4. Reader(字符流,文本格式操作):抽象類,基于字符的輸入操作。
  5. Writer(字符流,文本格式操作):抽象類,基于字符的輸出操作。
  6. RandomAccessFile(隨機文件操作):它的功能豐富,可以從文件的任意位置進行存取(輸入輸出)操作
d11f37923ab3a3c4187bae7bd98f6412.png

I/O流

java.io包里有4個基本類:InputStream、OutputStream及Reader、Writer類,它們分別處理字節流和字符流。

其他各種各樣的流都是由這4個派生出來的。

50d449724b40b2fd8e1f88ada221212e.png

按來源/去向分類:

  1. File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
  2. byte[]:ByteArrayInputStream, ByteArrayOutputStream
  3. Char[]: CharArrayReader, CharArrayWriter
  4. String: StringBufferInputStream, StringReader, StringWriter
  5. 網絡數據流:InputStream, OutputStream, Reader, Writer

InputStream

InputStream 為字節輸入流,它本身為一個抽象類,必須依靠其子類實現各種功能,此抽象類是表示字節輸入流的所有類的超類。 繼承自InputStream 的流都是向程序中輸入數據的,且數據單位為字節(8bit);

InputStream是輸入字節數據用的類,所以InputStream類提供了3種重載的read方法.Inputstream類中的常用方法:

  • public abstract int read( ):讀取一個byte的數據,返回值是高位補0的int類型值。若返回值=-1說明沒有讀取到任何字節讀取工作結束。
  • public int read(byte b[ ]):讀取b.length個字節的數據放到b數組中。返回值是讀取的字節數。該方法實際上是調用下一個方法實現的
  • public int read(byte b[ ], int off, int len):從輸入流中最多讀取len個字節的數據,存放到偏移量為off的b數組中。
  • public int available( ):返回輸入流中可以讀取的字節數。注意:若輸入阻塞,當前線程將被掛起,如果InputStream對象調用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調用才有用,
  • public long skip(long n):忽略輸入流中的n個字節,返回值是實際忽略的字節數, 跳過一些字節來讀取
  • public int close( ) :使用完后,必須對我們打開的流進行關閉。

來看看幾種不同的InputStream:

  1. FileInputStream把一個文件作為InputStream,實現對文件的讀取操作
  2. ByteArrayInputStream:把內存中的一個緩沖區作為InputStream使用
  3. StringBufferInputStream:把一個String對象作為InputStream
  4. PipedInputStream:實現了pipe的概念,主要在線程中使用
  5. SequenceInputStream:把多個InputStream合并為一個InputStream

OutputStream

OutputStream提供了3個write方法來做數據的輸出,這個是和InputStream是相對應的。

  • public void write(byte b[ ]):將參數b中的字節寫到輸出流。
  • public void write(byte b[ ], int off, int len) :將參數b的從偏移量off開始的len個字節寫到輸出流。
  • public abstract void write(int b) :先將int轉換為byte類型,把低字節寫入到輸出流中。
  • public void flush( ) : 將數據緩沖區中數據全部輸出,并清空緩沖區。
  • public void close( ) : 關閉輸出流并釋放與流相關的系統資源。

幾種不同的OutputStream:

  1. ByteArrayOutputStream:把信息存入內存中的一個緩沖區中
  2. FileOutputStream:把信息存入文件中
  3. PipedOutputStream:實現了pipe的概念,主要在線程中使用
  4. SequenceOutputStream:把多個OutStream合并為一個OutStream

Reader和InputStream類似;Writer和OutputStream類似。

有兩個需要注意的:

  1. InputStreamReader : 從輸入流讀取字節,在將它們轉換成字符。
  2. BufferReader :接受Reader對象作為參數,并對其添加字符緩沖器,使用readline()方法可以讀取一行。

如何選擇I/O流

  1. 確定是輸入還是輸出
  2. 輸入:輸入流 InputStream Reader
  3. 輸出:輸出流 OutputStream Writer
  4. 明確操作的數據對象是否是純文本
  5. 是:字符流 Reader,Writer
  6. 否:字節流 InputStream,OutputStream
  7. 明確具體的設備。
  • 文件:
  • 讀:FileInputStream,, FileReader,
  • 寫:FileOutputStream,FileWriter
  • 數組:
  • byte[ ]:ByteArrayInputStream, ByteArrayOutputStream
  • char[ ]:CharArrayReader, CharArrayWriter
  • String:
  • StringBufferInputStream(已過時,因為其只能用于String的每個字符都是8位的字符串), StringReader, StringWriter
  • Socket流
  • 鍵盤:用System.in(是一個InputStream對象)讀取,用System.out(是一個OutoutStream對象)打印
  1. 是否需要轉換流
  2. 是,就使用轉換流,從Stream轉化為Reader、Writer:InputStreamReader,OutputStreamWriter
  3. 是否需要緩沖提高效率
  4. 是就加上Buffered:BufferedInputStream, BufferedOuputStream, BufferedReader, BufferedWriter
  5. 是否需要格式化輸出

示例代碼

  • 將標準輸入(鍵盤輸入)顯示到標準輸出(顯示器),支持字符。
char ch;BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //將字節流轉為字符流,帶緩沖try { while ((ch = (char) in.read()) != -1){ System.out.print(ch); }} catch (IOException e) { e.printStackTrace();}
  • 將AtomicityTest.java的內容打印到顯示器
方法一:BufferedReader in = new BufferedReader(new FileReader("AtomicityTest.java"));String s;try { while ((s = in.readLine()) != null){ System.out.println(s); } in.close();} catch (IOException e) { e.printStackTrace();}方法二:FileReader in = new FileReader("AtomicityTest.java");int b;try { while ((b = in.read()) != -1){ System.out.print((char)b); } in.close();} catch (IOException e) { e.printStackTrace();}方法三:(有可能出現亂碼)FileInputStream in = new FileInputStream("AtomicityTest.java");int n = 50;byte[] buffer = new byte[n];try { while ((in.read(buffer,0,n) != -1 && n > 0)){ System.out.print(new String(buffer)); } in.close();} catch (IOException e) { e.printStackTrace();}
  • 將文件A的內容拷貝到文件B
FileInputStream in = new FileInputStream("AtomicityTest.java");FileOutputStream out = new FileOutputStream("copy.txt");int b;while ((b = in.read()) != -1){ out.write(b);}out.flush();in.close();out.close();
  • 將標準輸入的內容寫入文件
Scanner in = new Scanner(System.in);FileWriter out = new FileWriter("systemIn.log");String s;while (!(s = in.nextLine()).equals("Q")){ out.write(s + "");}out.flush();out.close();in.close();

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

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

相關文章

huggingface NLP工具包教程2:使用Transformers

huggingface NLP工具包教程2:使用Transformers 引言 Transformer 模型通常非常大,由于有數百萬到數百億個參數,訓練和部署這些模型是一項復雜的任務。此外,由于幾乎每天都有新模型發布,而且每個模型都有自己的實現&a…

huggingface NLP工具包教程3:微調預訓練模型

huggingface NLP工具包教程3:微調預訓練模型 引言 在上一章我們已經介紹了如何使用 tokenizer 以及如何使用預訓練的模型來進行預測。本章將介紹如何在自己的數據集上微調一個預訓練的模型。在本章,你將學到: 如何從 Hub 準備大型數據集如…

mysql精講_Mysql 索引精講

開門見山,直接上圖,下面的思維導圖即是現在要講的內容,可以先有個印象~常見索引類型(實現層面)索引種類(應用層面)聚簇索引與非聚簇索引覆蓋索引最佳索引使用策略1.常見索引類型(實現層面)首先不談Mysql怎么實現索引的,先馬后炮一…

pytorch lightning最簡上手

pytorch lightning最簡上手 pytorch lightning 是對原生 pytorch 的通用模型開發過程進行封裝的一個工具庫。本文不會介紹它的高級功能,而是通過幾個最簡單的例子來幫助讀者快速理解、上手基本的使用方式。在掌握基礎 API 和使用方式之后,讀者可自行到 …

RT-Smart 官方 ARM 32 平臺 musl gcc 工具鏈下載

前言 RT-Smart 的開發離不開 musl gcc 工具鏈,用于編譯 RT-Smart 內核與用戶態應用程序 RT-Smart musl gcc 工具鏈代碼當前未開源,但可以下載到 RT-Thread 官方編譯好的最新的 musl gcc 工具鏈 ARM 32位 平臺 比如 RT-Smart 最好用的 ARM32 位 qemu 平…

java list翻轉_JAVA實現兩種方法反轉單列表

/***authorluochengcheng* 定義一個單鏈表*/classNode {//變量private intrecord;//指向下一個對象privateNode nextNode;public Node(intrecord) {super();this.record record;}public intgetRecord() {returnrecord;}public void setRecord(intrecord) {this.record record;}…

OpenAI Whisper論文筆記

OpenAI Whisper論文筆記 OpenAI 收集了 68 萬小時的有標簽的語音數據,通過多任務、多語言的方式訓練了一個 seq2seq (語音到文本)的 Transformer 模型,自動語音識別(ASR)能力達到商用水準。本文為李沐老師…

mysql 工具 08s01_Mysql管理必備工具Maatkit詳解之十四(mk-kill)

mk-kill - 顧名思義,殺mysql線程。安裝方法查看這里。在一個OLTP的生產環境,一般不會讓sql執行過長的時間,特別是myisam這樣表鎖的引擎,如果出現長時間執行的sql一般是誤操作,要不就是出現問題了。出現這種情況&#x…

【經典簡讀】知識蒸餾(Knowledge Distillation) 經典之作

【經典簡讀】知識蒸餾(Knowledge Distillation) 經典之作 轉自:【經典簡讀】知識蒸餾(Knowledge Distillation) 經典之作 作者:潘小小 知識蒸餾是一種模型壓縮方法,是一種基于“教師-學生網絡思想”的訓練方法,由于其簡單&#xf…

深度學習三大謎團:集成、知識蒸餾和自蒸餾

深度學習三大謎團:集成、知識蒸餾和自蒸餾 轉自:https://mp.weixin.qq.com/s/DdgjJ-j6jHHleGtq8DlNSA 原文(英):https://www.microsoft.com/en-us/research/blog/three-mysteries-in-deep-learning-ensemble-knowledge…

在墻上找垂直線_墻上如何快速找水平線

在裝修房子的時候,墻面的面積一般都很大,所以在施工的時候要找準水平線很重要,那么一般施工人員是如何在墻上快速找水平線的呢?今天小編就來告訴大家幾種找水平線的方法。一、如何快速找水平線1、用一根透明的軟管,長度…

百度地圖mysql打點_關于百度地圖連接MYSQL的問題,謝謝啦!

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓大家好,剛使用百度地圖API,請教大家一個問題,謝啦!我需要從我的數據庫中取出字段為"city"的所有數據,然后通過bdGEO()函數在地圖上標注這些城市,我是…

PyTorch中的torch.nn.Parameter() 詳解

PyTorch中的torch.nn.Parameter() 詳解 今天來聊一下PyTorch中的torch.nn.Parameter()這個函數,筆者第一次見的時候也是大概能理解函數的用途,但是具體實現原理細節也是云里霧里,在參考了幾篇博文,做過幾個實驗之后算是清晰了&am…

Vision Transformer(ViT)PyTorch代碼全解析(附圖解)

Vision Transformer(ViT)PyTorch代碼全解析 最近CV領域的Vision Transformer將在NLP領域的Transormer結果借鑒過來,屠殺了各大CV榜單。本文將根據最原始的Vision Transformer論文,及其PyTorch實現,將整個ViT的代碼做一…

hdfs的副本數為啥增加了_HDFS詳解之塊大小和副本數

1.HDFSHDFS : 偽分布式(學習)NNDNSNNsbin/start-dfs.sh(開啟hdfs使用的腳本)bin/hdfs dfs -ls (輸入命令加前綴bin/hdfs dfs)2.block(塊)dfs.blocksize : 134217728(字節) / 128M 官網默認一個塊的大小128M*舉例理解塊1個文件 130M,默認一個塊的大小128M…

Linux下的ELF文件、鏈接、加載與庫(含大量圖文解析及例程)

Linux下的ELF文件、鏈接、加載與庫 鏈接是將將各種代碼和數據片段收集并組合為一個單一文件的過程,這個文件可以被加載到內存并執行。鏈接可以執行與編譯時,也就是在源代碼被翻譯成機器代碼時;也可以執行于加載時,也就是被加載器加…

mysql gender_Mysql第一彈

1、創建數據庫pythoncreate database python charsetutf8;2、設計班級表結構為id、name、isdelete,編寫創建表的語句create table classes(id int unsigned auto_increment primary key not null,name varchar(10),isdelete bit default 0);向班級表中插入數據pytho…

python virtualenv nginx_Ubuntu下搭建Nginx+supervisor+pypy+virtualenv

系統:Ubuntu 14.04 LTS搭建python的運行環境:NginxSupervisorPypyVirtualenv軟件說明:Nginx:通過upstream進行負載均衡Supervisor:管理python進程Pypy:用Python實現的Python解釋器PyPy is a fast, complian…

如何設置mysql表中文亂碼_php mysql表中文亂碼問題如何解決

為避免mysql中出現中文亂碼,建議在創建數據庫時指定編碼格式:復制代碼 代碼示例:create database zzjz CHARACTER SET gbk COLLATE gbk_chinese_ci;create table zz_employees (employeeid int unsigned not null auto_increment primary key,name varch…

java 按鈕 監聽_Button的四種監聽方式

Button按鈕設置點擊的四種監聽方式注:加粗放大的都是改變的代碼1.使用匿名內部類的形式進行設置使用匿名內部類的形式,直接將需要設置的onClickListener接口對象初始化,內部的onClick方法會在按鈕被點擊的時候執行第一個活動的java代碼&#…