關(guān)于Java編程基礎(chǔ)學(xué)習(xí)輸入輸出IO的問題

Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java 技術(shù)具有卓越的通用性、高效性位衩、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC分井、數(shù)據(jù)中心、游戲控制臺(tái)歼疮、科學(xué)超級(jí)計(jì)算機(jī)杂抽、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群韩脏。

給你學(xué)習(xí)路線:html-css-js-jq-javase-數(shù)據(jù)庫-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm

Java中將輸入輸出抽象成流缩麸,流通過輸入輸出系統(tǒng)與物理設(shè)備連接,盡管與它們鏈接的物理設(shè)備不盡相同赡矢,所有流的行為具有同樣的方式杭朱。

Java語言中的IO包支持Java的基本I/O(輸入/輸出)系統(tǒng),包括文件的輸入/輸出吹散。Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出弧械,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動(dòng)序列。Java的I/O流提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法空民。任何Java中表示數(shù)據(jù)源的對(duì)象都會(huì)提供以數(shù)據(jù)流的方式讀寫它的數(shù)據(jù)的方法刃唐。

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零,五五四界轩,六零七 】画饥,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)浊猾!裙內(nèi)有開發(fā)工具抖甘,很多干貨和技術(shù)資料分享!

Java I/O基礎(chǔ)

流的概念

java中將輸入輸出抽象成流葫慎,流通過輸入輸出系統(tǒng)與物理設(shè)備連接衔彻,盡管與它們鏈接的物理設(shè)備不盡相同,所有流的行為具有同樣的方式偷办。將數(shù)據(jù)從外部(包括磁盤文件艰额、鍵盤、套接字)讀入到內(nèi)存中的流稱為輸入流椒涯,將從內(nèi)存寫入到外部設(shè)備(控制臺(tái)悴晰、磁盤文件或者網(wǎng)絡(luò))的稱為輸出流。

流的分類

流序列中的數(shù)據(jù)既可以是未經(jīng)加工的原始二進(jìn)制數(shù)據(jù)逐工,也可以是經(jīng)一定編碼處理后符合某種格式規(guī)定的特定數(shù)據(jù)铡溪。因此Java中的流分為兩種:

·

字節(jié)流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字節(jié) 多用于讀取或書寫二進(jìn)制數(shù)據(jù)

·

·

字符流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字符, Java中的字符是Unicode編碼泪喊,一個(gè)字符占用兩個(gè)字節(jié)棕硫。

·

提示

在最底層,所有的輸入/輸出都是字節(jié)形式的袒啼」纾基于字符的流只為處理字符提供方便有效的方法。

字節(jié)流

字節(jié)流的最頂層是兩個(gè)抽象類:InputStream和OutputStream蚓再,其他關(guān)于處理字節(jié)的類都是它們的子類滑肉,這些子類對(duì)不同的外設(shè)進(jìn)行處理,例如磁盤文件摘仅,網(wǎng)絡(luò)連接靶庙,甚至是內(nèi)存緩沖區(qū)。

抽象類InputStream 和 OutputStream中定義了實(shí)現(xiàn)其他流類的關(guān)鍵方法read()和write()娃属,它們分別對(duì)數(shù)據(jù)的字節(jié)進(jìn)行讀寫六荒。兩種方法都是抽象方法,被子類重載矾端。

例1 文件按字節(jié)流的方式拷貝

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中掏击,上面使用的是文件名來創(chuàng)建FileInoutStream和FileOutputStream,實(shí)際上可以還可以使用文件對(duì)象來創(chuàng)建輸入輸出流秩铆。字節(jié)流的每次操作都是一個(gè)數(shù)據(jù)單位——字節(jié)砚亭,假如input.txt文件中包含 Hello world ,那么它將復(fù)制完“H”之后,再復(fù)制“e”殴玛,接著就是“l(fā)”捅膘,如此類推直到其結(jié)束。in.read()每次從輸入流中讀取一個(gè)字節(jié)族阅,如果達(dá)到文件末尾就返回-1篓跛。使用完了,還要關(guān)閉這些字節(jié)流坦刀,調(diào)用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來存儲(chǔ)字符數(shù)據(jù)的,涉及到的大多是字符操作鲤遥,在程序中使用字符流會(huì)比字節(jié)流更加合適沐寺。類似于字節(jié)流,字符流的兩個(gè)頂層抽象類是Reader和Writer盖奈,一下是它們的子類處理字符流混坞。

類似于字節(jié),字符的抽象類Reader和 Writer中也定義了關(guān)鍵方法read()和write(),它們分別對(duì)字符進(jìn)行讀寫究孕。兩種方法也都是抽象方法啥酱,被子類重載。

例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對(duì)比發(fā)現(xiàn)厨诸,只有聲明的I/O流的類名不同镶殷,這里使用的FileReader和FileWriter,它們操作的最小單位是一個(gè)字符16bits微酬,而FileInputStream和FileOutputStream最小單位則是一個(gè)字節(jié)8bits.

java 自定義的標(biāo)準(zhǔn)流

標(biāo)準(zhǔn)輸入流 System.in 讀取標(biāo)準(zhǔn)輸入設(shè)備數(shù)據(jù)绘趋,例如鍵盤輸入(默認(rèn)),其類型是InputStream颗管,三個(gè)重要的讀入方法:

int read() 從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié)陷遮,返回ASCII碼。若,返回值=-1垦江,說明沒有讀取到任何字節(jié)讀取工作結(jié)束

int read(byte[] b) 從輸入流中讀取一定數(shù)量的字節(jié)帽馋,并將這些數(shù)據(jù)存儲(chǔ)到緩沖區(qū)數(shù)組b中

int read(byte[] b, int off, int len) 將輸入流中最多l(xiāng)en個(gè)字節(jié)讀入到字節(jié)數(shù)組b中

標(biāo)準(zhǔn)輸出流 System.out 向標(biāo)準(zhǔn)的輸出設(shè)備寫入數(shù)據(jù),默認(rèn)情況下指控制臺(tái)疫粥,其類型是PrintStream茬斧,包含兩個(gè)重要的方法:print()(不換行)和println()(輸出之后換行)

標(biāo)準(zhǔn)錯(cuò)誤流 System.err 默認(rèn)也是控制臺(tái),類型和System.out相同是PrintStream梗逮,

提示

這些流都有默認(rèn)的設(shè)備项秉,但它們可以重定向到任何兼容的輸入/輸出設(shè)備。

控制臺(tái)的輸入和輸出

正如上面所介紹的慷彤,控制臺(tái)的輸入娄蔼、輸出是由System.in和System.out來完成的。目前底哗,讀取控制臺(tái)的輸入輸出的首選方法的是字符流岁诉,但完成控制臺(tái)輸入的唯一方法是字節(jié)流,因而java提供了InputStreamReader和OutputStreamWriter將字節(jié)流轉(zhuǎn)化成字符流跋选。BufferedReader是緩沖輸入字符流涕癣。正如我們?cè)诶又锌吹降模琷ava允許使用System.out向控制臺(tái)寫數(shù)據(jù)前标,但在實(shí)際的項(xiàng)目中坠韩,它推薦使用PrintWriter,它是基于字符的炼列。

例3 控制臺(tái)輸入字符

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();

} ;

}

}

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零只搁,五五四,六零七 】俭尖,無論你是大牛還是小白氢惋,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)洞翩!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享焰望!

輸出:

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è)與鍵盤相連的BufferedReader對(duì)象骚亿,這里使用read()方法來讀取字符,當(dāng)?shù)竭_(dá)流的末尾時(shí)返回-1柿估,輸入q退出程序循未。輸出我們使用的是println()方法,每次輸出后都換行秫舌。

控制臺(tái)輸入字符我們使用的是read()方法,輸入字符串的話我們可以使用readLine()方法绣檬,和輸入字符非常相似足陨,只需要將例3中的read()方法換成readLine()方法即可,同時(shí)將改為String類型娇未,由于比較簡單墨缘,此處不再贅述。

提高

我們來看java工具包中的輸入類Scanner零抬。

創(chuàng)建Scanner類的對(duì)象時(shí),需要用System.in 作為它的參數(shù),也可以將Scanner看作是System.in對(duì)象的支持者,System.in取得用戶輸入的內(nèi)容后,交給Scanner來作一些處理.

Scanner類中提供了多個(gè)方法:next():取得一個(gè)字符串;

hasNext():是否還有輸入镊讼;

nextInt():將取得的字符串轉(zhuǎn)換成int類型的整數(shù);

nextFloat():將取得的字符串轉(zhuǎn)換成float型;

nextBoolean():將取得的字符串轉(zhuǎn)換成boolean型;

提示

使用Scanner非常方便,但也有不足平夜,Scanner取得輸入的依據(jù)是空格符,包括空格鍵,Tab鍵和Enter鍵.當(dāng)按下這其中的任一鍵 時(shí),Scanner就會(huì)返回下一個(gè)輸入. 當(dāng)你輸入的內(nèi)容中間包括空格時(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());

}

}

}

正如我們?cè)诶又锌吹降牡澹琷ava允許使用System.out向控制臺(tái)寫數(shù)據(jù),但在實(shí)際的項(xiàng)目中忽妒,它推薦使用PrintWriter玩裙,它是基于字符的。

PrintWriter支持所有類型(包括Object)的print( )和println( )方法段直,這樣吃溅,我們就可以像用System.out那樣用這些方法。如果遇到不同類型的情況鸯檬,PrintWriter方法調(diào)用對(duì)象的toString( )方法并打印結(jié)果决侈。

例5 控制臺(tái)的輸出

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對(duì)象,指定輸出流為System.out喧务,true是每一行輸出之后進(jìn)行刷新赖歌。

文件的輸入輸出

文件

文件File 位于java.io包中,用于描述文件和目錄的操作蹂楣。創(chuàng)建文件對(duì)象如下:

File file = new File("input.txt");//文件位于當(dāng)前目錄下

File file = new File("/home/user","input.txt");//文件位于/home/user目錄下

除了上述的File構(gòu)造方法之外俏站,還有很多和File相關(guān)的方法如下:

exists() 判斷文件或目錄是否存在

mkdir() 創(chuàng)建目錄

isFile()/isDirectory() 判斷是文件還是目錄

delete() 刪除文件

getPath() 獲取文件或者目錄的路徑

list() 將目錄中所有文件名保存在字符串?dāng)?shù)組中返回

例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:");

}

}

運(yùn)行結(jié)果:

D:java>java TestAbstract

file1's AbsolutePath= D:javaileTest001.txt

file2's AbsolutePath= D:javaileTest002.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

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零痊土,五五四肄扎,六零七 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)犯祠!裙內(nèi)有開發(fā)工具旭等,很多干貨和技術(shù)資料分享!

或者

FileInputStream(File fileName) throws FileNotFoundException

FileOutputStream(File fileName) throws FileNotFoundException

讀文件使用的是FileInputStream中定義的read()方法衡载,它有很多種形式搔耕,具體可參考FileInputStream,寫文件是使用FileOutputStream中定義的write()方法痰娱,詳細(xì)參考FileOutputStream

提示

當(dāng)你對(duì)文件的操作結(jié)束后弃榨,需要調(diào)用close( )來關(guān)閉文件。

具體的實(shí)例請(qǐng)參考例1和例2梨睁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲸睛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坡贺,更是在濱河造成了極大的恐慌官辈,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遍坟,死亡現(xiàn)場(chǎng)離奇詭異拳亿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愿伴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門肺魁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人公般,你說我怎么就攤上這事万搔。” “怎么了官帘?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵瞬雹,是天一觀的道長。 經(jīng)常有香客問我刽虹,道長酗捌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任涌哲,我火速辦了婚禮胖缤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阀圾。我一直安慰自己哪廓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布初烘。 她就那樣靜靜地躺著涡真,像睡著了一般分俯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哆料,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天缸剪,我揣著相機(jī)與錄音,去河邊找鬼东亦。 笑死杏节,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的典阵。 我是一名探鬼主播奋渔,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼萄喳!你這毒婦竟也來了卒稳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤他巨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后减江,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體染突,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年辈灼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了份企。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巡莹,死狀恐怖司志,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情降宅,我是刑警寧澤骂远,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站腰根,受9級(jí)特大地震影響激才,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜额嘿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一瘸恼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧册养,春花似錦东帅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帐我。三九已至,卻和暖如春阎毅,著一層夾襖步出監(jiān)牢的瞬間焚刚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工扇调, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矿咕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓狼钮,卻偏偏與公主長得像碳柱,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熬芜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容