編碼:
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();等方法,一次可讀寫多字節;