- 相關(guān)推薦
Java入門(mén)基礎知識:Java IO(輸入/輸出)
Java中將輸入輸出抽象成流,流通過(guò)輸入輸出系統與物理設備連接,盡管與它們鏈接的物理設備不盡相同,所有流的行為具有同樣的方式。今天yjbys小編為大家帶來(lái)最新Java入門(mén)基礎知識——Java IO(輸入/輸出),希望對同學(xué)們學(xué)習java基礎知識有所幫助!
Java語(yǔ)言中的IO包支持Java的基本I/O(輸入/輸出)系統,包括文件的輸入/輸出。Java所有的I/O機制都是基于數據流進(jìn)行輸入輸出,這些數據流表示了字符或者字節數據的流動(dòng)序列。Java的I/O流提供了讀寫(xiě)數據的標準方法。任何Java中表示數據源的對象都會(huì )提供以數據流的方式讀寫(xiě)它的數據的方法。
Java I/O基礎流的概念
java中將輸入輸出抽象成流,流通過(guò)輸入輸出系統與物理設備連接,盡管與它們鏈接的物理設備不盡相同,所有流的行為具有同樣的方式。將數據從外部(包括磁盤(pán)文件、鍵盤(pán)、套接字)讀入到內存中的流稱(chēng)為輸入流,將從內存寫(xiě)入到外部設備(控制臺、磁盤(pán)文件或者網(wǎng)絡(luò ))的稱(chēng)為輸出流。
流的分類(lèi)
流序列中的數據既可以是未經(jīng)加工的原始二進(jìn)制數據,也可以是經(jīng)一定編碼處理后符合某種格式規定的特定數據。因此Java中的流分為兩種:
字節流:數據流中最小的數據單元是字節 多用于讀取或書(shū)寫(xiě)二進(jìn)制數據
字符流:數據流中最小的數據單元是字符, Java中的字符是Unicode編碼,一個(gè)字符占用兩個(gè)字節。
提示
在最底層,所有的輸入/輸出都是字節形式的;谧址牧髦粸樘幚碜址峁┓奖阌行У姆椒。
字節流
字節流的最頂層是兩個(gè)抽象類(lèi):InputStream和OutputStream,其他關(guān)于處理字節的類(lèi)都是它們的子類(lèi),這些子類(lèi)對不同的外設進(jìn)行處理,例如磁盤(pán)文件,網(wǎng)絡(luò )連接,甚至是內存緩沖區。
抽象類(lèi)InputStream 和 OutputStream中定義了實(shí)現其他流類(lèi)的關(guān)鍵方法read()和write(),它們分別對數據的字節進(jìn)行讀寫(xiě)。兩種方法都是抽象方法,被子類(lèi)重載。
例1 文件按字節流的方式拷貝
import java.io.*;
//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("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
例1中,上面使用的是文件名來(lái)創(chuàng )建FileInoutStream和FileOutputStream,實(shí)際上可以還可以使用文件對象來(lái)創(chuàng )建輸入輸出流。字節流的每次操作都是一個(gè)數據單位——字節,假如input.txt文件中包含 Hello world ,那么它將復制完“H”之后,再復制“e”,接著(zhù)就是“l”,如此類(lèi)推直到其結束。in.read()每次從輸入流中讀取一個(gè)字節,如果達到文件末尾就返回-1。使用完了,還要關(guān)閉這些字節流,調用close()方法。
File inFile = new File("input.txt");
File outFile = new File("output.txt");
FileInputStream in = new FileInputStream(inFile);
FileOutputStream out = new FileOutputStream(outFile);
字符流
java是使用16-bits來(lái)存儲字符數據的,涉及到的大多是字符操作,在程序中使用字符流會(huì )比字節流更加合適。類(lèi)似于字節流,字符流的兩個(gè)頂層抽象類(lèi)是Reader和Writer,一下是它們的子類(lèi)處理字符流。
類(lèi)似于字節,字符的抽象類(lèi)Reader和 Writer中也定義了關(guān)鍵方法read()和write(),它們分別對字符進(jìn)行讀寫(xiě)。兩種方法也都是抽象方法,被子類(lèi)重載。
例2 文件按字符流的方式拷貝
import java.io.*;
//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("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
和例1對比發(fā)現,只有聲明的I/O流的類(lèi)名不同,這里使用的FileReader和FileWriter,它們操作的最小單位是一個(gè)字符16bits,而FileInputStream和FileOutputStream最小單位則是一個(gè)字節8bits.
java 自定義的標準流
標準輸入流 System.in 讀取標準輸入設備數據,例如鍵盤(pán)輸入(默認),其類(lèi)型是InputStream,三個(gè)重要的讀入方法:
int read() 從輸入流中讀取數據的下一個(gè)字節,返回ASCII碼。若,返回值=-1,說(shuō)明沒(méi)有讀取到任何字節讀取工作結束
int read(byte[] b) 從輸入流中讀取一定數量的字節,并將這些數據存儲到緩沖區數組b中
int read(byte[] b, int off, int len) 將輸入流中最多len個(gè)字節讀入到字節數組b中
標準輸出流 System.out 向標準的輸出設備寫(xiě)入數據,默認情況下指控制臺,其類(lèi)型是PrintStream,包含兩個(gè)重要的方法:print()(不換行)和println()(輸出之后換行)
標準錯誤流 System.err 默認也是控制臺,類(lèi)型和System.out相同是PrintStream,
提示
這些流都有默認的設備,但它們可以重定向到任何兼容的輸入/輸出設備。
控制臺的輸入和輸出
正如上面所介紹的,控制臺的輸入、輸出是由System.in和System.out來(lái)完成的。目前,讀取控制臺的輸入輸出的首選方法的是字符流,但完成控制臺輸入的唯一方法是字節流,因而java提供了InputStreamReader和OutputStreamWriter將字節流轉化成字符流。BufferedReader是緩沖輸入字符流。正如我們在例子中看到的,java允許使用System.out向控制臺寫(xiě)數據,但在實(shí)際的項目中,它推薦使用PrintWriter,它是基于字符的。
例3 控制臺輸入字符
import java.io.*;
class ConsoleInOut{
public static void main(String args[])throws IOException{
char c;
InputStreamReader isr = new InputStreamReader(System.in); //①
BufferedReader br = new BufferedReader(isr); //②
System.out.println("Enter characters, 'q' to exit.");
c=(char)br.read();
while(c != 'q'){
System.out.println(c);
c = (char) br.read();
} ;
}
}
輸出:
D:\java>java ConsoleInOut
Enter characters, 'q' to quit.
Hello world!
H
e
l
l
o
w
o
r
l
d
!
q
例3 中的①和②兩行創(chuàng )建了一個(gè)與鍵盤(pán)相連的BufferedReader對象,這里使用read()方法來(lái)讀取字符,當到達流的末尾時(shí)返回-1,輸入q退出程序。輸出我們使用的是println()方法,每次輸出后都換行。
控制臺輸入字符我們使用的是read()方法,輸入字符串的話(huà)我們可以使用readLine()方法,和輸入字符非常相似,只需要將例3中的read()方法換成readLine()方法即可,同時(shí)將改為String類(lèi)型,由于比較簡(jiǎn)單,此處不再贅述。
提高
我們來(lái)看java工具包中的輸入類(lèi)Scanner。
創(chuàng )建Scanner類(lèi)的對象時(shí),需要用System.in 作為它的參數,也可以將Scanner看作是System.in對象的支持者,System.in取得用戶(hù)輸入的內容后,交給Scanner來(lái)作一些處理.
Scanner類(lèi)中提供了多個(gè)方法:next():取得一個(gè)字符串;
hasNext():是否還有輸入;
nextInt():將取得的字符串轉換成int類(lèi)型的整數;
nextFloat():將取得的字符串轉換成float型;
nextBoolean():將取得的字符串轉換成boolean型;
提示
使用Scanner非常方便,但也有不足,Scanner取得輸入的依據是空格符,包括空格鍵,Tab鍵和Enter鍵.當按下這其中的任一鍵 時(shí),Scanner就會(huì )返回下一個(gè)輸入. 當你輸入的內容中間包括空格時(shí),顯然,使用Scanner就不能完整的獲得你輸入的字符串.
例4 Scanner
public static void main(String[] args){
Scanner sc = new Scanner(new BufferedInputStream(System.in));
while(sc.hasNext()){
int m = sc.nextInt();
String str = sc.next();
for(int i=0; i
System.out.println(sc.nextInt());
}
}
}
正如我們在例子中看到的,java允許使用System.out向控制臺寫(xiě)數據,但在實(shí)際的項目中,它推薦使用PrintWriter,它是基于字符的。
PrintWriter支持所有類(lèi)型(包括Object)的print( )和println( )方法,這樣,我們就可以像用System.out那樣用這些方法。如果遇到不同類(lèi)型的情況,PrintWriter方法調用對象的toString( )方法并打印結果。
例5 控制臺的輸出
import java.io.*;
public class TestAbstract {
public static void main(String args[]) {
PrintWriter printerWriter = new PrintWriter(System.out, true);
printerWriter.println("Hello World!");
int i = -10;
printerWriter.println(i);
double d = 0.00003;
printerWriter.println(d);
}
}
D:\java>java TestAbstract
Hello World!
-10
3.0E-5
例5 中的new PrintWriter(System.out, true)新建了一個(gè)PrinterWriter對象,指定輸出流為System.out,true是每一行輸出之后進(jìn)行刷新。
文件的輸入輸出
文件
文件File 位于java.io包中,用于描述文件和目錄的操作。創(chuàng )建文件對象如下:
File file = new File("input.txt");//文件位于當前目錄下
File file = new File("/home/user","input.txt");//文件位于/home/user目錄下
除了上述的File構造方法之外,還有很多和File相關(guān)的方法如下:
exists() 判斷文件或目錄是否存在
mkdir() 創(chuàng )建目錄
isFile()/isDirectory() 判斷是文件還是目錄
delete() 刪除文件
getPath() 獲取文件或者目錄的路徑
list() 將目錄中所有文件名保存在字符串數組中返回
例6 文件相關(guān)操作
import java.io.*;
public class TestAbstract {
public static void main(String args[]) throws IOException {
File dir = new File("D:/java");
File file1 = new File(dir, "fileTest001.txt");
File file2 = new File(dir, "fileTest002.java");
if (!dir.exists())
dir.mkdir();
if (!file1.exists())
file1.createNewFile();
if (!file2.exists())
file2.createNewFile();
System.out.println("file1's AbsolutePath= " + file1.getAbsolutePath());
System.out.println("file2's AbsolutePath= " + file2.getAbsolutePath());
System.out.println("file1 Canread=" + file1.canRead());
System.out.println("file1's len= " + file1.length());
String[] fileList = dir.list();
System.out.println("there are " + fileList.length + " file(s) in D:");
}
}
運行結果:
D:\java>java TestAbstract
file1's AbsolutePath= D:\java\fileTest001.txt
file2's AbsolutePath= D:\java\fileTest002.java
file1 Canread=true
file1's len= 0
there are 133 file(s) in D:
I/O
文件處理最常用的兩個(gè)流是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,寫(xiě)文件是使用FileOutputStream中定義的write()方法,詳細參考FileOutputStream
提示
當你對文件的操作結束后,需要調用close( )來(lái)關(guān)閉文件。
【Java入門(mén)基礎知識:Java IO輸入/輸出】相關(guān)文章:
java的輸入語(yǔ)句小結03-27
sun認證考試:Java.io的使用01-08
Java的基礎知識07-27
Java基礎知識詳解12-07
JAVA認證基礎知識:Java獲取當前的系統時(shí)間03-18
Java認證基礎知識:java字符串轉化整型問(wèn)題03-18
java必備基礎知識點(diǎn)03-07
Java基礎知識點(diǎn)歸納03-05
Java基礎知識大集合03-14