文件編碼: ①gbk編碼:中文占用2個位元組,英文占用1個位元組 File類常用API的使用: file類的遍歷目錄 RomdonAccessFile基本操作 五、位元組流 ...
文件編碼:
①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長度的位元組到流