zoukankan      html  css  js  c++  java
  • java访问windows远端共享文件的方法

    没密码的,直接用url访问就可以了,跟本地文件相同。

    有密码的,用smb。

    远端需要开启smb。

    win10启动smb的方法:
    https://jingyan.baidu.com/article/47a29f2477fb56c014239996.html

    注意,配完必须要重启windows。
    smb需要在服务器端启动,也就是那台windows机器,不启动会报错 Software caused connection abort: recv failed

    package file;
    
    import jcifs.smb.*;
    
    import java.io.*;
    
    public class ShareFile {
    
    
        /**
         * 一个普通的读取远端共享文件的方法,不需要输入密码
         * @param sourceFilePath
         * @param encode
         * @throws IOException
         */
        public static void readFile(String sourceFilePath, String encode) throws IOException {
            File file = new File(sourceFilePath);
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encode));
            StringBuilder strBuilder = new StringBuilder();
            String sLine = null;
            while ((sLine = br.readLine()) != null) {
                strBuilder.append(sLine);
                strBuilder.append("
    ");
            }
    
            br.close();
    
            System.out.println(strBuilder.toString());
        }
    
    
        /**
         * 一个普通的读取远端共享文件并保存到本地的方法,不需要输入密码
         * @param srcFileUrl
         * @param dstFilePath
         * @param dstFileName
         * @throws IOException
         */
        public static void readAddSaveFile(String srcFileUrl, String dstFilePath,String dstFileName) throws IOException {
    
            File dstPath = new File(dstFilePath);
            if (!dstPath.exists()) {
                dstPath.mkdirs();
            }
    
            OutputStream outputStream = new FileOutputStream(dstPath.getPath() + File.separator + dstFileName);
    
            // 开始读取
            int len;
            byte[] bs = new byte[1024];        // 1K的数据缓冲
            File srcFile = new File(srcFileUrl);
            InputStream inputStream = new FileInputStream(srcFile);
            while ((len = inputStream.read(bs)) != -1) {
                outputStream.write(bs, 0, len);
            }
    
            inputStream.close();
            outputStream.flush();
            outputStream.close();
    
        }
    
        /**
         * 一个往远端smb文件写数据的方法。
         * @throws IOException
         */
        public static void getFileBySmb() throws IOException {
            String user = "Felicia_shi";
            String pass = "123456";
    
            String sharedFolder = "Share";
            String path = "smb://1.1.1.109/" + sharedFolder + "/test.txt";
            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, pass);
            SmbFile smbFile = new SmbFile(path, auth);
            System.out.println(smbFile.getDfsPath());
            ;
            SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
            smbfos.write("testing.and writing to a file".getBytes());
            System.out.println("completed nice !");
        }
    
        /**
         * 远端文件路径。账号密码可以用这个url里面配置的,也可以用上面的NtlmPasswordAuthentication方式
         */
        private static String smbUrl = "smb://Felicia_shi:123456@1.1.1.109/Share";
    
        /**
         * 在远端smb路径下创建路径
          * @param dir
         * @throws Exception
         */
        public static void createDir(String dir) throws Exception{
            SmbFile fp = new SmbFile(smbUrl +"/"+dir);
            System.out.println("fieldir+++++++++++++++++++++="+ smbUrl +"/"+dir);
            //File fp = new File("Z://"+dir);
            // 目录已存在创建文件夹
            if (fp.exists() && fp.isDirectory()) {
    
            } else{
                // 目录不存在的情况下,会抛出异常
                fp.mkdir();
            }
        }
    
        /**
         * 拷贝smb下一个文件到本地。dstFileName为本地带文件名的路径,smbUrl为远端路径,文件名一样。
         * 这么写比较死,可以把文件名和路径分开放。
         * @param dstFileName
         */
        public static void copyDir(String dstFileName) {
            InputStream in = null;
            OutputStream out = null;
            try{
                File fp = new File(dstFileName);
    
                SmbFile remoteFile = new SmbFile(smbUrl +"//"+fp.getName());
                System.out.println("remoteFile+++++++++++++++++++++="+remoteFile);
                in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
                out = new BufferedOutputStream(new FileOutputStream(fp));
    //            in = new BufferedInputStream(new FileInputStream(fp));
    //            out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
                byte[] buffer = new byte[1024];
                int len;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
                // 刷新此缓冲的输出流
                out.flush();
            }catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        /**
         * 获取本段路径下的所有文件名
         * @param path
         * @return
         */
        public static String[] getFileNames(String path) {
            File dirFile = new File(path);
            if (dirFile.isDirectory()) {
                File[] files = dirFile.listFiles();
                String[] fileNames = new String[files.length];
                for (int i = 0; i < files.length; i++) {
                    fileNames[i] = files[i].getAbsolutePath();
                }
                return fileNames;
            } else {
                return null;
            }
        }
    
    
    
        public static void main(String[] args) {
    //        //读取单个文件
    //        try {
    //            ShareFile.readFile("\\1.1.1.110\sfx\gx\11.txt","utf-8");
    //        } catch (IOException e) {
    //            e.printStackTrace();
    //        }
            
    //          //读取某个目录下所有文件
    //
    //        String[] fileNames = getFileNames("\\1.1.1.110\sfx\gx");
    //        String encode = "utf-8";
    //        for (String fileName : fileNames) {
    //            try {
    //                readFile(fileName, encode);
    //            } catch (IOException e) {
    //                e.printStackTrace();
    //            }
    //        }
    
    
    //        try {
    //            readAddSaveFile("\\1.1.1.110\sfx\gx\a.pdf","\\1.1.1.110\sfx\gx1","a.pdf");
    //        } catch (IOException e) {
    //            e.printStackTrace();
    //        }
    
    //        try {
    //            getFileBySmb();
    //            createDir("111");
    //        } catch (IOException e) {
    //            e.printStackTrace();
    //        } catch (Exception e) {
    //            e.printStackTrace();
    //        }
    
            copyDir("E:\\sfx\gx1\a.pdf");
    
        }
    }
    

      

  • 相关阅读:
    05Linux文件修改
    07Linux基本权限
    09Linux软件安装
    搬家
    web项目和单元测试
    session_start() 对 HTTP_REQUEST扩展/fsockopen函数 的影响
    从不同架构的角度进行web项目的需求分析和系统设计
    程序中的风险控制
    【原创】 书籍推荐
    【转载】10个效果最佳的编程字体
  • 原文地址:https://www.cnblogs.com/aoyihuashao/p/10099970.html
Copyright © 2011-2022 走看看