中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java文件操作(讀寫操作)

發布時間:2020-07-03 19:02:49 來源:網絡 閱讀:603 作者:江彩 欄目:編程語言

java文件操作(讀寫操作)
java的讀寫操作是學java開發的必經之路,下面就來總結下java的讀寫操作。

從上圖可以開出,java的讀寫操作(輸入輸出)可以用“流”這個概念來表示,總體而言,java的讀寫操作又分為兩種:字符流和字節流。

什么是流?

流是一個抽象的概念。當Java程序需要從數據源讀取數據時,會開啟一個到數據源的流。數據源可以是文件,內存或者網絡等。同樣,當程序需要輸出數據到目的地時也一樣會開啟一個流,數據目的地也可以是文件、內存或者網絡等。流的創建是為了更方便地處理數據的輸入輸出。

那么字節流和字符流又有什么區別呢?

1.字節流也稱為原始數據,需要用戶讀入后進行相應的編碼轉換。而字符流的實現是基于自動轉換的,讀取數據時會把數據按照JVM的默認編碼自動轉換成字符。

2.字符流處理的單元為2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元為1個字節,操作字節和字節數組。

所以字符流是由Java虛擬機將字節轉化為2個字節的Unicode字符為單位的字符而成的。

3.字節流可用于任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串,字節流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以;

基于以上的區別,那么什么情況下用字符流,什么情況下用字節流呢?

如果是音頻文件、圖片、歌曲,就用字節流好點;如果是中文(文本)的,用字符流更好;

說了這么多,字節流和字符流處理文件到底怎么用呢?

稍安勿躁,讓我們先來看看在java中,輸入輸出操作的步驟是什么?

1 使用File類打開一個文件

2 通過字節流或字符流的子類,指定輸出的位置,注,

3 進行讀/寫操作

4 關閉輸入/輸出

IO操作屬于資源操作,一定要記得關閉

字節流:

1.按照字節流的方式從文件中讀取數據。
2.package ioInJava.characterStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class CharIo {

public static void main(String[] args) {

    // 第一種方式讀文件,因為方法throws了異常,所以在這要捕獲異常
    try {
        CharIo.readFromFileByByte();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.out.println("找不到文件啊");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("讀不成功啊!");
    }

    System.out.println("===========================");

    // 第二種方式讀文件
    try {
        CharIo.readFromFileByteTwo();
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("還是讀不成功啊!");
    }

}

/**
 * 第一種方法讀文件
 * 通過字符流讀取文件中的數據
 * @throws IOException 
 */
public static void readFromFileByByte() throws IOException{
    File file = new File("abc.txt");
    // 如果文件不存在則創建文件
    if (!file.exists()) {
        file.createNewFile();
    }
    InputStream inputStream = new FileInputStream(file);
    // 這里定義了數組的長度是1024個字節,如果文件超出這字節,就會溢出,結果就是讀不到1024字節以后的東西
    byte[] bs = new byte[1024];
    // 這里len獲得的是文件中內容的長度
    int len = inputStream.read(bs);
    inputStream.close();
    System.out.println(new String(bs));
}

/**
 * 第二種方法讀文件
 * 通過字符流讀取文件中的數據
 * @throws IOException 
 */
public static void readFromFileByteTwo() throws IOException{
    // 注意這里的不同,File.separator是分隔符,這里指明絕對路徑,即D盤根目錄下的abc.txt文件
    File file = new File("d:" + File.separator+"abc.txt");
    // 如果文件不存在則創建文件
    if (!file.exists()) {
        file.createNewFile();
    }
    InputStream inputStream = new FileInputStream(file);
    // 這里也有不同,可以根據文件的大小來聲明byte數組的大小,確保能把文件讀完
    byte[] bs = new byte[(int)file.length()];
    // read()方法每次只能讀一個byte的內容
    inputStream.read(bs);
    inputStream.close();
    System.out.println(new String(bs));
}

}
2.按照字節流的方式向文件中寫入數據。
3.package ioInJava.byteStream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**

  • 不要被那么多的try和catch嚇到奧,那只是因為不想在main上throws
  • @author wsg
    */
    public class WriteToFile {

    public static void main(String[] args) {
    File file = new File("D:"+File.separator+"write.doc");
    OutputStream outputStream = null;
    if (!file.exists()) {
    try {
    // 如果文件找不到,就new一個
    file.createNewFile();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    try {
    // 定義輸出流,寫入文件的流
    outputStream = new FileOutputStream(file);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    // 定義將要寫入文件的數據
    String string = "Hell Java, Hello World, 你好,世界!";
    // 把string轉換成byte型的,并存放在數組中
    byte[] bs = string.getBytes();
    try {
    // 寫入bs中的數據到file中
    outputStream.write(bs);
    } catch (IOException e) {
    e.printStackTrace();
    }

    try {
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    // =================到此,文件的寫入已經完成了!
    
    // 如果想在文件后面追加內容的話,用下面的方法
    OutputStream outToFileEnd = null;
    try {
        outToFileEnd = new FileOutputStream(file,true);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {// 這里利用了finally總會被執行的特性,索性把后面的代碼都寫在finally中
        String string2 = "Here I come!!";
        byte[] bs2 = string2.getBytes();
        try {
            outToFileEnd.write(bs2);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                outToFileEnd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    }
    }
    1.初學者一般很容易搞混,或者弄不清inputstream和outpustream到底哪個是讀數據,哪個是寫數據,這里要說明的是,“讀和寫”是相對于程序本身而言的,主要記清楚一點即可,那就是凡是需要提供給程序處理的數據就是輸入數據,當然就是inputstream,這里的in是要in到程序里面去,那么數據從哪里來呢,自然是從外界(網絡,內存或者文件),那么針對文件而言,inputstream就是讀文件了。反之,凡是程序已經處理過的數據,當然要流出程序啦,那就是out咯,所以outputstream就是輸出的,那么從程序中流出,只能到外界(網絡、內存或者文件),針對文件而言,就是寫操作啦!(同樣的道理可以針對字符流的操作)

【簡言之,針對程序而言,in是入,out是出;這對文件而言,in是讀,out是寫!】

2.inputstream和OutputStream都是抽象類,不能實例化,使用時必須實例化一個子類(其中FileInputStream和FileOutputStream使用最多)對象來進行相關操作。

3.InputStream inputStream = new FileInputStream(fileName);當使用這個命令時,系統會提示有異常拋出,因為我們上面定義的文件程序認為是有可能存在,有可能不存在的,所以在eclipse中,給出了兩個解決辦法,一個是直接拋出異常聲明,由系統自己解決;另一個是用try,catch結構處理異常!
4.3.按照字符流的方式向文件中寫入數據。
5.package ioInJava.characterStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;

public class CharIo {

public static void main(String[] args) throws IOException {
    // 定義一個d盤根目錄下的test文檔,File.separator是分隔符
    // 下面這句代碼,就算原本沒有這個文件,也會在對應的目錄創建一個文件
    File file = new File("D:" + File.separator + "test.docx");
    // 下面這也會拋出異常,這次我們為了代碼結構清晰起見,直接throw給main吧
    Writer writer = new FileWriter(file);
    String string = "今天是教師節!";
    writer.write(string);
    // 在這一定要記得關閉流
    writer.close();
}

}
但是,上面的代碼有一個問題,比如,載定義一個string2,再次調用writer.write(string2)方法的時候,會發現test文件中的內容會被string2的內容覆蓋,要想實現內容追加到文件尾部,代碼如下,其實就是小小的修改,利用它的一個方法!
package ioInJava.characterStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;

public class CharIo {

public static void main(String[] args) throws IOException {
    // 定義一個d盤根目錄下的test文檔,File.separator是分隔符
    // 下面這句代碼,就算原本沒有這個文件,也會在對應的目錄創建一個文件
    File file = new File("D:" + File.separator + "test.docx");
    // 下面這也會拋出異常,這次我們為了代碼結構清晰起見,直接throw給main吧
    // 這里改變了writer的類型,變成了追加型
    Writer writer = new FileWriter(file, true);
    String string = "今天是教師節!";
    writer.write(string);
    String string2 = "祝愿所有的老師教師節快樂!";
    writer.write(string2);;
    // 在這一定要記得關閉流
    writer.close();
}

}
4.按照字符流的方式從文件中讀取數據。
package ioInJava.characterStream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;

public class ReadFromFile {

public static void main(String[] args) throws IOException {
    File file = new File("d:" + File.separator + "test.docx");
    Reader reader = new FileReader(file);
    char[] cs= new char[1024];
    // 上面定義了一個大小為1024的char型數組,如果文件內容過大,程序就會報錯,而不是只讀到1024的大小
    reader.read(cs, 0, (int)file.length());
    System.out.println(cs);
    reader.close();
}

}
上面的代碼只能讀取內容不超過1024字符的內容,這顯然不是我們想要的,如何讀取一個任意大小的文件呢!那么最簡單的方法就是加大數組的空間大小了,可以用file.length獲取文件的大小,從而定義數組的大小!char[] cs= new char[(int)file.length()];

當然,這不是最好的辦法,請看下面的代碼:
package ioInJava.characterStream;

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;
import java.io.Reader;
import java.io.Writer;

public class ReadFromFile {

public static void main(String[] args) throws IOException {
    try {
        // 聲明一個可變長的stringBuffer對象
        StringBuffer sb = new StringBuffer("");

        /*
         * 讀取完整文件
         */
        Reader reader = new FileReader("d:" + File.separator + "test.docx");
        // 這里我們用到了字符操作的BufferedReader類
        BufferedReader bufferedReader = new BufferedReader(reader);
        String string = null;
        // 按行讀取,結束的判斷是是否為null,按字節或者字符讀取時結束的標志是-1
        while ((string = bufferedReader.readLine()) != null) {
            // 這里我們用到了StringBuffer的append方法,這個比string的“+”要高效
            sb.append(string + "/n");
            System.out.println(string);
        }
        // 注意這兩個關閉的順序
        bufferedReader.close();
        reader.close();

        /*
         * 完整寫入文件
         */
        Writer writer = new FileWriter("d:" + File.separator + "test2.docx");
        BufferedWriter bw = new BufferedWriter(writer);
        // 注意這里調用了toString方法
        bw.write(sb.toString());
        // 注意這兩個關閉的順序
        bw.close();
        writer.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奈曼旗| 喀什市| 虞城县| 湾仔区| 宁德市| 乌拉特前旗| 井冈山市| 连江县| 宣化县| 新绛县| 仁怀市| 沂水县| 泰来县| 盘山县| 高要市| 沿河| 兰考县| 曲松县| 桐乡市| 玉溪市| 太仆寺旗| 荆门市| 潼关县| 且末县| 承德市| 昭苏县| 长春市| 昌平区| 岐山县| 潼南县| 西乌珠穆沁旗| 桃江县| 秦皇岛市| 清水县| 南京市| 资讯| 阿坝| 怀宁县| 宾川县| 台安县| 紫金县|