項目常常需要有訪問共用資料夾的需求,例如共用資料夾儲存照片、檔案等。那麼如何使用Java讀寫Windows共用資料夾呢?
Java可以使用JCIFS架構對Windows共用資料夾進行讀寫,就這個架構可以讓我們像訪問本地檔案夾一下訪問遠程檔案夾。
JCIFS的網址: http://jcifs.samba.org/
JCIFS是使用純Java開發的一個開源架構,通過smb協議訪問遠程檔案夾。該架構同時支援Windows共用資料夾和Linux共用資料夾,不過,Linux共用資料夾需要安裝Samba服務軟體(官網:http://www.samba.org/)。
SMB(Server Messages Block,資訊服務塊)是一種在區域網路上共用檔案和印表機的一種通訊協定,它為區域網路內的不同電腦之間提供檔案及印表機等資源的共用服務。SMB協議是客戶機/伺服器型協議,客戶機通過該協議可以訪問伺服器上的共用檔案系統、印表機及其他資源。通過設定“NetBIOS over TCP/IP”使得Samba不但能與區域網路絡主機分享資源,還能與全世界的電腦分享資源。
本文主要學習一下使用Java訪問Windows共用資料夾的方法。
首先找一台Windows機器,在任意位置建立檔案夾:sharedFolder,並設定為共用,設定共用使用者名稱:share,密碼:admin。
(Windows7下設定共用資料夾方法:Windows7下設定共用資料夾方法:http://www.jb51.net/os/windows/78034.html)
不論是Windows還是Linux的共用資料夾,使用Java smb訪問共用資料夾的代碼都是一樣的,只是Windows與Linux配置共用資料夾的方式不一樣。
測試代碼如下:
InputStream in = null; OutputStream out = null; try { //擷取圖片 File localFile = new File("C:/testjpg"); String remotePhotoUrl = "smb://share:admin@11/sharedFolder/"; //存放圖片的共用目錄 SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS_"); SmbFile remoteFile = new SmbFile(remotePhotoUrl + "/" + fmtformat(new Date()) + localFilegetName()); remoteFileconnect(); //嘗試串連 in = new BufferedInputStream(new FileInputStream(localFile)); out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile)); byte[] buffer = new byte[4096]; int len = 0; //讀取長度 while ((len = inread(buffer, 0, bufferlength)) != -1) { outwrite(buffer, 0, len); } outflush(); //重新整理緩衝的輸出資料流 } catch (Exception e) { String msg = "發生錯誤:" + egetLocalizedMessage(); Systemoutprintln(msg); } finally { try { if(out != null) { outclose(); } if(in != null) { inclose(); } } catch (Exception e) {} }
以上代碼中,使用了JCIFS架構提供的SmbFile類,這個類和Java的File類比較相似,使用這個類的對象,可以處理遠程檔案的讀寫。使用File對象讀取本地檔案,然後使用SmbFile對象寫入遠程檔案。SmbFile的connect()方法可以嘗試串連遠程檔案夾,如果帳號或密碼錯誤,將拋出串連異常。
當下載遠程檔案時,使用SmbFile對象讀取遠程檔案即可,代碼如下:
InputStream in = null ; ByteArrayOutputStream out = null ; try { //建立遠程檔案對象 String remotePhotoUrl = "smb://share:admin@11/sharedFolder/testjpg"; SmbFile remoteFile = new SmbFile(remotePhotoUrl); remoteFileconnect(); //嘗試串連 //建立檔案流 in = new BufferedInputStream(new SmbFileInputStream(remoteFile)); out = new ByteArrayOutputStream((int)remoteFilelength()); //讀取檔案內容 byte[] buffer = new byte[4096]; int len = 0; //讀取長度 while ((len = inread(buffer, 0, bufferlength)) != - 1) { outwrite(buffer, 0, len); } outflush(); //重新整理緩衝的輸出資料流 return outtoByteArray(); } catch (Exception e) { String msg = "下載遠程檔案出錯:" + egetLocalizedMessage(); Systemoutprintln(msg); } finally { try { if(out != null) { outclose(); } if(in != null) { inclose(); } } catch (Exception e) {} }
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。