查看: 838|回复: 0

[Java学习] Java远程共享目录的操作代码

发表于 2017-10-3 13:33:05
句号论坛

一.前言

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

二.远程共享目录操作

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

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

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

  1. /**
  2. * 方法说明:从远程共享目录下载文件
  3. * @param localDir 本地临时路径
  4. * @param removeDir 远程共享路径
  5. * @param _fileName 远程共享文件名
  6. * @param removeIp 远程共享目录IP
  7. * @param removeLoginUser 远程共享目录用户名
  8. * @param removeLoginPass 远程共享目录密码
  9. * @return
  10. * @throws Exception
  11. */
  12. public static int smbDownload(String localDir, String removeDir,
  13. String _fileName, String removeIp, String removeLoginUser,
  14. String removeLoginPass) throws Exception {
  15. InputStream in = null;
  16. OutputStream out = null;
  17. try {
  18. NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
  19. removeIp, removeLoginUser, removeLoginPass);
  20. SmbFile remoteFile = new SmbFile(removeDir + _fileName, auth);
  21. if (!remoteFile.exists()) {
  22. return 0;
  23. }
  24. File dir = new File(localDir);
  25. if (!dir.exists()) {
  26. dir.mkdirs();
  27. }
  28. String fileName = _fileName.substring(_fileName.lastIndexOf("\\")+1, _fileName.length());
  29. File localFile = new File(localDir + fileName);
  30. in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
  31. out = new BufferedOutputStream(new FileOutputStream(localFile));
  32. byte[] buffer = new byte[1024];
  33. while (in.read(buffer) != -1) {
  34. out.write(buffer);
  35. buffer = new byte[1024];
  36. }
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. } finally {
  40. try {
  41. if (null != out) {
  42. out.close();
  43. }
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. } finally {
  47. if (null != in) {
  48. try {
  49. in.close();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }
  56. return 1;
  57. }
复制代码

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

  1. /**
  2. * 方法说明:上传文件到远程共享目录
  3. * @param localDir 本地临时路径(A:/测试/测试.xls)
  4. * @param removeDir 远程共享路径(smb://10.169.2.xx/测试/,特殊路径只能用/)
  5. * @param removeIp 远程共享目录IP(10.169.2.xx)
  6. * @param removeLoginUser 远程共享目录用户名(user)
  7. * @param removeLoginPass 远程共享目录密码(password)
  8. * @return
  9. * @throws Exception 0成功/-1失败
  10. */
  11. public static int smbUploading(String localDir, String removeDir,
  12. String removeIp, String removeLoginUser, String removeLoginPass) throws Exception {
  13. NtlmPasswordAuthentication auth = null;
  14. OutputStream out = null;
  15. int retVal = 0;
  16. try {
  17. File dir = new File(localDir);
  18. if (!dir.exists()) {
  19. dir.mkdirs();
  20. }
  21. InetAddress ip = InetAddress.getByName(removeIp);
  22. UniAddress address = new UniAddress(ip);
  23. // 权限验证
  24. auth = new NtlmPasswordAuthentication(removeIp, removeLoginUser, removeLoginPass);
  25. SmbSession.logon(address,auth);
  26. //远程路径判断文件文件路径是否合法
  27. SmbFile remoteFile = new SmbFile(removeDir + dir.getName(), auth);
  28. remoteFile.connect();
  29. if(remoteFile.isDirectory()){
  30. retVal = -1;
  31. }
  32. // 向远程共享目录写入文件
  33. out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
  34. out.write(toByteArray(dir));
  35. } catch (UnknownHostException e) {
  36. retVal = -1;
  37. e.printStackTrace();
  38. } catch (MalformedURLException e) {
  39. retVal = -1;
  40. e.printStackTrace();
  41. } catch (SmbException e) {
  42. retVal = -1;
  43. e.printStackTrace();
  44. } catch (IOException e) {
  45. retVal = -1;
  46. e.printStackTrace();
  47. } finally{
  48. if (out != null) {
  49. try {
  50. out.close();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }
  56. return retVal;
  57. }
  58. /**
  59. * Mapped File way MappedByteBuffer 可以在处理大文件时,提升性能
  60. *
  61. * @param file 文件
  62. * @return 字节数组
  63. * @throws IOException IO异常信息
  64. */
  65. @SuppressWarnings("resource")
  66. public static byte[] toByteArray(File file) throws IOException {
  67. FileChannel fc = null;
  68. try {
  69. fc = new RandomAccessFile(file, "r").getChannel();
  70. MappedByteBuffer byteBuffer = fc.map(MapMode.READ_ONLY, 0,
  71. fc.size()).load();
  72. byte[] result = new byte[(int) fc.size()];
  73. if (byteBuffer.remaining() > 0) {
  74. byteBuffer.get(result, 0, byteBuffer.remaining());
  75. }
  76. return result;
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. throw e;
  80. } finally {
  81. try {
  82. fc.close();
  83. } catch (IOException e) {
  84. e.printStackTrace();
  85. }
  86. }
  87. }
复制代码

总结

以上所述是小编给大家介绍的Java远程共享目录的操作代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对程序员之家网站的支持!



太阳http代理AD
回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条