【Java學習筆記十】輸入輸出流

在Java.io包中提供了一系列用于處理輸入/輸出的流類。從功能上分為兩類:輸入流和輸出流。從六結構上可分為:字節流(以字節為處理單位)和字符流(以字符為處理單位)。

字符是由字節組成。在Java中所有字符用Unicode編碼,占兩個字節。

如果將“中”以字節輸出,則對方收到的內容為兩個字節, 但是可能是亂碼。
如果將“中”以字符輸出,則對方收到的內容為“中”,也占兩個字節。

字節流的輸入流和輸出流的基礎類是InputStream和OutputStream這兩個抽象類,具體的輸入/輸出操作則由這兩個類的子類完成。

字符流的輸入流和輸出流的基礎類是Reader和Writer這兩個抽象類。

Java中還提供了一個特殊類RandomAccessFile,它允許對文件進行隨機訪問,使用該類的對象可以實現同時對文件進行輸入(讀文件)或輸出(寫文件)操作。

InputStream類中的常用方法
  • int available()獲得從輸入流中所能讀取的字節的個數
  • void close()關閉輸入流
  • int read()讀取輸入流中的下一個字節,返回該字節的ASCII值,范圍在0~255之間;若流結束,則返回-1
  • int read(byte []a)從輸入流中讀取字節,并存儲到字節數組a中。返回值為實際讀取的字節數;若流結束,返回-1
  • int read(byte []a, int off, int length)從輸入流中讀取長度為length個字節的數據,并存儲于數組a索引off位置開始處,并返回讀取的字節數,若流結束,則返回-1
  • long skip(long a)從當前位置開始,跳過a個字節的數據
OutputStream類中的常用方法
  • int flush()刷空輸出流,并輸出所有被緩存的字節
  • void write(int a)將指定的字節a寫入輸出流。如果a的值大于255,則只輸出它的低位字節所表示的值
  • void write(byte []a)把字節數組a中的字節數據全部寫入輸出流
  • void write(byte []a, int off, int length)把字節數組a中從索引off開始的length個字節寫入輸出流
  • void close() 關閉輸出流
常用的文件處理
文件的順序讀寫

一般操作步驟:

  1. 引入java.io包import java.io.*;
  2. 根據不同的數據源和輸入輸出任務,建立字節流和字符流對象
  3. 若需要對字節或字符流信息組織加工,在已建立字節流或字符流對象上哦固件數據流對象。
  4. 用輸入/輸出流對象的相應成員方法景行讀寫操作
  5. 關閉流對象

文件讀寫字節流類指的是FileInputStream類和FileOutputStream類,它們都重寫或實現了其父類InputStream和OutputStream類的一些方法,以實現順序訪問本地文件。它們都是以字節為單位順序讀寫一個已存在的文件。

FileInputStream類構造方法有

  • FileInputStream(String filename)用文件名filename創建輸入流對象
FileInputStream fis = new FileInputStream("d:\\intest.dat");
  • FileInputStream(File file)用文件對象創建輸入流對象,如:
  File file = new File("d:\\intest.dat");FileInputStream fis = new FileInputStream(file);

若輸入流對象創建失敗(如對應的文件不存在時),將會引發異常FileNotFoundException,在程序中需要對其捕獲和處理。
從文件中讀取信息。一般用read()成員方法進行讀取信息操作。

創建文件輸出字節流FileOutputStream對象。可以用文件名、文件對象建立文件輸出字節流對象。創建輸出字節流對象時,若指定的文件不存在,則會自動建立一個新文件,如果指定的文件已存在,則該文件的內容將被保留或刪除。

FileOutputStream類的構造方法有:

  • FileOutputStream(String filename) 用文件名filename創建輸出流對象
  • FileOutputStream(File file)用文件對象創建輸出流對象

向文件中寫入數據。一般用write()成員方法向文件中寫入數據
無論是讀文件還是寫文件,操作完畢后,應該關閉輸入流和輸出流,以釋放資源。關閉的方式有兩種:顯示關閉和隱式關閉。隱式關閉是利用Java系統的自動垃圾回收功能自動完成,但完成的時機不能確定。顯示關閉使用close()方法,建議用顯示方式主動關閉流。

例如:

//寫文件
package fileio; 
import java.io.FileOutputStream; 
public class FileOutputTest1 
{ public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("c:\\info.txt"); //注意是雙反斜杠String msg = "hello";fos.write(msg.getBytes()); //使用字符串的getBytes方法得到字節數組fos.close(); } 
} 
//讀文件
package fileio; 
import java.io.File; 
import java.io.FileInputStream; 
public class FileInputTest1 
{ public static void main(String[] args) throws Exception { File file = new File("c:\\info.txt"); FileInputStream fis = new FileInputStream(file); byte[] data = new byte[(int)file.length()];fis.read(data); fis.close(); String msg = new String(new String(data)); System.out.println(msg); } 
} 

例如:實現一個文件復制功能的程序:

import java.io.*;
public class CopyFile 
{public static void main(String[] args) {int dt;FileInputStream fis;FileOutputStream fos;try{ fis = new FileInputStream(args[0]);}catch(FileNotFoundException e){System.out.println("源文件未找到");return;}try{ fos = new FileOutputStream(args[1]);}catch(FileNotFoundException e){System.out.println("目標文件打開失敗");return;}try{while((dt=fis.read())!=-1)//進行復制{fos.write(dt);}}catch(IOException e){System.out.println("文件讀寫出錯");}finally{fis.close();fos.close();}}
}

文件字節流FileInputStream和FileOutputStream類只能提供純字節或字節數組的輸入/輸出操作,如果要進行基于Java基本數據類型(如整數或浮點數等)的輸入/輸出,則要用到過濾流FilterInputStream類和FilterOutputStream類的各種子類。

過濾流對象必須與一個輸入類或輸出類聯系起來,而不能直接使用文件名或文件對象來建立

使用數據文件流DataInputStream類和DataOutputStream類讀寫文件

首先使用前面的方法建立文件字節流對象;然后基于文件字節流對象建立數據文件流對象;再用此對象的方法對文件進行基于基本數據類型數據的讀寫操作。

DataInputStream類的構造方法為

  • DataInputStream(InputStream in)通過輸入流對象in創建輸入數據文件流對象。
    DataOutputStream類的構造方法為
  • DataOutputStream(OutputStream out)創建輸出數據文件流對象,并寫數據到OutputStream對象out。

數據文件流對象不僅能讀寫數據流,還能讀寫各種Java語言的基本數據類型數據,如int、float、double等。

在這里插入圖片描述
求100以內的所有素數,并把結果寫入D盤的data.dat文件中,最后再以每行10個數的方式顯示出data.dat文件的內容。

import java.io.*;
public class PrimeList 
{public static void main(String[] args) {int count = 0;  //用于統計素數數目try{       OutputStream fos= new FileOutputStream("d:\\data.dat");DataOutputStream dos = new DataOutputStream(fos);		for(int i=2; i<=100; i++){if(isPrime(i)){dos.writeInt(i); count++;}}fos.close();}catch(IOException e){System.out.println(e.toString());}try{InputStream fis = new FileInputStream("d:\\data.dat");DataInputStream dis = new DataInputStream(fis);for(int i=0; i<count; i++){if(i%10==0)System.out.println();//每行只顯示10個數System.out.printf("%5d", dis.readInt());}fis.close();}catch(IOException e){System.out.println(e.toString());}}
使用BufferedInputStream和BufferedOutputStream類讀寫文件

這兩個類稱之為字節緩沖流。如果文件的讀寫數據量較多時,使用字節緩沖流類對象可以提高文件讀寫操作的效率字節緩沖流對象會建立一個內部緩沖區,輸入/輸出數據首先會讀寫到緩沖區進行操作,當緩沖區滿或關閉字節緩沖流時一次性輸出到對應流,也可使用flush()方法主動將緩沖區數據輸出到對應流,這樣可以極大地減少磁盤讀寫次數,提高了文件操作效率。

BufferedInputStream類的構造方法

  • BufferedInputStream(InputStream in)創建緩沖輸入流對象,保存in流對象,并創建一個內部緩沖區來保存輸入數據。
  • BufferedInputStream(InputStream in, int size)創建緩沖輸入流對象,保存in流對象,并創建一個指定大小為size個字節的內部緩沖區來保存輸入數據。

BufferedOutputStream類的構造方法

  • BufferedOutputStream(OutputStream out)創建輸出緩沖流對象,并創建一個默認大小為512個字節的內部緩沖區,寫數據到參數所指定的輸出流out對象。
  • BufferedOutputStream(OutputStream out, int size)創建輸出緩沖流對象,并創建一個指定大小為size個字節的內部緩沖區,寫數據到參數所指定的輸出流out對象。

flush()方法用于在程序結束之前主動將緩沖區里的數據輸出到對應的輸入/輸出流。可以通過輸入/輸出緩沖流對象進行顯示調用。

BufferedInputStream類提供了與FileInputStream類同樣的讀文件操作方法,BufferedOutputStream類提供了與FileOutputStream類同樣的寫文件操作方法,唯一的區別是所有讀寫操作的數據首先進入到緩沖區,在必要時(緩沖區滿、關閉流或調用flush()方法)才輸出到對應的流中。

使用PrintStream類寫文件

PrintStream類提供了把Java的任何類型數據轉換為字符串類型數據輸出的功能。輸出時,經常使用的方法有print()、println()和printf()。

創建PrintStream類的對象時,需要在OutputStream類對象的基礎上進行。PrintStream類的構造方法有:

  • PrintStream(OutputStream out)創建一個打印流對象。
  • PrintStream(OutputStream out, boolean autoFlush)創建一個打印流對象。

java.io.PrintStream寫文件,更加簡便。 我們可以調用PrintStream類里面的函數來進行輸出操作,其功能主要是各個print函數和println函數,使用方法和System.out類似。

package fileio; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 
public class PrintStreamTest1 
{ public static void main(String[] args) throws Exception { PrintStream ps = new PrintStream(new FileOutputStream("c:\\info.txt")); String msg = "hello"; ps.println(msg); ps.close(); }
}
字符流
  • 使用Reader類和Writer類的子類對象可以處理以字符為單位的輸入/輸出操作。字符流中將所有的內容看成一個個字符(Character),占據2個字節,英文字符也不例外。在Java中,所有字符輸入流的父類是:java.io. Reader,所有字符輸出流的父類是:java.io.Writer

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

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

相關文章

C++ 寫時拷貝 2

什么情況下會用到c中的拷貝構造函數】&#xff1a; 1&#xff09;用已經存在的同類的對象去構造出另一個新的對象 2&#xff09;當函數的形參是類的對象時&#xff0c;這時調用此函數&#xff0c;使用的是值的拷貝&#xff0c;也會調用拷貝構造函數 3&#xff09;當函數的返…

【Java學習筆記十一】圖形用戶界面

圖形用戶界面或圖形用戶接口(Graphical User Interface&#xff0c;GUI)是指采用圖形方式,借助菜單、按鈕等標準界面元素&#xff0c;用戶可以通過鼠標等外設向計算機系統發出指令、啟動操作&#xff0c;并將系統運行的結果同樣以圖形方式顯示給用戶的技術。 GUI是事件驅動的&…

C++ 寫時拷貝 3

http://blog.csdn.net/ljianhui/article/details/22895505 字符串一種在程序中經常要使用到的數據結構&#xff0c;然而在C中卻沒有字符串這種類型。在C中&#xff0c;為了方便字符串的使用&#xff0c;在STL中提供了一個string類。該類維護一個char指針&#xff0c;并封裝和提…

C++類模板實例化條件

&#xff08;我不想了解這個&#xff0c;可是考試要考。。。。 并不是每次使用模板類都會實例化一個類 聲明一個類模板的指針和引用不會引起類模板的實例化如果檢查這個指針或引用的成員時時&#xff0c;類模板會實例化定義一個對象的時候需要有類的定義&#xff0c;會實例化…

C++ String類寫時拷貝 4

http://blog.51cto.com/zgw285763054/1839752 維基百科&#xff1a; 寫入時復制&#xff08;英語&#xff1a;Copy-on-write&#xff0c;簡稱COW&#xff09;是一種計算機程序設計領域的優化策略。其核心思想是&#xff0c;如果有多個調用者&#xff08;callers&#xff09;同時…

C++筆試復習

基礎知識點 C中對象數組在定義的時候全部進行實例化&#xff08;與Java不同&#xff0c;Java相當于只是定義了一個指針數組&#xff0c;沒有進行實例化&#xff09; 程序的三種基本控制結構是&#xff1a;順序結構、循環結構、選擇結構 一個C程序開發步驟通常包括&#xff1a…

C++函數默認參數

聲明是用戶可以看到的部分&#xff0c;客戶非常信任地使用這個特性&#xff0c;希望得到一定的結果&#xff0c;但是你在實現里使用了不同的缺省值&#xff0c;那么將是災難性的。因此編譯器禁止聲明和定義時同時定義缺省參數值。 類的成員函數的參數表在聲明時默認參數位于參…

C語言鏈表各類操作詳解

http://blog.csdn.net/pf4919501/article/details/38818335鏈表概述   鏈表是一種常見的重要的數據結構。它是動態地進行存儲分配的一種結構。它可以根據需要開辟內存單元。鏈表有一個“頭指針”變量&#xff0c;以head表示&#xff0c;它存放一個地址。該地址指向一個元素。…

Java筆試復習

Java程序運行 Java程序的執行必須經過編輯、編譯和運行三個步驟 編輯指編寫代碼&#xff0c;最終形成后綴名為.java的Java源文件編譯指使用Java編譯器&#xff08;javac指令&#xff09;將源文件翻譯為二進制代碼&#xff0c;編譯后生成后綴名為.class的字節碼文件&#xff0c…

數據結構之自建算法庫——鏈棧

http://blog.csdn.net/sxhelijian/article/details/48463801本文針對數據結構基礎系列網絡課程(3)&#xff1a;棧和隊列中第4課時棧的鏈式存儲結構及其基本運算實現。 按照“0207將算法變程序”[視頻]部分建議的方法&#xff0c;建設自己的專業基礎設施算法庫。 鏈棧算法庫采用…

Java類名與包名不區分大小寫

剛才寫了一個簡單的Java程序&#xff0c;經過測試得到一個令人震驚的結論&#xff1a;Java類名和包名是不區分大小寫的 可以看一下這個例子&#xff1a; package Test;class aBcdEfG {}class AbCdefg {}public class TTT {public static void main(String[] args){AbCdefg tm…

epoll實現高并發聊天室

http://blog.csdn.net/qq_31564375/article/details/51581038項目介紹 本項目是實現一個簡單的聊天室&#xff0c;聊天室分為服務端和客戶端。本項目將很多復雜的功能都去掉了&#xff0c;線程池、多線程編程、超時重傳、確認收包等等都不會涉及。總共300多行代碼&#xff0c;讓…

BZOJ2809-左偏樹合并

Description 在一個忍者的幫派里&#xff0c;一些忍者們被選中派遣給顧客&#xff0c;然后依據自己的工作獲取報償。在這個幫派里&#xff0c;有一名忍者被稱之為 Master。除了 Master以外&#xff0c;每名忍者都有且僅有一個上級。為保密&#xff0c;同時增強忍者們的領導力&a…

處理大并發之一 對epoll的理解,epoll客戶端服務端代碼

http://blog.csdn.net/zhuxiaoping54532/article/details/56494313處理大并發之一對epoll的理解&#xff0c;epoll客戶端服務端代碼序言&#xff1a;該博客是一系列的博客&#xff0c;首先從最基礎的epoll說起&#xff0c;然后研究libevent源碼及使用方法&#xff0c;最后研究n…

epoll詳解

http://blog.csdn.net/majianfei1023/article/details/45772269歡迎轉載&#xff0c;轉載請注明原文地址&#xff1a;http://blog.csdn.net/majianfei1023/article/details/45772269一.基本概念&#xff1a;1.epoll是什么&#xff1a;epoll是Linux內核為處理大批量文件描述符而…

數據分割-并查集+set

小w來到百度之星的賽場上&#xff0c;準備開始實現一個程序自動分析系統。 這個程序接受一些形如xixj 或 xi≠xj 的相等/不等約束條件作為輸入&#xff0c;判定是否可以通過給每個 w 賦適當的值&#xff0c;來滿足這些條件。 輸入包含多組數據。 然而粗心的小w不幸地把每組數據…

linux c++線程池的實現

http://blog.csdn.net/zhoubl668/article/details/8927090?t1473221020107 線程池的原理大家都知道&#xff0c;直接上代碼了^_^ Thread.h [cpp] view plaincopy #ifndef __THREAD_H #define __THREAD_H #include <vector> #include <string> #inc…

樹啟發式合并入門

所謂啟發式合并&#xff0c;就是一種符合直覺的合并方法&#xff1a;將小的子樹合并在大的子樹上。 這些問題一般是相似的問題背景&#xff1a;都是樹上的計數問題&#xff0c;都不能直接從上往下進行暴力&#xff0c;都需要從下往上計數時對子樹信息進行運算從而得到父親節點的…

鏈棧基本操作

http://blog.csdn.net/jwentao01/article/details/46765517###;棧基本概念&#xff1a; 棧&#xff08;stack&#xff09;是限定在表尾進行插入和刪除操作的線性表&#xff08;或單鏈表&#xff09;。 //只能在一段進行插入和刪除&#xff0c;因此不存在&#xff0c;在中間進行…

Linux網絡編程---I/O復用模型之select

https://blog.csdn.net/men_wen/article/details/53456435Linux網絡編程—I/O復用模型之select 1. IO復用模型 IO復用能夠預先告知內核&#xff0c;一旦發現進程指定的一個或者多個IO條件就緒&#xff0c;它就通知進程。IO復用阻塞在select或poll系統調用上&#xff0c;而不是阻…