iO流,javaio流學習總結
檔案編碼:
①gbk編碼:中文佔用2個位元組,英文佔用1個位元組
②utf-8編碼:中文佔用3個位元組,英文佔用1個位元組
③java是雙位元組編碼 utf-16be,中文佔用2個位元組,英文佔用2個位元組
④當你的位元組序列是某種編碼時,若想把該位元組序列變成字串,也必須用這種編碼方式,不能直接使用String str = new String(byteStr);否則系統會使用預設的編碼,從而出現亂碼
⑤文字檔就是位元組序列,可以是任意編碼的位元組序列,如果我們在中文機器上直接建立文字檔,則該文字檔只認識ansi編碼
在eclipse項目下建立的項目可以指定項目的編碼形式。eclipse預設的“GBK”編碼不能識別“utf-8”的檔案。若是將eclipse中建立的“utf-8”檔案複製到電腦上是可以識別的,但是!在電腦本地上建立的“utf-8”檔案,電腦識別不了
File類常用API的使用:
java.io.File類在Java中表示檔案或目錄。
File類只用於表示檔案(目錄)的資訊(名稱、大小等),不能用於檔案內容的訪問。
建立File對象:File file=new File(String path);
兩種建立“日記1.txt”檔案的方法
可以通過 alt+/ 查看建構函式
注意:盤符後跟雙斜杠 \\ 或者 /
1. file.seperater();擷取系統分隔字元
2. file.exists();是否存在.存在返回true,不存在返回false
3. file.mkdir();或者file.mkdirs();建立目錄或多級目錄。
4. file.isDirectory()或者file.isFile()判斷是否是目錄或者是否是檔案。是返回true,不是為false
5. file.delete();刪除檔案/檔案夾。
6. file.createNewFile();建立新檔案。
7. file.getName()擷取檔案名稱。
8. file.getAbsolutePath()擷取絕對路徑。
9. file.getParent();擷取父級絕對路徑
file類的遍曆目錄
File對象 dir
dir.isDirectory() 判斷當前路徑是否為目錄
dir.list()返回String[],用於列出目前的目錄下的子目錄和檔案(不包含子目錄下的名稱)
如果要遍曆子目錄下的內容就需要構造成File對象做遞迴操作
File files = dir.listFiles();//返回的是直接子目錄(檔案)的抽象
RomdonAccessFile基本操作
Java提供的對檔案內容的訪問,可以讀內容也可以寫內容
支援隨機訪問檔案,可以訪問檔案的任意位置
(1)Java檔案模型
在硬碟上是byte bytebyte儲存的,是資料的集合
(2)開啟檔案
有兩種模式“rw”讀寫 和“r”唯讀
RondomAccessFile raf = new RondomAccessFile(file,”rw”);
檔案指標 開啟檔案時指標在開頭pointer = 0;
(3) 寫方法
Raf.writer(int)---à唯寫一個位元組(後八位),同時指標指向下一個位置,準備再次寫入
(4)讀方法
int b = raf.read()--à從指標在的位置讀一個位元組
(5)檔案讀寫完之後一定要關閉
(6)代碼
public static void main(String[] args) throws IOException{
File demo = new File("demo");//建立一個File對象,如果沒有寫絕對路徑則是預設在項目路徑下
if(!demo.exists())
demo.mkdir();
File file = new File(demo,"raf.dat");//在demo下建立檔案raf.dat
if(!file.exists())
file.createNewFile();//在項目下建立了demo檔案夾,其中有raf.dat檔案
RandomAccessFile raf = new RandomAccessFile(file,"rw")//建立讀內容的對象raf
//指標的位置,寫一個位元組指標移一位
System.out.println(raf.getFilePointer()); //開始時在控制台輸出0
raf.write('A');//唯寫了一個位元組(後8位)
System.out.println(raf.getFilePointer());//輸出1
int i = 0x7fffffff;//用write方法每次只能寫一個位元組,若要把i寫進去就得寫4次
此時輸出6
raf.writeInt(i);//直接寫一個int
System.out.println(raf.getFilePointer());//輸出10
String s = "中";
byte[] gbk = s.getBytes("gbk");
raf.write(gbk);
System.out.println(raf.getFilePointer());//輸出12 中文兩個位元組
//讀檔案,必須把指標移到頭部
ref.seek(0);
//一次性讀取,把檔案中的內容都讀到位元組數組中
byte[] buf = new byte[(int)raf.length];
raf.read(buf);
System.out.println(Array.toString(buf));
//用十六進位封裝 重新輸入
for(byte b:buf){
System.out.println(Integer.toHexString(b & 0xff)+"");
}
//最後一定要加上close()方法
}
五、位元組流
讀寫檔案時以位元組為單位
1) 有兩個父類:InputStream和OutputStream
InputStream是抽象類別,抽象了應用程式讀取資料的方式
OutputStream抽象了應用程式寫出資料的方式
2) EOF = End 或 讀到-1就讀到結尾
3) 輸入資料流基本方法(in是輸入資料流對象)
int b = in.read();//讀取一個位元組無符號填充到int低八位,-1是EOF
in.read(byte[] buf) 讀取資料填充到位元組數組buf
int.read(byte[] buf,int start,int size) 讀取資料到位元組數組buf,從buf的start位置開始存放size長度的資料
4) 輸出資料流基本方法(進行寫的操作)
out.write(int b) 寫出一個byte到流,b的低八位
out.write(byte[] buf) 將buf位元組數組都寫入到流
out.write(byte[] buf,int start,int size) 位元組數組buf從start位置開始寫size長度的位元組到流