1 File類
1.1 訪問文件和目錄
File類用來操作文件和目錄,常用的方法如下:
- String getName()
- String get Path()
- File getAbsoluteFile()
- String getParent()
- boolean renameTo(File newName)
- boolean exists()
- boolean canWrite()
- boolean canRead()
- boolean isFile()
- boolean isAbsolute()
- long lastModified()
- long length()
- boolean createNewFile()
- boolean delete()
- static File createTempFile(String prefix, String suffix);
- static File createTempFile(String prefix, String suffix, File directory);
- boolean mkdir()
- String[] list
- File[] listFiles()
- static File[] listRoots()
1.2 文件過濾器
在File的list方法中可以接受一個FilenameFilter參數
class MyFilenameFilter implements FilenameFilter
{
public boolean accept(File dir, String name)
{
return name.endsWith(".java") || new File(name).isDirectory();
}
}
2 理解IO流
輸入和輸出流:
輸入流以InputStream和Reader為基類,輸出流以OutputStream和Writer為基類。
字節流和字符流:
二者的區別非常簡單,字節流最小操作數據單元是8字節,而字符流最小是16字節。
字節流以InputStream OutputStream為基類,字符流以Reader和Writer為基類。
節點流和處理流:
處理流主要是對節點流進行包裝
3 字節流和字符流
InputStream和Reader里面包含如下方法:
- int read()
- int read(byte/char[] b/c)
- int read(byte/char[],int off, int len)
OutStream和Writer里面包含如下方法:
- int writer()
- int writer(byte/char[] b/c)
- int writer(byte/char[],int off, int len)
IO資源不屬于內存里的資源,所以要房子finally里面來關閉。
4 處理流的用法
PrintStream ps = null;
try
{
FileOutputStream fos = new FileOutputStream("test.txt");
ps = new PrintStream(fos);
ps.println("ddd");
}
catch (IOException ioe)
{
ioe.printStackTrace(ps)
}
finally
{
ps.close();
}
Java IO中常見的流分類如下:
分類 | 字節輸入流 | 字節輸出流 | 字符輸入流 | 字符輸出流 |
---|---|---|---|---|
抽象基類 | InputSteam | OutputStream | Reader | Writer |
訪問文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
訪問數組 | ByteArray-- | ByteArray-- | CharArray-- | CharArray-- |
訪問管道 | Piped-- | Piped-- | Piped-- | Piped-- |
訪問字符串 | StringReader | StringWriter | ||
緩沖流 | Buffered-- | Buffered-- | Buffered-- | Buffered-- |
轉換流 | InputStream- | OutputStream- | ||
對象流 | ObjectInputStream | ObjectOutputStream | ||
打印流 | PrintStream | PrintWriter |
5 重定向標準輸入輸出
System類里面提供了三個重定向標準輸入輸出的方法:
- static void setErr(PrintStream err)
- static void setIn(InputStream in)
- static void setOut(PrintStream out)
ps=new PrintStream(new FileOutStream("out.txt"));
System.setOut(ps);
6 對象序列化
對象支持序列化機制,必須讓它可以支持下面兩個接口之一:Serializable, Externalizable
6.1 使用對象流實現序列號
public class Person implements java.io.Serializable
{
}
public static void main(String[] args)
{
ObjectOutputStream oos = null;
try
{
oos = new ObjectOutputSteam(new FileOutputStream("object.txt");
per = new Person();
oos.writeObject(per);
}
catch (IOException ex)
{
ex.printStackTrace();
}
finally
{
try
{
if(oos != null)
oos.close()
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
反序列化過程如下:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt");
Person p = (Person)ois.readObject();
有一點需要注意的,如果一個可序列號類有多個父類,那么該類的父類要不是可序列化的,要不又無參數的構造器,否則會拋出InvalidClassException異常
6.2 對象引用的序列化
- 如果一個類A中有另一個類B的引用,那么只有B可序列化的時候,A才可以序列化。
- 所有保存到磁盤的對象都有一個序列化編號,如果一個對象已經被序列化過,則不會再次被序列化,而是直接存儲其編號。
- 這樣就導致序列化一個可變對象的時候,之后的改變無法被寫到磁盤上。
7 RandomAccessFile
RandomAccessFile是Java輸入輸出流中功能最豐富的文件內容訪問類,它既可以讀取文件內容,也可以向文件輸出數據,還支持隨機訪問的方式,可以跳轉到文件的任意位置來讀寫數據。
RandomAccessFile也包含了一個記錄指針,提供了兩個方法來操作文件記錄指針:
- long getFilePointer()
- void seek(long pos)
RandomAccessFile有兩個構造器,一個使用String參數來指定文件名,另一個使用File參數來指定文件本身。另外需要指定一個mode參數,分別是:r,rw,rws,rwd