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远端共享文件的方法的主要内容,如果未能解决你的问题,请参考以下文章