文件傳輸基礎——Java IO流

第一章 文件的編碼

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();

}

 

一個類實現了序列化接口,那麼其子類可以進行序列化。

 

對子類對象進行反序列化操作時,如果父類沒有實現序列化接口,那麼父類的構造函數會被調用。


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