① java socket中關閉IO流後,發生什麼事
為了方便講解,我們把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做為Socket輸出流的代言。同 樣的,din是輸入流的代言。
可以造成dout被關閉的操作有:
1、調用dout.close();或din.close();因為使用這種流關閉,會造成socket被關閉,所以輸入輸出流都將不可再用。
2、調用socket.close();
3、調用socket.shutdownOutputStream();單方面關閉dout,此時din還可正常使用。
以下,我將對socket中關閉輸出流進行3個測試:
輸出流關閉測試一:socket關閉嗎?
輸出流關閉測試二:該流是否可以重新開啟?
輸出流關閉測試三:輸出緩沖區里的數據是丟棄,還是發送?
測試結果如下:
測試一:dout.close();會造成socket被關閉,但socket.shutdownOutputStream()不會。
測試二:不可以,會拋出異常!
測試三:丟棄
轉載
② java io流的關閉問題。
你BufferedReader是通過fileReader來的,相當於你關閉br後就直接關閉了FileReader,最後建議你把br=null;
和這個相反你可以參考一下rs和con的關系
③ java中IO流操作怎樣關閉流
如果 in == null,就說明 in這個引用所指向的對象還沒有被創建,自然 in.close()也就不可能被執行,而且會報異常。我是這樣想的,程序中 如果你先聲明變數
InputStream(或者其他流類型) in = null;
然後執行其他語句,再 in = new 、、、、
在in new之前其他語句出exception,這時流沒有被打開,也就無需關閉,如果不判斷if(null != in) 硬要關閉in就出exception
另外你的代碼按如下寫會更合理:
if(null != in){
try{
in.flush();
in.close();
in = null;
}
catch(IOExection e){};
}
④ Java IO流中先關閉輸出流還是先關閉輸入流為什麼
java中需要手動釋放的資源常見的有以下兩個:
流相關資源
流相關資源一般遵循:
1)先開後關,先開的輸入流,再開的輸出流,通過讀取輸入流寫入輸出流中,那麼應該先關輸出流,再關輸入流,但是一般關閉輸入輸出流操作都是在讀寫完成後的finally中執行的,所以即使先關輸入流,再關輸出流也不會任何問題,因為讀寫操作沒有進行了。
2)先關外層,再關內層。如BufferedInputStream包裝了一個FileInputStream,那麼先
關BufferedInputStream,再關FileInputStream。但要注意的是由於一般處理流持有節點流引用,處理流都會在自己的close方法中去關閉節點流,因此我們只要關閉外層的處理流即可,如果多此一舉的關閉節點流反而會報錯。如BufferedInputStream包裝了FileInputStream,我們只要關閉BufferedInputStream即可
3)只關處理流,不關節點流,原因見上述第二條
流相關文章參考:http://blog.csdn.net/u012250875/article/details/78341874
jdbc相關資源
Connection,PrepareStatement,ResultSet三個資源。這三個資源的獲取順序是:
先獲得一個jdbc連接對象Connection,再通過連接對象獲得一個sql預處理對象PrepareStatement,如果是查詢的話最後還會通過PrepareStatement對象獲取一個結果集ResultSet對象,關閉順序與獲取順序正好相反。先關ResultSet,再關PrepareStatement,最後關Connection。
⑤ 大佬們,關於java IO流關閉的一點疑問,求大佬們幫幫忙
如果上面沒有對流進行手動關閉的話,finally方法中的fis一定不為空
⑥ java關閉IO流的時候Socket也同時關閉
樓主解決了么,我想到一個辦法:
服務端:就是每次接收到一個客戶端請求以後,都重新啟動一個線程用於邏輯處理,處理完畢後關閉該線程會自動關閉。
客戶端:每次發送/接收數據都新建一個socket ,發送完/傳輸完就關閉當前socket
⑦ java中IO流關閉時的疑惑
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
/*
*加入異常處理的位元組輸出流操作
*/
{
publicstaticvoidmain(String[]args){
//分開做異常處理
//FileOutputStreamfos=null;
//try{
//fos=newFileOutputStream("fos4.txt");
//}catch(FileNotFoundExceptione){
//e.printStackTrace();
//}
//
//try{
//fos.write("java".getBytes());
//}catch(IOExceptione){
//e.printStackTrace();
//}
//
//try{
//fos.close();
//}catch(IOExceptione){
//e.printStackTrace();
//}
//一起做異常處理
//try{
//FileOutputStreamfos=newFileOutputStream("fos4.txt");
//fos.write("java".getBytes());
//fos.close();
//}catch(FileNotFoundExceptione){
//e.printStackTrace();
//}catch(IOExceptione){
//e.printStackTrace();
//}
//改進版
//為了在finally裡面能夠看到該對象就必須定義到外面,為了訪問不出問題,還必須給初始化值
FileOutputStreamfos=null;
try{
//fos=newFileOutputStream("z:\fos4.txt");
fos=newFileOutputStream("fos4.txt");
fos.write("java".getBytes());
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//如果fos不是null,才需要close()
if(fos!=null){
//為了保證close()一定會執行,就放到這里了
try{
fos.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
⑧ Java中怎麼判斷一個io流是否已經關閉
try{
inputstream.read();
Syste.out.println("流未關閉");
}cache(Exceptione){
Syste.out.println("流已關閉");
}
⑨ Java中的io流關閉問題
如下例子代碼:
FileInputStream is = new FileInputStream(".");
BufferedInputStream bis = new BufferedInputStream(is);
bis.close();
從設計模式上看:
java.io.BufferedInputStream是java.io.InputStream的裝飾類。
BufferedInputStream裝飾一個 InputStream 使之具有緩沖功能,is要關閉只需要調用最終被裝飾出的對象的 close()方法即可,因為它最終會調用真正數據源對象的 close()方法。
BufferedInputStream的close方法中對InputStream進行了關閉,下面是jdk中附帶的源代碼:
java.io.BufferedInputStream的api:
close
public void close()throws IOException 關閉此輸入流並釋放與該流關聯的所有系統資源。
因此,可以只調用外層流的close方法關閉其裝飾的內層流,驗證例子:
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("d:\\a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("java IO close test");
bw.close();
}
驗證ok