IO流 - 文件傳輸基礎

編碼:

GBK:中文字符佔位2字節,英文1字節;

UTF-8:中文字符佔位3字節,英文1字節;

// 將字符串轉換爲字節,再將字節轉換爲16進制的int輸出
String s = "你好";
byte[] b = s.getBytes();
for(byte b1 : b){
    System.out.print(Integer.toHexString( b1 & 0xff) + ",");//0xff只顯示後兩位
}

文本文件就是字節序列不同編碼訪問會亂碼

java.io.File類 (只能用於表示文件(目錄)的信息,不能訪問內容)

File file = new File(D:\\file.txt);   //新建文件

常見方法:file.exists()文件是否存在;isDirectory()是否爲目錄;mkdir()創建目錄;isFile()是否爲文件;createNewFile()創建文件;delete()刪除;

list()遍歷文件,返回的是String類型listFiles()遍歷文件,返回的是File類型

遍歷目錄下所有的文件:

public static void listDirectory(File dir) throws IOException{
    if(!dir.exists()){
        throw new IllegalAccessException("目錄" + dir + "不存在");
    }
    File[] files = dir.listFiles();
    if(files != null && files.size() > 0){
	for(File file : files){
            if(file.isDirectory()){
                listDirectory(file); //遞歸
            }else{
                System.out.print(file + ",");
            }
        }	
    }
}

RandomAccessFile類

支持隨機訪問文件,可以讀寫文件中任意位置的內容,類似迅雷的分批下載後整合;

在硬盤上的文件都是byte byte byte存儲的,是數據的集合;

RandomAccessFile raf = new RandomAccessFile(file , "rw");//可讀寫

打開文件時pointer指針在開頭,即pointer = 0;

寫操作:raf.write();還有很多 writeUTF()等;

寫完後指針是指向最後一個的,所以當你寫完後想要讀取的話需要將指針歸位raf.seek(0);,之後就能raf.read();

一次性讀取,把文件中的內容都讀到字節數組中(這需要耗費大量的內存,因爲創建數組時寬度越大耗費的內存越多

byte[] buf = new byte[(int)raf.length()];
raf.read(buf);
//讀取內容,通過String的構造參數輸出
String s = new String(buf,0,raf.length(),"gbk");

字節流(InputStream、OutputStream)

InputStream抽象了應用程序讀取數據的方式,EOF = END OF File 讀到-1時表示文件以讀取完畢

FileInputStream in = new FileInputStream(fileName);

in.read()逐字節讀取;如果讀不到值則爲-1,代表着已經讀取到結尾了;

in.read(byte[] buf);將數據讀取到字節數組中;

in.read(buf,int start,int size);從start位置開始存放長度爲size長度的數據到buf數組中;

byte[] buf = new byte[1 * 1024]; //1 * 1024表示1024字節,代表512個漢字gbk編碼;
int bytes = in.read(buf,0,buf.length());//返回的是讀取到的字節數;
for(int i = 0; i < bytes ; i++){
    System.out.print(Integer.toHexString(buf[i] & 0xff) + ",");
}

FileOutputStream out = new FileOutputStream("xxx",true);

true代表文件存在則在其內容中追加不寫則無論有無文件,都創建


複製粘貼文件實現代碼:

public static void Copy(String needCopy, String Copyto){
    FileInputStream in = new FileInputStream(needCopy);
    FileOutputStream out = new FileOutputStream(Copyto);

    type[] buf = new type[2 * 1024]; //創建一個字節數組用於存放讀取文件的字節
    int a; //用於表示讀取到的字節數,等於-1則表示文件已經讀取完畢

    while( a = in.read(buf,0,buf.length()) != -1){
        out.write(buf);  //將數組中的字節寫出到文件中
        out.flush();     //一般buffer緩衝才寫這個,將緩衝中的數據寫出去,相當於清空
    }
    in.close(); //關閉流
    out.close();
}

DataInputStream是對流功能的擴展,可以更加方便的讀取int,Long,字符等數據類型。

DataInputStream dis = new DataInputStream(new FileInputStream(file));

dis.readInt();等方法,一次可讀寫多字節;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章