JSch を使用する。ファイルの比較、保存等には Apache Commons IO を使用。
(コード例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
String hostname = "192.168.0.1"; // 接続先 String userid = "user"; // ユーザ名 String password = "pass"; // パスワード int portNo = 22; // ポート番号 String serverPath = "/home/user1/"; // サーバのパス String localPath = "C:/hoge/"; // ローカルのパス JSch jsch = new JSch(); // HostKey チェックを行わない Hashtable<String, String> config = new Hashtable<String, String>(); config.put("StrictHostKeyChecking", "no"); JSch.setConfig(config); // 接続情報設定 Session session = jsch.getSession(userid, hostname, portNo); session.setPassword(password); try { // 接続 session.connect(); } catch (JSchException e) { System.out.println("error."); return; } // sftp ChannelSftp channel = (ChannelSftp) session.openChannel("sftp"); channel.connect(); // pwd System.out.println(channel.pwd()); // cd channel.cd(serverPath); List<String> fileList = new ArrayList<String>(); // ls List<?> list = channel.ls("."); for (int i = 0; i < list.size(); ++i) { LsEntry entry = (LsEntry) list.get(i); // ディレクトリやリンクは除外 SftpATTRS attr = entry.getAttrs(); if (attr.isDir() || attr.isLink()) { continue; } String fileName = entry.getFilename(); fileList.add(serverPath + "/" + fileName); } // サーバ上ファイル一覧(フルパス) for (String filePath : fileList) { System.out.println(filePath); } // 以下、例として一番目のファイルを使用する // ファイルを取得 InputStream input1 = channel.get(fileList.get(0)); // ローカルのファイルと比較 InputStream input2 = new FileInputStream(localPath + ((LsEntry) list.get(0)).getFilename()); boolean result = IOUtils.contentEquals(input1, input2); System.out.println(result); if (!result) { // ファイルをローカルに保存 byte[] byteArr = IOUtils.toByteArray(input1); FileOutputStream fos = new FileOutputStream(localPath + ((LsEntry) list.get(0)).getFilename()); fos.write(byteArr); fos.close(); } channel.disconnect(); session.disconnect(); |