第一章 文件的編碼
String s = "我的博客";
byte[] bytes1 = s.getBytes();
for(byte b: bytes1) {
//把字節(轉換成了int)以16進制的方式顯示
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
gbk編碼中文佔用2個字節,英文佔用1個字節。
utf-8編碼中文佔用3個字節,英文佔用1個字節。
java是雙字節編碼utf-16be,中文佔用2個字節,英文佔用1個字節。
當你的字節序列是某種編碼時,想把字節序列變成字符串,也需要用這種編碼方式。
文本文件就是字節序列。如果在中文機器上直接創建文本文件,那麼該文本文件只認識ansi編碼。
第二章 File類的使用
2-1 File類常用API
File類只用於表示文件(目錄)的信息(名稱、大小等),不能用於文件內容的訪問。
File file = new File(“E:\\javaio”); //分隔符使用\\或/,或File.separator
if(!file.exists())
file.makedir();//若有多級目錄file.mkdirs()
else
file.delete();
file.isDirectory(); //是否是一個目錄,如果不是目錄或目錄不存在返回false
file.isFile(); //是否是一個文件
File file2 = new File(“e:\\javaio”,”1.txt”);
if(!file2.exists())
file2.createNewFile();
else
file2.delete();
file.getAbsolutePath();
file.getName();
file.getParent();
2-2 遍歷目錄
//列出指定目錄下(包括其子目錄)的所有文件
public static void listDirectory(File dir)throws IOException {
if(!dir.exists())throw new IllegalArgumentException(“目錄不存在”);
if(!dir.isDirectory())throw new IllegalArgumentException(“不是目錄”);
String[]filenames = dir.list(); //返回字符串數組,不包含子目錄下內容
for(Stringstring : filenames) {
System.out.println(string);
}
File[] files =dir.listFiles(); //返回的是直接子目錄(文件)的抽象
//如果要遍歷子目錄下的內容就需要構成File對象做遞歸操作
}
第三章 RandomAccessFile類的使用
RandomAccessFile java提供對文件內容的訪問,讀、寫。支持隨機訪問文件,可以訪問文件的任意位置。
(1)在硬盤上的文件是byte存儲的,是數據的集合。
(2)打開文件兩種模式”rw”(讀寫),”r”(只讀)。
RandomAccessFile raf = new RandomAccessFile(file, “rw”);
文件指針,打開文件時指針在開頭pointer = 0;
(3)寫方法
raf.write(int); //只寫一個字節(後8位),同時指針指向下一個位置,準備再次寫入。
(4)讀方法
int b = raf.read(); //讀一個字節
(5)文件讀寫完成以後一定要關閉。
raf.write(‘A’); //只寫了一個字節
System.out.println(raf.getFilePointer());
String s = “中”;
byte[] gbk = s.getBytes(“gbk”);
raf.write(gbk);
//讀文件,必須把指針移到頭部
raf.seek(0);
//一次性讀取,把文件中的內容都讀到字節數組中
byte[] buf = new byte[(int)raf.length()];
System.out.println(Arrays.toString(buf));
第四章 字節流
InputStream、OutputStream抽象了應用程序讀、寫數據的方式。
int b = in.read(); //讀取一個字節無符號填充到int低八位,-1是EOF
in.read(byte[] buf);
in.read(byte[] buf, int start, int size);
int b = in.read(byte[] buf, int start, intsize);
FileInputStream具體實現了在文件上讀取數據
//如果該文件不存在,則直接創建,如果存在,刪除後創建。
FileOutputSteram out = new FileOutputStream(“demo/out.dat”);
DataOutputStream /DataIutputStream
writeInt()/writeDouble/writeUTF()
BufferedOutputStream
第五章 字符流
Java的文本(char)是16位無符號整數,是字符的unicode編碼。文件是byte byte…的數據序列。
文本文件是文本(char)須留按照某種編碼方法序列化爲byte的存儲結果。
字符流(ReaderWriter),自負的處理,一次處理一個字符,自負的底層仍然是基本的字節序列。InputStreamReader完成byte流解析爲char流,按照編碼解析。
第六章 對象的序列化和反序列化
對象的序列化,就是將Object轉換成byte序列。
序列化流(ObjectOutputStream),是過濾流-------writeObject。
序列化接口(Serializable)對象必須實現序列化接口,才能進行序列化。這個接口沒有任何方法,只是一個標準。
ObjectInputStream ois = new ObjectInputStrea(newFileInputStream(fle));
Student stu = (Student)ois.readObject();
Transient修飾的元素不會進行jvm默認的序列化。
private voidreadObject(java.io.ObjectInputStream s) throws java.io.IOException,ClassNotFoundException{
s.defaultReadObject();
this.age =s.readInt();
}
一個類實現了序列化接口,那麼其子類可以進行序列化。
對子類對象進行反序列化操作時,如果父類沒有實現序列化接口,那麼父類的構造函數會被調用。