Tôi muốn lấy tệp từ hệ thống Unix đến hệ thống cục bộ của mình trên cửa sổ bằng cách sử dụng java. Tôi rất mới với khái niệm này. Bất kỳ ý tưởng về cách nó có thể được thực hiện? API java tốt nhất cho tác vụ này là gì?chuyển các tệp từ Unix sang cửa sổ bằng cách sử dụng java
Trả lời
Tôi đã tìm thấy JSch là lời đề nghị rất hữu ích và thẳng thắn. Dưới đây là một đoạn mã được viết để đặt tất cả các tệp .txt trong một thư mục đã cho trên máy chủ sftp.
public static void sftpConnection() {
// Object Declaration.
JSch jsch = new JSch();
Session session = null;
Channel channel = null;
// Variable Declaration.
String user = "foo";
String host = "10.9.8.7";
Integer port = 22;
String password = "test123";
String watchFolder = "\\localhost\textfiles";
String outputDir = "/remote/textFolder/";
String filemask = "*.txt";
try {
session = jsch.getSession(user, host, port);
/*
* StrictHostKeyChecking Indicates what to do if the server's host
* key changed or the server is unknown. One of yes (refuse connection),
* ask (ask the user whether to add/change the key) and no
* (always insert the new key).
*/
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(password);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp)channel;
// Go through watch folder looking for files.
File[] files = findFile(watchFolder, filemask);
for(File file : files) {
// Upload file.
putFile(file, sftpChannel, outputDir);
}
} finally {
sftpChannel.exit();
session.disconnect();
}
}
public static void putFile(File file, ChannelSftp sftpChannel, String outputDir) {
FileInputStream fis = null;
try {
// Change to output directory.
sftpChannel.cd(outputDir);
// Upload file.
fis = new FileInputStream(file);
sftpChannel.put(fis, file.getName());
fis.close();
} catch{}
}
public static File[] findFile(String dirName, final String mask) {
File dir = new File(dirName);
return dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String filename)
{ return filename.endsWith(mask); }
});
}
Cảm ơn bạn rất nhiều – user1585111
Điều đầu tiên trong tâm trí của tôi là FTP.
nhưng FTP là không an toàn, tôi nghĩ rằng nó sẽ là tốt nếu chúng ta tiếp tục với sftp. – user1585111
Có nhiều lựa chọn để thực hiện điều đó. Đầu tiên một giao tiếp socket đơn giản giữa một máy khách java và một máy chủ. Nếu bạn muốn đi với phương pháp này sau đó làm theo này:
http://mrbool.com/file-transfer-between-2-computers-with-java/24516
Sau đó, có giao thức cấp cao hiện thực khác có thể được sử dụng như FTP, HTTP, vv
theo một SO liên quan gửi cho máy chủ ứng dụng khách java FTP: FTP client server model for file transfer in Java
cảm ơn bạn, có một số thông tin tốt .. có bất kỳ api java nào để làm những điều này khá đơn giản không? – user1585111
@ user1585111 java apis có sẵn và được sử dụng rộng rãi cho giao tiếp socket. kiểm tra này: http://download.oracle.com/javase/tutorial/networking/sockets/ –
jsch có thể giúp tôi để đạt được nhiệm vụ này? – user1585111
Nếu máy Unix hỗ trợ SFTP, JSch là một tùy chọn. Bạn có thể điều chỉnh mã sau để đáp ứng nhu cầu của mình:
private static final String USER_PROMPT = "Enter [email protected]:port";
private static final boolean USE_GUI = true;
public static void main(final String[] arg) {
Session session = null;
ChannelSftp channelSftp = null;
try {
final JSch jsch = new JSch();
final String defaultInput = System.getProperty("user.name") + "@localhost:22";
String input = (USE_GUI) ? JOptionPane.showInputDialog(USER_PROMPT, defaultInput) : System.console().readLine("%s (%s): ", USER_PROMPT, defaultInput);
if (input == null || input.trim().length() == 0) {
input = defaultInput;
}
final int indexOfAt = input.indexOf('@');
final int indexOfColon = input.indexOf(':');
final String user = input.substring(0, indexOfAt);
final String host = input.substring(indexOfAt + 1, indexOfColon);
final int port = Integer.parseInt(input.substring(indexOfColon + 1));
jsch.setKnownHosts("/path/to/known_hosts");
// if you have set up authorized_keys on the server, using that identitiy
// with the code on the next line allows for password-free, trusted connections
// jsch.addIdentity("/path/to/id_rsa", "id_rsa_password");
session = jsch.getSession(user, host, 22);
final UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.connect();
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
channelSftp.get("/remotepath/remotefile.txt", "/localpath/localfile.txt");
} finally {
if (channelSftp != null) {
channelSftp.exit();
}
if (session != null) {
session.disconnect();
}
}
}
public static class MyUserInfo implements UserInfo {
private String password;
@Override
public String getPassword() {
return password;
}
@Override
public boolean promptYesNo(final String str) {
final Object[] options = {"yes", "no"};
final boolean yesNo = (USE_GUI) ? JOptionPane.showOptionDialog(null, str, "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]) == 0 : System.console().readLine("Enter y or n: ").equals("y");
return yesNo;
}
@Override
public String getPassphrase() {
return null;
}
@Override
public boolean promptPassphrase(final String message) {
return true;
}
@Override
public boolean promptPassword(final String message) {
if (!USE_GUI) {
password = new String(System.console().readPassword("Password: "));
return true;
} else {
final JTextField passwordField = new JPasswordField(20);
final Object[] ob = {passwordField};
final int result = JOptionPane.showConfirmDialog(null, ob, message, JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
password = passwordField.getText();
return true;
} else {
return false;
}
}
}
@Override
public void showMessage(final String message) {
if (!USE_GUI) {
System.console().printf(message);
} else {
JOptionPane.showMessageDialog(null, message);
}
}
}
Cảm ơn bạn rất nhiều – user1585111
Cách sử dụng độc đáo và rất thanh lịch. –
channelSftp.get ("/ remotepath/remotefile.txt", "/localpath/localfile.txt"); đặc biệt hữu ích – parishodak
- 1. Chuyển đổi tệp sang định dạng UNIX bằng Maven
- 2. Cách chuyển đổi tệp từ Dos sang Unix
- 3. Đang chuyển clock_gettime sang các cửa sổ
- 4. các đường di chuyển từ cửa sổ này sang cửa sổ khác
- 5. Chuyển đổi đường dẫn Unix sang cửa sổ trong QMake Script
- 6. Làm mới cửa sổ cha mẹ từ cửa sổ con bằng cách sử dụng javascript
- 7. Không thể chuyển chức năng từ cửa sổ này sang cửa sổ khác trong IE
- 8. Đệ quy xóa các tệp 0KB bằng cách sử dụng các cửa sổ cmd
- 9. Phím tắt để di chuyển từ VBA Cửa sổ ngay lập tức sang cửa sổ mã
- 10. chuyển từ cửa sổ sang nền tảng lập trình * nix
- 11. chuyển tiếp các sự kiện winapi sang cửa sổ khác
- 12. unix "java" lệnh tương đương trên cửa sổ?
- 13. Chuyển đổi giữa tên tệp URL và cửa sổ (Java)?
- 14. Sử dụng các lớp tham chiếu R để chuyển các giá trị từ cửa sổ này sang cửa sổ khác trong GUI
- 15. Chuyển tệp SFTP bằng cách sử dụng Java JSch
- 16. cách trích xuất các byte cụ thể từ một tệp bằng cách sử dụng unix
- 17. Chuyển hướng đã chuyển đối số sang tệp lô cửa sổ
- 18. PHP Triển khai lên các cửa sổ/máy chủ Unix
- 19. Chuyển đổi từ PDF sang Postscript bằng cách sử dụng Java
- 20. Tạo một cửa sổ trên cùng bằng cách sử dụng tay cầm cửa sổ
- 21. Chuyển hướng bảng điều khiển.writeline từ cửa sổ ứng dụng sang một chuỗi
- 22. Java JNI: Tạo cửa sổ xoay bằng JNI từ C
- 23. Cách xóa tập tin được sử dụng/khóa bởi các cửa sổ trong java
- 24. Cách đóng cửa sổ bằng cách sử dụng jQuery
- 25. Tạo cửa sổ mới bằng cách sử dụng jquery
- 26. Mở một tệp trên Unix bằng cách sử dụng C++
- 27. Mở cửa sổ phía sau cửa sổ hiện tại bằng cách sử dụng Javascript/jQuery
- 28. Chuyển đổi tài liệu Word sang PDF bằng cách sử dụng Java
- 29. Cửa sổ phương thức WPF bằng cách sử dụng ShowDialog() Chặn tất cả các cửa sổ khác
- 30. Làm cách nào để chuyển đổi từ Lịch Gregorian sang Thời gian Unix, trong Java?
Bạn có thể giải thích lý do bạn muốn sử dụng Java cụ thể không? Samba hoặc SFTP đang làm việc, các tùy chọn sẵn sàng để cài đặt đã thực hiện việc này. – chrylis