④Java.IO

java.IO包是java處理文件目錄有關(guān)的工具包哺哼,對于本節(jié)的學(xué)習(xí),我們要有以下幾個(gè)目標(biāo)

  • 了解java.io包
  • 運(yùn)用File類對文件或者目錄的屬性進(jìn)行操作
  • 理解流园欣,理解輸入輸出流的概念
  • 運(yùn)用FileInputStream類和FileOutputStream類讀帖世、寫字節(jié)文件
  • 運(yùn)用FileReader類和FileWriter類配合BufferedReader類和BufferedWriter類讀、寫字符文件沸枯。
  • 使用BufferedReader類從控制臺接受輸入
  • 運(yùn)用DataInputStream類和DataOutputStream類讀寫數(shù)據(jù)文件

這里十分感謝:http://blog.csdn.net/nisior/article/details/7162754

首先來了解File類

顧名思義看來狮暑,就是文件,這個(gè)類包含了文件的屬性包括路徑辉饱、名稱、大小等等拣展,如果在處理文件的時(shí)候需要用到某種屬性或者方法彭沼,一定要到File類來看看是否有你想要的東西。

注:學(xué)習(xí)應(yīng)該也是應(yīng)該以網(wǎng)絡(luò)的形式展開备埃,你需要做的是拓展網(wǎng)絡(luò)節(jié)點(diǎn)的個(gè)數(shù)姓惑,每個(gè)節(jié)點(diǎn)代表了一個(gè)知識點(diǎn),實(shí)踐的時(shí)候再去拓展這個(gè)節(jié)點(diǎn)按脚,形成一個(gè)子網(wǎng)絡(luò)于毙。

至于File類中的方法,希望諸君不要像我一樣偷懶辅搬,一定要瀏覽一遍唯沮。這里舉個(gè)例子以饗讀者:

public class FileDemo
{
public static void main(String[] args)
{
    //創(chuàng)建一個(gè)文件對象脖旱,使之與一個(gè)文件關(guān)聯(lián)
    File file = new File("File.txt");

    //顯示與文件有關(guān)的屬性信息
System.out.println("文件或目錄是否存在:" + file.exists());
System.out.println("是文件嗎:" + file.isFile());
System.out.println("是目錄嗎:" + file.isDirectory());
System.out.println("名稱:" + file.getName());
System.out.println("絕對路徑:" + file.getAbsolutePath());
System.out.println("文件大小:" + file.length());
    }
}
再來看看流的概念

流是指一連串流動的數(shù)據(jù)信號介蛉,是以先進(jìn)先出的方式發(fā)送和接收數(shù)據(jù)的通道萌庆。

流示意圖
流示意圖

流示意圖
流示意圖

根據(jù)流動的方向,分為輸入流和輸出流

根據(jù)文件的大小币旧,分為字節(jié)流和字符流

字節(jié)流:是指8位的通用字節(jié)流践险,以字節(jié)為基本單位,對字節(jié)流進(jìn)行操作的類大多繼承于InputStream和OutputStream類吹菱。

字符流:是指16位的Unicode字符流巍虫,以字符(兩個(gè)字節(jié))為基本單位,非常適合處理字符串和文本鳍刷,大部分繼承自Reader類和Writer類占遥。

下面我們來看看這個(gè)包中最常見的方法,也是你們今后用到的最頻繁的方法:

使用FileInputStream類讀文件
  • FileInputStream類成為文件輸入流倾剿,繼承于InputStream類筷频,是文件操作的最基本的類
  • 它的作用是將文件中的數(shù)據(jù)輸入到內(nèi)存中,我們可以利用它來讀文件
  • 由于它屬于字節(jié)流前痘,因此在讀取Unicode字符(如中文)的文件時(shí)候可能會出現(xiàn)問題
使用FileOutputStream類寫文件
  • 繼承自O(shè)utputStream類凛捏,可以利用它來寫文件。

一般來講芹缔,這兩個(gè)類的使用是成對出現(xiàn)的坯癣,采用字節(jié)來處理文件,好處就在于最欠,不必考慮數(shù)據(jù)格式的問題示罗,雖然在編碼上稍微復(fù)雜了一些,但是當(dāng)文件過大的時(shí)候芝硬,效率就體現(xiàn)出來了蚜点。

public class CopyFileDemo {
public static void main(String[] args) throws IOException {
File srcFile = new File("src.dat");    //源文件對象
File destFile = new File("dest.dat");  //目標(biāo)文件對象
if (!(destFile.exists())) {  //判斷目標(biāo)文件是否存在
  destFile.createNewFile();  //如果不存在則創(chuàng)建新文件
}
//使用源文件對象創(chuàng)建文件輸入流對象
FileInputStream fis = new FileInputStream(srcFile);
//使用目標(biāo)文件對象創(chuàng)建文件輸出流對象
FileOutputStream fos = new FileOutputStream(destFile);
byte[] buf = new byte[1024];  //創(chuàng)建字節(jié)數(shù)組,作為臨時(shí)緩沖
System.out.println("開始復(fù)制文件...");
while (fis.read(buf) != -1) {  //循環(huán)從文件輸入流中讀取數(shù)據(jù)
  fos.write(buf);    //寫入到文件輸出流中
}
System.out.println("文件復(fù)制成功拌阴!");
fis.close();    //關(guān)閉流
fos.close();

}
}

字符流

? FileInputStram類和FileOutputStream類雖然可以高效率地讀/寫文件绍绘,但對于Unicode編碼的文件,使用它們有可能出現(xiàn)亂碼迟赃;

? 考慮到Java是跨平臺的語言陪拘,要經(jīng)常操作Unicode編碼的文件,使用字符流操作文件是有必要的纤壁;

? 使用字符流將涉及到以下4個(gè)類:

FileReader類和FileWriter類左刽;

BufferedReader類和BufferedWriter類。

這四個(gè)類你非常容易用到酌媒,不要再被各種名稱搞混淆欠痴,其核心就這么幾句話:
讀寫類要用Buffer類包裝迄靠,任何的讀寫都要設(shè)置緩存才能實(shí)現(xiàn)高效。

可以將這段代碼作為例子仔細(xì)的研讀一番

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


public class Test11 {


public static void main(String[] args) throws IOException {
    String s="abcd中國家@#$%"+System.getProperty("line.separator")+"asdfsdf順右面";
    Test11 t=new Test11();
    t.writeFile(s);
    t.readFile();

}

public void readFile() throws IOException{
    File f=new File("r:\\io\\reader.doc");
    FileReader fr=new FileReader(f);
    BufferedReader br=new BufferedReader(fr);
    String ss=null;
    while((ss=br.readLine())!=null){
        System.out.println(ss);
    }
    br.close();
    fr.close();
}

public void writeFile(String s) throws IOException{
    File f=new File("r:\\io\\reader.doc");
    FileWriter fr=new FileWriter(f);
    BufferedWriter br=new BufferedWriter(fr);
    
    br.write(s);
    
    br.close();
    fr.close();
}

}

到目前位置我們已經(jīng)介紹了兩種流斋否,字符和字節(jié)梨水,這兩種流之間還有過渡流,即:
InputStreamReader, InputStreamWriter
他們是字節(jié)流和字符流的橋梁茵臭,作用是人為的操作格式編碼疫诽。

設(shè)想這么一種情況:
當(dāng)你使用System.in 從控制臺接受輸入的時(shí)候,由于in是一個(gè)InputStream類型的對象旦委,所以你每一次只能從控制臺輸入一個(gè)字節(jié)才不會引起錯(cuò)誤奇徒,所以必須對in進(jìn)行處理,才可以順利的從控制臺接受輸出缨硝,所以將使用:
 InputStreamReader
 BufferedReader
 
?可以使用它來轉(zhuǎn)換System.in摩钙,如:
InputStreamReader isr = new InputStreamReader(System.in);
?這樣的字符流效率很低,再使用BufferedReader類來為其建立緩沖查辩,如:
BufferedReader br = new BufferedReader(isr);
?這樣胖笛,就可以從控制臺接受輸入了。
基本數(shù)據(jù)類型的讀/寫

?FileInputStream和FileOutputStream在讀寫文件時(shí)不考慮數(shù)據(jù)的類型宜岛;
?FileWriter和FileReader在讀寫文件時(shí)长踊,將所有的數(shù)據(jù)都看做字符;
?有時(shí)候萍倡,我們需要將各種類型的數(shù)據(jù)寫入文件或是從文件中讀取身弊,

DataInputStream類和DataOutputStream類可以滿足需要。

但是它們不能單獨(dú)使用列敲,需要配合別的字節(jié)流一起使用阱佛。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Test8 {

public static void main(String[] args) throws Exception {
    File f = new File("r:\\io\\dat.dat");

    FileOutputStream fos = new FileOutputStream(f);
    DataOutputStream dos = new DataOutputStream(fos);
    dos.write(22);
    dos.writeBoolean(true);
    dos.writeChar('a');
    dos.writeUTF("abc中國家####");

    dos.close();
    fos.close();
    
    
    FileInputStream fis=new FileInputStream(f);
    DataInputStream dis=new DataInputStream(fis);
    
  System.out.println(  dis.read());
  System.out.println(  dis.readBoolean());
}

}
ObjectInputStream ObjectOutputStream

作用:用來處理Object對象的流,能將原來只能存于VM中的對象存入到我們要求的儲存介質(zhì)中去戴而,可以用來做數(shù)據(jù)緩存凑术。
處理的對象都必須實(shí)現(xiàn)Serializable,transiant關(guān)鍵字來修飾無需序列化的屬性

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Test9 {

public static void main(String[] args) throws Exception {
    File f = new File("r:\\io\\dat2.dat");

    FileOutputStream fos = new FileOutputStream(f);
    ObjectOutputStream dos = new ObjectOutputStream(fos);
    
    Person p=new Person("yy",22);
    
    dos.writeObject(p);

    dos.close();
    fos.close();
    
    FileInputStream fis=new FileInputStream(f);
    ObjectInputStream ois=new ObjectInputStream(fis);
    
    Person ps=(Person)ois.readObject();
    
    System.out.println(ps.getName()+"\t"+ps.getId());
    

}

}

class Person implements Serializable{
private String name;
private transient int id;

public Person() {
    super();
}
public Person(String name, int id) {
    super();
    this.name = name;
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}   

}
RandomAccessFile:隨機(jī)文件讀取

使用場景:支持對隨機(jī)訪問文件的讀取和寫入
特點(diǎn):

  • 類中既有讀方法也有寫方法

  • 必須指定訪問文件模式

  • seek()和skip()
    示例:操作日志

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.text.SimpleDateFormat;
    import java.util.Date;

public class Test10 {

public static void main(String[] args) throws IOException {
    BankAccount ba=new BankAccount(1000);
    for(int i=0;i<10;i++){
    ba.withDrawal(100);
    }

}
}


class BankAccount{
private int money;
public BankAccount(int money){
    this.money=money;
}

public void withDrawal(int money) throws IOException{
    this.money=this.money-money;
    log("您取了"+money+",賬戶余額:"+this.money);
}

private void log(String string) throws IOException {
    File f=new File("r:\\io\\log.txt");
    RandomAccessFile raf=new RandomAccessFile(f,"rwd");
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
    Date d=new Date();
    String dd=sdf.format(d);
    
    raf.seek(raf.length());
    
    String s="\r\n"+dd+"\t"+string;
    raf.write(s.getBytes("gbk"));
    raf.close();
    
}

}

總結(jié)

? java.io包是Java內(nèi)置的包所意,其中包含一系列對輸入/輸出進(jìn)行操作的類淮逊;

? File類的對象可以訪問文件(或目錄)的屬性,但不可以進(jìn)行讀/寫操作扁眯;

? 從方向上講,流分為輸入流和輸出流翅帜,但從格式上區(qū)分的話姻檀,流分為字節(jié)流和字符流;

? 使用FileInputStream類和FileOutputStream類以字節(jié)流方式對文件進(jìn)行讀/寫操作涝滴,這是操作文件最基本的兩個(gè)類绣版;

? FileReader類和FileWriter類配合BufferedReader類和BufferedWriter類可以以字符流方式對文件進(jìn)行讀/寫操作胶台;

? 從控制臺接受輸入要使用到InputStreamReader類和BufferedReader類;

? DataInputStream類和DataOutputStream類允許讀/寫各種基本數(shù)據(jù)類型杂抽;

? 絕大部分的IO操作都可能拋出IOException诈唬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缩麸,隨后出現(xiàn)的幾起案子铸磅,更是在濱河造成了極大的恐慌,老刑警劉巖杭朱,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅仔,死亡現(xiàn)場離奇詭異,居然都是意外死亡弧械,警方通過查閱死者的電腦和手機(jī)八酒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刃唐,“玉大人羞迷,你說我怎么就攤上這事』ⅲ” “怎么了衔瓮?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荒澡。 經(jīng)常有香客問我报辱,道長,這世上最難降的妖魔是什么单山? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任碍现,我火速辦了婚禮,結(jié)果婚禮上米奸,老公的妹妹穿的比我還像新娘昼接。我一直安慰自己,他們只是感情好悴晰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布慢睡。 她就那樣靜靜地躺著,像睡著了一般铡溪。 火紅的嫁衣襯著肌膚如雪漂辐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天棕硫,我揣著相機(jī)與錄音髓涯,去河邊找鬼。 笑死哈扮,一個(gè)胖子當(dāng)著我的面吹牛纬纪,可吹牛的內(nèi)容都是我干的蚓再。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼包各,長吁一口氣:“原來是場噩夢啊……” “哼摘仅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起问畅,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤娃属,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后按声,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膳犹,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年签则,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了须床。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渐裂,死狀恐怖豺旬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柒凉,我是刑警寧澤族阅,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站膝捞,受9級特大地震影響坦刀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔬咬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一鲤遥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧林艘,春花似錦盖奈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啥酱,卻和暖如春爹凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镶殷。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工禾酱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓宇植,卻偏偏與公主長得像,于是被迫代替她去往敵國和親埋心。 傳聞我的和親對象是個(gè)殘疾皇子指郁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法拷呆,內(nèi)部類的語法闲坎,繼承相關(guān)的語法,異常的語法茬斧,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • tags:io categories:總結(jié) date: 2017-03-28 22:49:50 不僅僅在JAVA領(lǐng)...
    行徑行閱讀 2,171評論 0 3
  • 一腰懂、流的概念和作用。 流是一種有順序的项秉,有起點(diǎn)和終點(diǎn)的字節(jié)集合绣溜,是對數(shù)據(jù)傳輸?shù)目偝苫虺橄蟆<磾?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,023評論 2 95
  • 標(biāo)準(zhǔn)輸入輸出娄蔼,文件的操作怖喻,網(wǎng)絡(luò)上的數(shù)據(jù)流,字符串流岁诉,對象流锚沸,zip文件流等等,java中將輸入輸出抽象稱為流,就好...
    navy_legend閱讀 707評論 0 0
  • 那是四個(gè)字,“禁止說話”去件。 宋大伯心下一琢磨饭望,這是監(jiān)獄里的規(guī)矩吧,寫在墻上是不讓犯人吵鬧喧嘩以免亂了秩序较锡,要是...
    予安手記閱讀 331評論 5 1