2、本机地址:10.130.14.37,局域网中的地址:10.130.14.111,其共享文件:share(设置读取、修改、完全控制的权限)
3.代码
package my.test; import java.io.IOException; import jcifs.smb.SmbAuthException; import jcifs.smb.SmbException; import jcifs.smb.SmbFileInputStream; import jcifs.smb.SmbFile; import jcifs.smb.SmbFileOutputStream; public class ReadShareFile { /** * jcifs的开发方法类似java的文件操作功能,它的资源url定位:smb://{user}:{password}@{host}/{path}, * smb为协议名,user和password分别为共享文件机子的登陆名和密码,@后面是要访问的资源的主机名或IP地址。最后是资源的共享文件夹名称和共享资源名。 * 例如smb://administrator:[email protected]/test/response.txt。 * * 在JAVA程序中,使用如下方式获得一个远程共享文件(设置共享文件的权限——读取、修改、完全控制)的句柄:SmbFile file = newSmbFile("smb://guest:[email protected]/share/a.txt"); * 这里的句柄不仅限于远程的共享文件,还可能是共享文件夹。 * isFile()方法和isDirectory()用来判断这个句柄对应的资源的真实属性。如果是共享文件夹 * ,通过调用它的list()方法将获得其中资源的列表。 * List方法支持过滤器机制,有两种过滤器可供使用,一种是SmbFileFilter,另一种是SmbFilenameFilter * ,这两个在jcifs中作为接口出现,你可以根据自己的需要派生出个性化的过滤器,实现接口中的accept方法,以满足不同业务的需求。 * * SmbFileInputStream是smb文件的输入流,它的功能是以流的方式打开一个SmbFile:SmbFileInputStream * in = new SmbFileInputStream(file);SmbFileInputStream提供read方法,你可以从这个流中读出远程文件全部的内容。 * * @param args * @throws IOException */ @SuppressWarnings("static-access") public static void main(String[] args) { try { //局域网共享文件,读文件 SmbFile smbFile = new SmbFile( "smb://administrator:[email protected]/share/aa.txt"); // 通过 smbFile.isDirectory();isFile()可以判断smbFile是文件还是文件夹 int length = smbFile.getContentLength();// 得到文件的大小 byte buffer[] = new byte[length]; SmbFileInputStream in = new SmbFileInputStream(smbFile); // 建立smb文件输入流 while ((in.read(buffer)) != -1) { System.out.write(buffer); System.out.println("\n"+buffer.length); } in.close(); smbFile.delete(); //局域网共享文件,写文件 SmbFile smbFileOut = new SmbFile("smb://administrator:[email protected]/share/bb.txt"); if(!smbFileOut.exists()) smbFileOut.createNewFile(); SmbFileOutputStream out = new SmbFileOutputStream(smbFileOut); out.write("abcdefw".getBytes()); out.close(); smbFileOut.delete(); } catch (SmbAuthException e) { SmbException smb = new SmbException(1,false); System.out.println(e.getNtStatus()==smb.NT_STATUS_ACCESS_DENIED); for(int i=0;i<smb.NT_STATUS_CODES.length;i++) { System.out.println(smb.NT_STATUS_CODES[i]); } e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 4、相关错误 (1)share只有读取权限 jcifs.smb.SmbAuthException: Access is denied. at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:528) at jcifs.smb.SmbTransport.send(SmbTransport.java:645) at jcifs.smb.SmbSession.send(SmbSession.java:244) at jcifs.smb.SmbTree.send(SmbTree.java:119) at jcifs.smb.SmbFile.send(SmbFile.java:770) at jcifs.smb.SmbFile.delete(SmbFile.java:2410) at jcifs.smb.SmbFile.delete(SmbFile.java:2354) at my.test.ReadShareFile.main(ReadShareFile.java:50)如果通过路由器转发需要在路由器上指定端口,139,445。
jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password. at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:273) at jcifs.smb.SmbSession.send(SmbSession.java:225) at jcifs.smb.SmbTree.treeConnect(SmbTree.java:147) at jcifs.smb.SmbFile.connect(SmbFile.java:791) at jcifs.smb.SmbFile.connect0(SmbFile.java:761) at jcifs.smb.SmbFile.open0(SmbFile.java:816) at jcifs.smb.SmbFile.open(SmbFile.java:845) at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:69) at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:62) at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:49) at cn.com.egova.dti.dao.AdjunctManager.main(AdjunctManager.java:188)
java.net.InetAddress[] x= java.net.InetAddress.getAllByName("www.aaa.com"); String ip = ""; if(x.length>0){ ip = x[0].toString().split("/")[1]; } /** * IP地址正则表达式 ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)) */ String IPADDRESS = "((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))"; Pattern pattern = Pattern.compile(IPADDRESS); Matcher matcher = pattern.matcher(x.toString()); boolean isIp = matcher.matches();
try { if (!smbTempFile.isDirectory()) smbTempFile.mkdirs(); } catch (SmbException e) { // TODO Auto-generated catch block e.printStackTrace(); }