java中文件的操作

前言:java的讀寫操作是學(xué)java開發(fā)的必經(jīng)之路,Java.io包中包括許多類提供許多有關(guān)文件的各個方面操作尝丐。下面就來總結(jié)下java的讀寫操作慢睡。
主要內(nèi)容如下

  • 1.字節(jié)流與字符流的區(qū)別
  • 2.文件操作
  • 3文件操作的具體實現(xiàn)
  • 4.實戰(zhàn):解鎖功能
一. 字節(jié)流與字符流的區(qū)別:

字節(jié)流與字符流主要的區(qū)別是他們的的處理方式
字節(jié)流是最基本的疲恢,采用ASCII編碼,所有的InputStream和OutputStream的子類都是,主要用在處理二進制數(shù)據(jù),它是按字節(jié)來處理的
但實際中很多的數(shù)據(jù)是文本睹晒,又提出了字符流的概念趟庄,采用Unicode編碼.它是按虛擬機的encode來處理,也就是要進行字符集的轉(zhuǎn)化
這兩個之間通過 InputStreamReader,OutputStreamWriter來關(guān)聯(lián)伪很,實際上是通過byte[]和String來關(guān)聯(lián)

字節(jié)流 InputStream 輸入 OutputStream 輸出
字符流 Reader 輸入 Writer 輸出
其它的類都是繼承這四個基本類的戚啥!

二:文件操作的一些總結(jié):

1 輸入輸出抽象基類InputStream/OutputStream ,實現(xiàn)文件內(nèi)容操作的基本功能函數(shù)read()锉试、 write()猫十、close()、skip()等;一般都是創(chuàng)建出其派生類對象(完成指定的特殊功能)來實現(xiàn)文件讀寫拖云。在文件讀寫的編程過程中主要應(yīng)該注意異常處理的技術(shù)贷笛。

2 FileInputStream/FileOutputStream:
用于本地文件讀寫(二進制格式讀寫并且是順序讀寫,讀和寫要分別創(chuàng)建出不同的文件流對象)宙项;
本地文件讀寫編程的基本過程為:
① 生成文件流對象(對文件讀操作時應(yīng)該為FileInputStream類乏苦,而文件寫應(yīng)該為FileOutputStream類);
② 調(diào)用FileInputStream或FileOutputStream類中的功能函數(shù)如read()尤筐、write(int b)等)讀寫文件內(nèi)容汇荐;
③ 關(guān)閉文件(close())。

3隨機文件讀寫:
RandomAccessFile類(它直接繼承于Object類而非InputStream/OutputStream類)叔磷,從而可以實現(xiàn)讀寫文件中任何位置中的數(shù)據(jù)(只需要改變文件的讀寫位置的指針)拢驾。
隨機文件讀寫編程的基本過程為:
① 生成流對象并且指明讀寫類型;
② 移動讀寫位置改基;
③ 讀寫文件內(nèi)容繁疤;
④ 關(guān)閉文件。

三:方法的實現(xiàn):創(chuàng)建文件秕狰、讀取文件稠腊、關(guān)閉文件等
  1. 創(chuàng)建文件:

使用構(gòu)造方法,如下:

  String path = "C:\Users\Administrator\Desktop\java";
  File file = new File(path.concat.("/text.txt"));
   if(file.exists() == false)
    {//不存在就創(chuàng)建
   file.createNewFile();
  }

2.文件寫入字節(jié)流

    FileOutputString fos = new FileOutString(file);
    byte [] text = {'1','2','3','4'};
    fos.write(text);
    //操作完就要關(guān)閉文件
    fos.close();

3.讀取字節(jié)流

    FileInputString fis = new FileInString(file);
    byte [] name =new byte[12];
    int count = fis.read(name)   ;
    //操作完就要關(guān)閉文件
    fis.close();

4,文件中寫入字符流

FileWriter fw = new FileWriter(file);
char [] name = {'java' ,'開'',發(fā)'};
fw.write(name);
fw.close();

5.讀取字符流

 FileReader fr= new FileReader(file);
char [] book = new char[4]; 
fr.close();

6.將文件作為輸入對象:

import java.io.File;
import java.util.Scanner;

public class MyClass {
public static void main(String[] args) throws Exception {

    File p = new File("C:\\Users\\Administrator\\Desktop\\java\\java\\java1\\src\\main\\java\\day8\\xt.txt");
      Scanner console = new Scanner(p);

    while (console.hasNext()){
        String input = console.next();
        System.out.println(input);
    }
    console.close();
}

運行結(jié)果:


xt.txt中的內(nèi)容:

四:練習(xí) 實現(xiàn)密碼解鎖功能
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOperation {
public static final String PATH= "C:\\Users\\Administrator\\Desktop\\java\\java\\java1\\src\\main\\java\\day8\\Demo1/pwd.txt";
String password;
 //單例模式
public static final FileOperation instance = new FileOperation();

private FileOperation(){
    try {
        load();
    }catch (IOException e){
        System.out.println("io 異常");
    }
}

public void load() throws IOException {
    FileInputStream fis = new FileInputStream(PATH);

    byte[] pwd = new byte[4];

    int count = fis.read(pwd);

    if (count == -1){
        password = null;
    }else{
        password = new String(pwd);
    }
    fis.close();
}

public void save(String password){
    try {
        FileOutputStream fos = new FileOutputStream(PATH);
        fos.write(password.getBytes());
        fos.close();
    } catch (IOException e){
        System.out.println("io異常");
      }
  }
}


  import java.util.Scanner;

  public class MyClass {

public static void main(String[] args){
    boolean logined =false;

    //判斷是否已經(jīng)登錄

    String password = FileOperation.instance.password;
    if (password != null){
        logined = true;
    }

    //提示用戶操作
    String alert;
    if (logined) {
        alert = "請輸入密碼";
    } else {
        alert = "請設(shè)置密碼";
    }
    System.out.println(alert);

    String firt = null;
    int wrongTime = 3;
    while (wrongTime > 0) {
        //接收用戶輸入

        Scanner scanner = new Scanner(System.in);
        String inputPassword = scanner.next();

        //判斷操作
        if (logined) {
            //已經(jīng)登陸過 直接比較
            if (password.equals(inputPassword)) {
                System.out.println("解鎖成功");
                break;
            } else {
                System.out.println("解鎖失敗 請重新輸入");
                wrongTime--;
            }
        }else{
            //沒有登陸過 在設(shè)置密碼
            //判斷是設(shè)置密碼的第一次還是第二次
            if (firt == null){
                //第一次  保存第一次輸入的密碼
                firt = inputPassword;
                System.out.println("請確認(rèn)密碼 ");
            }else{
                //第二次 比較兩次輸入的密碼是否相同
                if (firt.equals(inputPassword)){
                    System.out.println("設(shè)置密碼成功");
                    //保存設(shè)置的密碼
                    FileOperation.instance.save(firt);
                    break;
                }else{
                    System.out.println("兩次密碼不一致 請重新設(shè)置密碼:");
                    firt = null;
                    wrongTime--;
                }
            }


        }
        scanner.nextLine();
      }
    }

}

創(chuàng)建刪除文件

tring content = "Hello World";

// 第一種方法:根據(jù)文件路徑和文件名
String path = "F:\\test";
String filename = "test.txt";
File myFile = new File(path,filename);

// 第二種方法
String file = "F:\\test\\test.txt";
File myFile = new File(file);

if (!myFile.exists()) {
// 創(chuàng)建文件(前提是目錄已存在鸣哀,若不在架忌,需新建目錄即文件夾)
myFile.createNewFile();

// 刪除文件
myFile.delete();
  }

寫入文件

  // 第一種:字節(jié)流FileOutputStream
  FileOutputStream fop = new FileOutputStream(myFile); 
  byte[] contentInBytes = content.getBytes();
  fop.write(contentInBytes);  
  fop.flush();  
  fop.close(); 

// 第二種:FileWriter(參數(shù)true為追加內(nèi)容,若無則是覆蓋內(nèi)容)
  FileWriter fw = new FileWriter(myFile,true);
    fw.write(content);
  fw.close();

  // 第三種:BufferedWriter
  BufferedWriter bw = new BufferedWriter(new FileWriter(myFile,true));
  bw.write(content);  
  bw.flush();  
  bw.close(); 

  // 第四種:打印流PrintStream和PrintWriter
  // 字節(jié)打印流:PrintStream
  // 字符打印流:PrintWriter

    PrintWriter pw = new PrintWriter(new FileWriter(myFile,true));   
    pw.println(content);      // 換行
    pw.print(content);        // 不換行
    pw.close();

// 常用BufferedWriter和PrintWriter

讀取文件

FileInputStream
// 第一種:以字節(jié)為單位讀取文件我衬,常用于讀二進制文件叹放,如圖片、聲音挠羔、影像等文件井仰。 
InputStream in = new FileInputStream(myFile);

// 一次讀一個字節(jié)
  int tempbyte;  
while ((tempbyte = in.read()) != -1) {  
System.out.write(tempbyte);  
}  
in.close();

// 一次讀多個字節(jié)
int byteread = 0;
byte[] tempbytes = new byte[100];
ReadFromFile.showAvailableBytes(in);
while ((byteread = in.read(tempbytes)) != -1) {  
  S ystem.out.write(tempbytes, 0, byteread);  
  }  

  // System.out.write()方法是字符流,System.out.println()方法是字節(jié)流

InputStreamReader
// 第二種:以字符為單位讀取文件,常用于讀文本破加,數(shù)字等類型的文件 
Reader reader = new InputStreamReader(new FileInputStream(myFile)); 

// 一次讀一個字節(jié)
int tempchar;  
while ((tempchar = reader.read()) != -1) {  
// 對于windows下俱恶,\r\n這兩個字符在一起時,表示一個換行范舀。  
// 但如果這兩個字符分開顯示時合是,會換兩次行。  
// 因此锭环,屏蔽掉\r聪全,或者屏蔽\n。否則辅辩,將會多出很多空行荔烧。  
if (((char) tempchar) != '\r') {  
    System.out.print((char) tempchar);  
      }  
}  
reader.close();

  // 一次讀多個字節(jié)
char[] tempchars = new char[30];  
int charread = 0;  
// 讀入多個字符到字符數(shù)組中吱七,charread為一次讀取字符數(shù)  
  while ((charread = reader.read(tempchars)) != -1) {  
// 同樣屏蔽掉\r不顯示  
if ((charread == tempchars.length) && (tempchars[tempchars.length - 1] != '\r')) {  
    System.out.print(tempchars);  
} else {  
    for (int i = 0; i < charread; i++) {  
        if (tempchars[i] == '\r') {  
            continue;  
        } else {  
            System.out.print(tempchars[i]);  
        }  
    }  
  }  
}

BufferedReader

// 第三種:以行為單位讀取文件,常用于讀面向行的格式化文件 
BufferedReader reader = new BufferedReader(new FileReader      (myFile));
String tempString = null;  
  int line = 1;  
// 一次讀入一行鹤竭,直到讀入null為文件結(jié)束  
while ((tempString = reader.readLine()) != null) {  
// 顯示行號  
System.out.println("line " + line + ": " + tempString);  
line++;  
}  
reader.close();  

// 常用BufferedReader

文件函數(shù)

  //判斷文件是否存在  
myFile.exists()

//讀取文件名稱  
myFile.getName()

//讀取文件路徑(相對路徑)  
  myFile.getPath()

//讀取文件絕對路徑  
  myFile.getAbsolutePath()

//讀取文件的父級路徑  
new File(myFile.getAbsolutePath()).getParent()

//讀取文件的大小  
myFile.length()

  //判斷文件是否被隱藏  
  myFile.isHidden()

//判斷文件是否可讀  
myFile.canRead()

//判斷文件是否可寫  
myFile.canWrite()

//判斷文件是否為文件夾  
myFile.isDirectory()

這個練習(xí)相比而言比較簡單,答案我就不公布景醇,希望大家不忘初心臀稚,每天跟著腳步走,有時候三痰,在電腦前坐久了吧寺,腰酸背痛,在學(xué)習(xí)的同時不要忘記運動呀各位散劫,身體是革命的本錢呀~~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稚机,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子获搏,更是在濱河造成了極大的恐慌赖条,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件常熙,死亡現(xiàn)場離奇詭異纬乍,居然都是意外死亡,警方通過查閱死者的電腦和手機裸卫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門仿贬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墓贿,你說我怎么就攤上這事茧泪。” “怎么了聋袋?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵队伟,是天一觀的道長。 經(jīng)常有香客問我舱馅,道長缰泡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任代嗤,我火速辦了婚禮棘钞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘干毅。我一直安慰自己宜猜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布硝逢。 她就那樣靜靜地躺著姨拥,像睡著了一般绅喉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叫乌,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天柴罐,我揣著相機與錄音,去河邊找鬼憨奸。 笑死革屠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的排宰。 我是一名探鬼主播似芝,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼板甘!你這毒婦竟也來了党瓮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盐类,失蹤者是張志新(化名)和其女友劉穎寞奸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傲醉,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蝇闭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硬毕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呻引。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吐咳,靈堂內(nèi)的尸體忽然破棺而出逻悠,到底是詐尸還是另有隱情,我是刑警寧澤韭脊,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布童谒,位于F島的核電站,受9級特大地震影響沪羔,放射性物質(zhì)發(fā)生泄漏饥伊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一蔫饰、第九天 我趴在偏房一處隱蔽的房頂上張望琅豆。 院中可真熱鬧,春花似錦篓吁、人聲如沸茫因。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冻押。三九已至驰贷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洛巢,已是汗流浹背括袒。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稿茉,地道東北人箱熬。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像狈邑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚤认,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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

  • 五米苹、IO流 1、IO流概述 (1)用來處理設(shè)備(硬盤砰琢,控制臺蘸嘶,內(nèi)存)間的數(shù)據(jù)。(2)java中對數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 508評論 0 0
  • Java 流在處理上分為字符流和字節(jié)流陪汽。字符流處理的單元為 2 個字節(jié)的 Unicode 字符训唱,分別操作字符、字符...
    布魯斯不吐絲閱讀 692評論 0 4
  • 1 I/O流的概念挚冤,分類2 I/O所有類的結(jié)構(gòu)圖及詳解3 何為NIO况增,和傳統(tǒng)I/O有何區(qū)別4 在開發(fā)中正確使用I/...
    艾剪疏閱讀 493評論 0 2
  • 本部分總結(jié)一下JAVA IO的相關(guān)知識。 全部章節(jié)傳送門: JAVA IO學(xué)習(xí)筆記: IO基本知識 JAVA IO...
    簡單一點點閱讀 1,909評論 0 0
  • 童書與寫作 1. 4日训挡,廣州少年兒童圖書館“童書名著親子閱讀沙龍”第十一次活動澳骤,和大小讀者朋友共讀李歐·李奧尼作品...
    天使魚001閱讀 432評論 0 1