IO、IO序列化
文件:文件可認為是相關記錄或放在一起的數據的集合。文件一般保存在硬盤、U盤、光盤、雲盤的媒介中。
JAVA API:java.io.File類可操作文件
File對象的構建
File file=new File(String pathname); 需要註意的是:String pathname的格式為:e:\\test.txt或e:/test.txt
File類常用的方法:
boolean exists()【判斷文件或目錄是否存在】
boolean isFile()【判斷是否是文件】
boolean isDirectory()【判斷是否是目錄】
String getPath()【返回此對象表示的文件的相對路徑名】
String getAbsolutePath()【返回此對象表示的文件的相對路徑名】
String getName()【返回此對象表示的文件或目錄的名稱】
booblean delete()【刪除此對象指定的文件或目錄】
booblean creatNewFile()【創建名稱的空文件,不創建文件夾】
long length()【返回文件的長度,單位為字節】
創建文件的方法:
public void create(File file) { if (!file.exists()) { try { file.createNewFile(); System.out.println("文件已創建!"); } catch (IOException e) { e.printStackTrace(); } } }
刪除文件的方法:
public void delete(File file) { if (file.exists()) { file.delete(); System.out.println("文件已刪除!"); } }
顯示文件的方法:
public void showFileInfo(File file) { if (file.exists()) { // 判斷文件是否存在 if (file.isFile()) { // 如果是文件 System.out.println("名稱:" + file.getName()); System.out.println("相對路徑: " + file.getPath()); System.out.println("絕對路徑: " + file.getAbsolutePath()); System.out.println("文件大小:" + file.length() + " 字節"); } if (file.isDirectory()) { System.out.println("此文文件是目錄"); } } else System.out.println("文件不存在"); }
流
流:流是指一連串流動的字符,是以先進先出方式發送信息的通道。
常用的文件讀寫類
文本文件的讀寫
字節流方式:FileInputStream、FileOutputStream
字符流方式:BufferedReader、BufferedWriter
二進制文件的讀寫
DataInputStream、DataOutputStream
字節流方式讀寫文本
FileInputStream 讀文本文件
InputStream類常用方法
int read()【從此輸入流中讀取一個數據字節】
int read(byte[] b)【從此輸入流中將最多b.length個字節的數據讀入一個byte數組中。】
int read(byte[] b,int off,int len)【從此輸入流中將最多len個字節的數據讀入一個byte數組中】
void close()【關閉此文件輸入流並釋放與此流有關的所有系統資源】
int available() 【返回下一次對此輸入流調用的方法可以不受阻塞的從此輸入流讀取(或跳過)的估計剩余字節】
子類FileInputStream常用的構造方法
FileInputStream(File file)【通過文件對象創建FileInputStream對象】
FileInputStream(String name)【通過name文件路徑創建FileInputStream對象】
FileOutputStream 寫文本文件
OutputStream類常用方法
void write(int c) 【將指定字節寫入此文件輸出流。】
void write(byte[] buf)【將 b.length 個字節從指定 byte 數組寫入此文件輸出流中。】
void write(byte[] b,int off,int len) 【將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此文件輸出流。】
void close( ) 【關閉此文件輸出流並釋放與此流有關的所有系統資源。】
子類FileOutputStream常用的構造方法
FileOutputStream (File file) 【創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。】
FileOutputStream(String name) 【創建一個向具有指定名稱的文件中寫入數據的輸出文件流。】
FileOutputStream(String name, boolean append) 【創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。如果第二個參數為 true,則將字節寫入文件末尾處,而不是寫入文件開始處。】
需要註意的是:
1、前兩種構造方法在向文件寫數據時將覆蓋文件中原有的內容。
2、創建FileOutputStream實例時,如果相應的文件並不存在,則會自動創建一個空的文件。
3、FileInputStream和FileOutputStream創建的流屬於節點流,直接操縱數據源。
字符流方式讀寫文本文件
BufferedReader讀文本文件
實例:
//緩沖流的使用 public static void main(String[] args) throws Exception { //BufferedReader讀取文件信息 //reader類的子類FileReader FileReader fr=new FileReader("f:/text.txt"); BufferedReader br=new BufferedReader(fr); //利用緩沖流讀取信息 String line=br.readLine();//每次讀一行數據 while(line!=null){ System.out.println(line); line=br.readLine(); } //關閉流 br.close(); fr.close(); }
使用字符流讀取文本文件相關類
Reader
FileReader(節點流)
BufferedReader(處理流)
Reader類常用方法
int read( )
int read(char[] c)
int read(char[] c,int off,int len)
void close( )
子類BufferedReader常用的構造方法
public BufferedReader(Reader in) //in通常使用FlieReader對象
子類BufferedReader特有的方法
public String readLine() //讀取一行信息
BufferedWriter寫文本文件
使用字符流寫文本文件相關類
Writer
FileWriter(節點流)
BufferedWriter(處理流)
Writer類常用方法
void write(String str)
void write(String str,int off,int len)
void close()
void flush()
子類BufferedWriter常用的構造方法
BufferedReader(Writer out) //in通常使用FlieWriter對象
字節流方式讀寫二進制文件
DataInputStream類讀取二進制文件(處理流)
FileInputStream的子類
與FileInputStream類結合使用讀取二進制文件
DataOutputStream類寫二進制文件(處理流)
FileOutputStream的子類
與FileOutputStream類結合使用寫二進制文件
序列化與反序列化的過程:
package com.zx5; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; //--------------------------------序列化的過程----------------------------------------------- public class Test { //把對象寫入到磁盤文件,叫做序列化,,,,,反序列化就是把磁盤文件還原 public static void main1(String[] args) throws Exception { //集合都可以序列化 List<Object> list=new ArrayList<Object>(); list.add(10); list.add("200"); list.add(23.23); OutputStream out=new FileOutputStream("f:/text.txt"); //objectOutputStream序列化的流 ObjectOutputStream oos=new ObjectOutputStream(out); //寫入對象 oos.writeObject(list); //關閉流 oos.close(); out.close(); } //----------------------------------------反序列化------------------------------ public static void main(String[] args) throws Exception { //反序列化:把二進制文件中的內容恢復成對象 //字節輸入流對象 InputStream in=new FileInputStream("f:/text.txt"); //創建一個ObjectInputStream對象 ObjectInputStream ois=new ObjectInputStream(in); //讀取readObject() Object obj=ois.readObject();//讀出對象 List<Object> list=(List<Object>) obj; for (Object object : list) { System.out.println(object); } } }
需要註意的是:
如果不對錢進行序列化,可用transient進行修飾,如:private transient double money;
IO、IO序列化