Java入門基礎知識:Java IO(輸入/輸出)
- JAVA認證
- 關注:1.34W次
Java中將輸入輸出抽象成流,流通過輸入輸出系統與物理裝置連線,儘管與它們連結的物理裝置不盡相同,所有流的行為具有同樣的方式。今天yjbys小編為大家帶來最新Java入門基礎知識——Java IO(輸入/輸出),希望對同學們學習java基礎知識有所幫助!
Java語言中的IO包支援Java的基本I/O(輸入/輸出)系統,包括檔案的輸入/輸出。Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列。Java的I/O流提供了讀寫資料的標準方法。任何Java中表示資料來源的物件都會提供以資料流的方式讀寫它的資料的方法。
Java I/O基礎流的概念
java中將輸入輸出抽象成流,流通過輸入輸出系統與物理裝置連線,儘管與它們連結的物理裝置不盡相同,所有流的行為具有同樣的方式。將資料從外部(包括磁碟檔案、鍵盤、套接字)讀入到記憶體中的流稱為輸入流,將從記憶體寫入到外部裝置(控制檯、磁碟檔案或者網路)的稱為輸出流。
流的分類
流序列中的資料既可以是未經加工的原始二進位制資料,也可以是經一定編碼處理後符合某種格式規定的特定資料。因此Java中的流分為兩種:
位元組流:資料流中最小的資料單元是位元組 多用於讀取或書寫二進位制資料
字元流:資料流中最小的資料單元是字元, Java中的字元是Unicode編碼,一個字元佔用兩個位元組。
提示
在最底層,所有的輸入/輸出都是位元組形式的。基於字元的流只為處理字元提供方便有效的方法。
位元組流
位元組流的最頂層是兩個抽象類:InputStream和OutputStream,其他關於處理位元組的類都是它們的子類,這些子類對不同的外設進行處理,例如磁碟檔案,網路連線,甚至是記憶體緩衝區。
抽象類InputStream 和 OutputStream中定義了實現其他流類的關鍵方法read()和write(),它們分別對資料的`位元組進行讀寫。兩種方法都是抽象方法,被子類過載。
例1 檔案按位元組流的方式拷貝
import .*;
//byte streams are used to perform input and output of 8-bit bytes
public class CopyFileByte {
public static void main(String args[]) throws IOException
{
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("");
out = new FileOutputStream("");
int c;
while ((c = ()) != -1) {
e(c);
}
}finally {
if (in != null) {
e();
}
if (out != null) {
e();
}
}
}
}
例1中,上面使用的是檔名來建立FileInoutStream和FileOutputStream,實際上可以還可以使用檔案物件來建立輸入輸出流。位元組流的每次操作都是一個數據單位——位元組,假如檔案中包含 Hello world ,那麼它將複製完“H”之後,再複製“e”,接著就是“l”,如此類推直到其結束。()每次從輸入流中讀取一個位元組,如果達到檔案末尾就返回-1。使用完了,還要關閉這些位元組流,呼叫close()方法。
File inFile = new File("");
File outFile = new File("");
FileInputStream in = new FileInputStream(inFile);
FileOutputStream out = new FileOutputStream(outFile);
字元流
java是使用16-bits來儲存字元資料的,涉及到的大多是字元操作,在程式中使用字元流會比位元組流更加合適。類似於位元組流,字元流的兩個頂層抽象類是Reader和Writer,一下是它們的子類處理字元流。
類似於位元組,字元的抽象類Reader和 Writer中也定義了關鍵方法read()和write(),它們分別對字元進行讀寫。兩種方法也都是抽象方法,被子類過載。
例2 檔案按字元流的方式拷貝
import .*;
//Character streams are used to perform input and output for 16-bit unicode
public class CopyFileCharacter {
public static void main(String args[]) throws IOException
{
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("");
out = new FileWriter("");
int c;
while ((c = ()) != -1) {
e(c);
}
}finally {
if (in != null) {
e();
}
if (out != null) {
e();
}
}
}
}
和例1對比發現,只有宣告的I/O流的類名不同,這裡使用的FileReader和FileWriter,它們操作的最小單位是一個字元16bits,而FileInputStream和FileOutputStream最小單位則是一個位元組8bits.
java 自定義的標準流
標準輸入流 讀取標準輸入裝置資料,例如鍵盤輸入(預設),其型別是InputStream,三個重要的讀入方法:
int read() 從輸入流中讀取資料的下一個位元組,返回ASCII碼。若,返回值=-1,說明沒有讀取到任何位元組讀取工作結束
int read(byte[] b) 從輸入流中讀取一定數量的位元組,並將這些資料儲存到緩衝區陣列b中
int read(byte[] b, int off, int len) 將輸入流中最多len個位元組讀入到位元組陣列b中
標準輸出流 向標準的輸出裝置寫入資料,預設情況下指控制檯,其型別是PrintStream,包含兩個重要的方法:print()(不換行)和println()(輸出之後換行)
標準錯誤流 預設也是控制檯,型別和相同是PrintStream,
提示
這些流都有預設的裝置,但它們可以重定向到任何相容的輸入/輸出裝置。
控制檯的輸入和輸出
正如上面所介紹的,控制檯的輸入、輸出是由和來完成的。目前,讀取控制檯的輸入輸出的首選方法的是字元流,但完成控制檯輸入的唯一方法是位元組流,因而java提供了InputStreamReader和OutputStreamWriter將位元組流轉化成字元流。BufferedReader是緩衝輸入字元流。正如我們在例子中看到的,java允許使用向控制檯寫資料,但在實際的專案中,它推薦使用PrintWriter,它是基於字元的。
例3 控制檯輸入字元
import .*;
class ConsoleInOut{
public static void main(String args[])throws IOException{
char c;
InputStreamReader isr = new InputStreamReader(); //①
BufferedReader br = new BufferedReader(isr); //②
tln("Enter characters, 'q' to exit.");
c=(char)();
while(c != 'q'){
tln(c);
c = (char) ();
} ;
}
}
輸出:
D:java>java ConsoleInOut
Enter characters, 'q' to quit.
Hello world!
H
e
l
l
o
w
o
r
l
d
!
q
例3 中的①和②兩行建立了一個與鍵盤相連的BufferedReader物件,這裡使用read()方法來讀取字元,當到達流的末尾時返回-1,輸入q退出程式。輸出我們使用的是println()方法,每次輸出後都換行。
控制檯輸入字元我們使用的是read()方法,輸入字串的話我們可以使用readLine()方法,和輸入字元非常相似,只需要將例3中的read()方法換成readLine()方法即可,同時將改為String型別,由於比較簡單,此處不再贅述。
提高
我們來看java工具包中的輸入類Scanner。
建立Scanner類的物件時,需要用 作為它的引數,也可以將Scanner看作是物件的支持者,取得使用者輸入的內容後,交給Scanner來作一些處理.
Scanner類中提供了多個方法:next():取得一個字串;
hasNext():是否還有輸入;
nextInt():將取得的字串轉換成int型別的整數;
nextFloat():將取得的字串轉換成float型;
nextBoolean():將取得的字串轉換成boolean型;
提示
使用Scanner非常方便,但也有不足,Scanner取得輸入的依據是空格符,包括空格鍵,Tab鍵和Enter鍵.當按下這其中的任一鍵 時,Scanner就會返回下一個輸入. 當你輸入的內容中間包括空格時,顯然,使用Scanner就不能完整的獲得你輸入的字串.
例4 Scanner
public static void main(String[] args){
Scanner sc = new Scanner(new BufferedInputStream());
while(ext()){
int m = Int();
String str = ();
for(int i=0; i
tln(Int());
}
}
}
正如我們在例子中看到的,java允許使用向控制檯寫資料,但在實際的專案中,它推薦使用PrintWriter,它是基於字元的。
PrintWriter支援所有型別(包括Object)的print( )和println( )方法,這樣,我們就可以像用那樣用這些方法。如果遇到不同型別的情況,PrintWriter方法呼叫物件的toString( )方法並列印結果。
例5 控制檯的輸出
import .*;
public class TestAbstract {
public static void main(String args[]) {
PrintWriter printerWriter = new PrintWriter(, true);
tln("Hello World!");
int i = -10;
tln(i);
double d = 0.00003;
tln(d);
}
}
D:java>java TestAbstract
Hello World!
-10
3.0E-5
例5 中的new PrintWriter(, true)新建了一個PrinterWriter物件,指定輸出流為,true是每一行輸出之後進行重新整理。
檔案的輸入輸出
檔案
檔案File 位於包中,用於描述檔案和目錄的操作。建立檔案物件如下:
File file = new File("");//檔案位於當前目錄下
File file = new File("/home/user","");//檔案位於/home/user目錄下
除了上述的File構造方法之外,還有很多和File相關的方法如下:
exists() 判斷檔案或目錄是否存在
mkdir() 建立目錄
isFile()/isDirectory() 判斷是檔案還是目錄
delete() 刪除檔案
getPath() 獲取檔案或者目錄的路徑
list() 將目錄中所有檔名儲存在字串陣列中返回
例6 檔案相關操作
import .*;
public class TestAbstract {
public static void main(String args[]) throws IOException {
File dir = new File("D:/java");
File file1 = new File(dir, "");
File file2 = new File(dir, "");
if (!ts())
r();
if (!ts())
teNewFile();
if (!ts())
teNewFile();
tln("file1's AbsolutePath= " + bsolutePath());
tln("file2's AbsolutePath= " + bsolutePath());
tln("file1 Canread=" + ead());
tln("file1's len= " + th());
String[] fileList = ();
tln("there are " + th + " file(s) in D:");
}
}
執行結果:
D:java>java TestAbstract
file1's AbsolutePath= D:java
file2's AbsolutePath= D:java
file1 Canread=true
file1's len= 0
there are 133 file(s) in D:
I/O
檔案處理最常用的兩個流是FileInputStream和FileOutputStream,初始化的形式為:
FileInputStream(String fileName) throws FileNotFoundException
FileOutputStream(String fileName) throws FileNotFoundException
或者
FileInputStream(File fileName) throws FileNotFoundException
FileOutputStream(File fileName) throws FileNotFoundException
讀檔案使用的是FileInputStream中定義的read()方法,它有很多種形式,具體可參考FileInputStream,寫檔案是使用FileOutputStream中定義的write()方法,詳細參考FileOutputStream
提示
當你對檔案的操作結束後,需要呼叫close( )來關閉檔案。
- 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/itrz/java/xomxjr.html