欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java远程共享目录的操作代码

程序员文章站 2024-02-26 15:39:28
一.前言      根据客户反馈,在进行文件下载的时候,新增远程共享目录,下载对应的文件到远程共享目录,采用常用的io操作模式,提...

一.前言

     根据客户反馈,在进行文件下载的时候,新增远程共享目录,下载对应的文件到远程共享目录,采用常用的io操作模式,提示下载成功,但是客户去远程共享目录查看对应的下载文件,反馈说没有找到对应的文件。要求系统需要支持上传远程共享目录,为什么有一个这样的需求?由于下载的文件涉及到了支付文件,里面的金额不允许进行修改,如果放在本地路径有可能会不会出现人为的修改,一般涉及到钱的问题,客户都是比较谨慎的,刚好没有接触过操作远程共享目录的,就google了一下看有没有对应的操作说明,下面简单总结一下。

二.远程共享目录操作

1、需要下载对应的jcifs-1.3.18.jar,本例子采用3.18版本的,下载链接:

2、涉及的主要类是  smbfile(远程文件操作类) ,还有就是进行登录验证,验证对应的远程目录的合法性的操作,其他操作就普通的io流的操作。

3、从远程共享目录下载文件

/**
  * 方法说明:从远程共享目录下载文件
  * @param localdir   本地临时路径
  * @param removedir  远程共享路径
  * @param _filename  远程共享文件名
  * @param removeip   远程共享目录ip
  * @param removeloginuser 远程共享目录用户名
  * @param removeloginpass 远程共享目录密码
  * @return
  * @throws exception
  */
 public static int smbdownload(string localdir, string removedir,
   string _filename, string removeip, string removeloginuser,
   string removeloginpass) throws exception {
  inputstream in = null;
  outputstream out = null;
  try {
   ntlmpasswordauthentication auth = new ntlmpasswordauthentication(
     removeip, removeloginuser, removeloginpass);
   smbfile remotefile = new smbfile(removedir + _filename, auth);
   if (!remotefile.exists()) {
    return 0;
   }
   file dir = new file(localdir);
   if (!dir.exists()) {
    dir.mkdirs();
   }
   string filename = _filename.substring(_filename.lastindexof("\\")+1, _filename.length());
   file localfile = new file(localdir + filename);
   in = new bufferedinputstream(new smbfileinputstream(remotefile));
   out = new bufferedoutputstream(new fileoutputstream(localfile));
   byte[] buffer = new byte[1024];
   while (in.read(buffer) != -1) {
    out.write(buffer);
    buffer = new byte[1024];
   }
  } catch (exception e) {
   e.printstacktrace();
  } finally {
   try {
    if (null != out) {
     out.close();
    }
   } catch (ioexception e) {
    e.printstacktrace();
   } finally {
    if (null != in) {
     try {
      in.close();
     } catch (ioexception e) {
      e.printstacktrace();
     }
    }
   }
  }
  return 1;
 }

4、上传文件都远程共享目录

/**
  * 方法说明:上传文件到远程共享目录
  * @param localdir   本地临时路径(a:/测试/测试.xls)
  * @param removedir  远程共享路径(smb://10.169.2.xx/测试/,特殊路径只能用/)
  * @param removeip   远程共享目录ip(10.169.2.xx)
  * @param removeloginuser 远程共享目录用户名(user)
  * @param removeloginpass 远程共享目录密码(password)
  * @return
  * @throws exception 0成功/-1失败
  */
 public static int smbuploading(string localdir, string removedir,
   string removeip, string removeloginuser, string removeloginpass) throws exception {
  ntlmpasswordauthentication auth = null;
  outputstream out = null;
  int retval = 0; 
  try {
   file dir = new file(localdir);
   if (!dir.exists()) {
    dir.mkdirs();
   }
   inetaddress ip = inetaddress.getbyname(removeip); 
   uniaddress address = new uniaddress(ip);
   // 权限验证
    auth = new ntlmpasswordauthentication(removeip, removeloginuser, removeloginpass);
   smbsession.logon(address,auth); 
   //远程路径判断文件文件路径是否合法
   smbfile remotefile = new smbfile(removedir + dir.getname(), auth);
   remotefile.connect();  
   if(remotefile.isdirectory()){ 
    retval = -1;
   }
   // 向远程共享目录写入文件
   out = new bufferedoutputstream(new smbfileoutputstream(remotefile));
   out.write(tobytearray(dir));
  } catch (unknownhostexception e) {
   retval = -1;
   e.printstacktrace();
  } catch (malformedurlexception e) {
   retval = -1;
   e.printstacktrace();
  } catch (smbexception e) {
   retval = -1;
   e.printstacktrace();
  } catch (ioexception e) {
   retval = -1;
   e.printstacktrace();
  } finally{
   if (out != null) {
    try {
     out.close();
    } catch (ioexception e) {
     e.printstacktrace();
    }
   }
  }
  return retval;
 }
 /**
  * mapped file way mappedbytebuffer 可以在处理大文件时,提升性能
  *
  * @param file 文件
  * @return 字节数组
  * @throws ioexception io异常信息
  */
 @suppresswarnings("resource")
 public static byte[] tobytearray(file file) throws ioexception {
  filechannel fc = null;
  try {
   fc = new randomaccessfile(file, "r").getchannel();
   mappedbytebuffer bytebuffer = fc.map(mapmode.read_only, 0,
     fc.size()).load();
   byte[] result = new byte[(int) fc.size()];
   if (bytebuffer.remaining() > 0) {
    bytebuffer.get(result, 0, bytebuffer.remaining());
   }
   return result;
  } catch (ioexception e) {
   e.printstacktrace();
   throw e;
  } finally {
   try {
    fc.close();
   } catch (ioexception e) {
    e.printstacktrace();
   }
  }
 }

总结

以上所述是小编给大家介绍的java远程共享目录的操作代码,希望对大家有所帮助