java面試準備3

常用的I/O流

1、字節輸入流:InputStream類爲所有字節輸入流的父類
三個基本的read()方法: 
      int read()
      從流裏讀出的一個字節。不推薦使用
      int read(byte[] b)
      將數據讀入到字節數組中,並返回所讀的字節數
      int read(byte[] b, int off, int len)
      off  從哪裏開始讀。
      len  讀取多少。
      將輸入流中最多 len 個數據字節讀入字節數組。
其它方法: 
      void close() 
      關閉此輸入流並釋放與該流關聯的所有系統資源。
      int available()
      返回不受阻塞地從此輸入流讀取的字節數。
      long skip(long n)
      跳過和放棄此輸入流中的n個數據字節,該方法有可能失效。
      boolean markSupported()
      測試此輸入流是否支持 mark 和 reset 方法。
      void mark(int n)
      在此輸入流中標記當前的位置
      void reset()
      將此流重新定位到對此輸入流最後調用 mark 方法時的位置。 
 
2、字節輸出流:OutputStream類是所有字節輸入流的父類

三個基本的write()方法: 
void write(int n)
將指定的字節寫入此輸出流。
void write(byte[] b) 
將 b.length 個字節從指定的字節數組寫入此輸出流。
void write(byte[] b, int off, int len)
將指定字節數組中從偏移量off開始的len個字節寫入此輸出流。
其它方法: 
void close()
      關閉此輸出流並釋放與此流有關的所有系統資源。
void flush()
      刷新此輸出流並強制寫出所有緩衝的輸出字節。 
     
3、文件輸入輸出流:FileInputStream和FileOutputStream
要構造一個FileInputStream,所關聯的文件必須存在而且是可讀的。
如:
FileInputStream fis = new FileInputStream("myfile.dat"); 
要構造一個FileOutputStream,而輸出文件已經存在,則它將被覆蓋。
如:
  FIleOutputStream fos = new FileOutputStream("results.dat"); 
  要想以追加的方式寫,則需要一個額外的參數,如:
FileOutputStream outfile = new FileOutputStream("results.dat" ,true);//參數爲true時輸出爲追加,爲false時爲覆蓋。  

4、RandomAccessFile: 
允許隨機訪問文件,類支持直接輸出輸入各種數據類型。

構造器:
RandomAccessFile(File file, String mode) 
          創建從中讀取和向其中寫入(可選)的隨機存取文件流,該文件由 File 參數指定。 
RandomAccessFile(String name, String mode) 
          創建從中讀取和向其中寫入(可選)的隨機存取文件流,該文件具有指定名稱。 
mode( r:以只讀方式打開      rw:可讀可寫,不存在則創建)

相關方法:
long getFilePointer()
返回文件指針的當前位置。 
void seek(long pos)
設置文件指針到給定的絕對位置。 
long length()
返回文件的長度。

5、對象流:ObjectInputStream和ObjectOutputStream(實現對象序列化)

對象流是過濾流,需要節點流作參數來構造對象,用於直接把對象寫入文件和從文件中讀取對象。
只有實現了Serializable接口的類型的對象纔可以被讀寫,Serializable接口是個標記接口,其中沒有定義方法。
對象會序列化成一個二進制代碼,文件中保存對象的屬性。

writeObject(o)、readObject()這兩個是對象讀寫操作時用的方法。
Object o = new Object();
FileOutputStream fos=new FileOutputStream("Object.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(o);
oos.close();


FileInputStream fis =new FileInputStream(“Object.txt”);
ObjectInputStream ois =new ObjectInputStream(fis);
Object o = (Object)Ois.readObject();
ois.close();

一個類中有其他類型的對象,那麼,這個類實現了Serializable接口,在對象序列化時,也同樣要求這個類中屬性都能夠對象序列化(基本類型除外)。

在開發中如何選擇流?
答:

先考慮是輸入流還是輸出流,
再考慮是字節流還是字符流,
最後考慮是節點流還是處理流。

字符流:Reader和Writer所有字符流的父類型

Java技術使用Unicode來表示字符串和字符,而且提供16位版本的流,以便用類似的方法處理字符。 
如果構造了一個連接到流的Reader和Writer,轉換規則會在使用缺省平臺所定義的字節編碼和Unicode之間切換。 

橋樑流:InputStreamReader和OutputStreamWriter(字節流轉化成字符流的橋轉換器)
這兩個類不是用於直接輸入輸出的,他是將字節流轉換成字符流的橋轉換器,並可以指定編解碼方式。

逐行讀寫流:BufferedReader/BufferedWriter
以上兩個都是過濾流,需要用其他的節點流來作參數構造對象。
BufferedReader的方法:readLine():String ,當他的返回值是null時,就表示讀取完畢了。要注意,再寫入時要注意寫換行符,否則會出現阻塞。
BufferedWriter的方法:newLine() ,這個方法會寫出一個換行符。

管道流:線程交互的時候使用
PipedInputStream/PipedOutputStream
傳送輸出流可以連接到傳送輸入流,以創建通信管道。傳送輸出流是管道的發送端。通常,數據由某個線程寫入 PipedOutputStream 對象,並由其他線程從連接的 PipedInputStream 讀取。
注意:管道輸出流和管道輸入流需要對接。

數據流:DataInputStream和DataOutputStream
通過流來讀寫Java基本類,注意DataInputStream和DataOutputStream的方法是成對的。 
支持直接輸出輸入各種數據類型。
注意:使用DataOutputStream/DataInputStream時,要注意寫入順序和讀取順序相同,否則會將沒有分割寫入的信息分割不正確而讀取出錯誤的數據。

Properties類:

針對屬性文件(*.properties,內容是name=value)進行操作,在java.util包下
load(InputStream inStream) 
          從輸入流中讀取屬性列表(鍵和元素對)。
          getProperty(String key) 
          用指定的鍵在此屬性列表中搜索屬性。

如何解決亂碼?

答:

String temp = 亂碼的字符串
temp = new String(temp.getBytes("ISO8859-1") , "GBK")   
將temp按照ISO8859-1的方式進行解碼生成一個字節序列,然後在按照GBK的方式解碼字節序列生成字符串。

深入理解File類?

答:File類的對象實例表示一個文件並不是真正的文件,只是一個代理而已,通過這個代理來操作文件。

併發線程:
三個多線程包:
java.util.concurrent    包含了常用的多線程工具,是新的多線程工具的主體。 
java.util.concurrent.atomic    包含了不用加鎖情況下就能改變值的原子變量。
java.util.concurrent.locks    包含鎖定的工具。 

Executor接口:
替代了Thread類,他可以創建定量的、動態的以及週期性的線程池。
ExecutorService接口:
線程池,用來存放線程來節省創建和銷燬資源的消耗。

Callable和Future接口:
Callable是類似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。Callable和Runnable有幾點不同:
Callable規定的方法是call(),而Runnable規定的方法是run(). 
Callable的任務執行後可返回值,而Runnable的任務是不能返回值的。 
call()方法可拋出異常,而run()方法是不能拋出異常的。 
運行Callable任務可拿到一個Future對象,通過Future對象可瞭解任務執行情況,可取消任務的執行,還可獲取任務執行的結果。



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