java访问windows远端共享文件的方法

Posted 翔鹤岭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:[email protected]/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");

    }
}

  

以上是关于java访问windows远端共享文件的方法的主要内容,如果未能解决你的问题,请参考以下文章

JAVA并发共享资源访问

Windows7无法访问共享文件夹(0x800704cf,0x80070035)解决方法

Linux nfs

linux访问windows共享文件夹的两种方法

windows使用ipv6地址访问共享文件夹的方法

Linux怎样访问Windows共享文件和文件夹