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:122122@192.168.0.22/test/response.txt。
*
* 在JAVA程序中,使用如下方式获得一个远程共享文件(设置共享文件的权限——读取、修改、完全控制)的句柄:SmbFile file = newSmbFile("smb://guest:1234@192.168.3.56/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:dibindb@10.130.14.111/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:dibindb@10.130.14.101/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)
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();
}
原文:http://www.cnblogs.com/firstdream/p/5165362.html