자바 원 격 서버 파일 을 로 컬 로 다운로드(http 프로 토 콜 과 ssh 2 프로 토 콜 기반)

자바 에서 자바.io 패 키 지 는 우리 에 게 입력 흐름 과 출력 흐름 을 제공 합 니 다.파일 에 대한 읽 기와 쓰 기 는 기본적으로 이러한 봉 인 된 흐름 에 의존 합 니 다.얼마 전에 다음 과 같은 두 가지 수 요 를 만 났 습 니 다.
1.특정한 시스템 과 연결 하여 매일 최신 그림 을 가 져 와 전단 페이지 에 표시 합 니 다.이 시스템 은 http 프로 토 콜 의 그림 URL 을 제공 합 니 다.원래 이 시스템 의 그림 주 소 를 가 져 온 후에 HTML 에 표시 하면 됩 니 다.그러나 이 시스템 이 불안정 하고 그림 URL 을 자주 사용 할 수 없 으 며 매일 그림 을 만 드 는 데 성공 하지 못 합 니 다.
자기 시스템 의 기능 에 대한 영향 이 매우 크다.그래서 매일 이 시스템 에서 최신 그림 을 다운로드 하여 로 컬 업데이트 로 저장 하고 새 그림 이 없 으 면 지난번 그림 을 계속 사용 하 는 것 을 고려 합 니 다.
2.회사 알고리즘 팀 의 동료 가 영상 분석의 검 측 기능 을 완 성 했 고 캡 처 한 짧 은 영상 파일 을 생 성 할 수 있 으 며 시스템 은 이 영상 파일 을 가 져 오고 저장 해 야 합 니 다.알고리즘 은 Linux 시스템 에서 실행 되 고 FTP 서버 가 구축 되 지 않 았 기 때문에 알고리즘 을 실행 하 는 Linux 시스템 에서 파일 을 시스템 로 컬 로 복사 하여 저장 해 야 합 니 다.
이 두 가지 수 요 는 모두 대동소이 하 다.사고방식 은 파일 을 읽 고 지정 한 경 로 를 쓰 는 것 이다.http 프로 토 콜 의 그림 주 소 는 직접 읽 고 저장 할 수 있 을 뿐 리 눅 스 시스템 의 파일 은 이 서버 에 원 격 으로 연결 한 다음 에 파일 을 다운로드 해 야 한다.그러면 다음 과 같은 의존 도 를 도입 해 야 한다.

<!--         -->
 <dependency>
  <groupId>ch.ethz.ganymed</groupId>
  <artifactId>ganymed-ssh2</artifactId>
  <version>262</version>
 </dependency>
 <dependency>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <version>0.1.53</version>
 </dependency>
 <dependency>
  <groupId>commons-net</groupId>
  <artifactId>commons-net</artifactId>
  <version>3.4</version>
 </dependency>
쓸데없는 말 말고 코드 부터 올 려.

package com.XXX.utils;

import ch.ethz.ssh2.*;
import com.databus.Log;
import com.mysql.jdbc.StringUtils;

import java.io.*;
import java.net.*;

public class FileUtils {

 public static boolean downloadFile(String urlString,String fileName,String filePath) {
  boolean bool = false;

  InputStream is = null;
  FileOutputStream os = null;
  try {
   Log.info("    :" + urlString);
   //   URL
   java.net.URL url = new java.net.URL(urlString);
   //     
   URLConnection con = url.openConnection();
   //    
   is = con.getInputStream();
   // 1K     
   byte[] bs = new byte[1024];
   //         
   int len;
   //          ,         
   File file = new File(filePath);
   if (!file.exists())
    file.mkdirs();
   //fileName         ,       , :fileName + ".jpg";fileName + ".txt";
   os = new FileOutputStream(filePath + fileName, false);//false:    ,true:        
   //     
   while ((len = is.read(bs)) != -1) {
    os.write(bs, 0, len);
   }

   bool = true;
   Log.info("      :" + fileName);
  }catch (Exception e){
   e.printStackTrace();
  }finally {
   //   ,      
   if (null != os){
    try {
     os.flush();
     os.close();
    }catch (IOException e){
     e.printStackTrace();
    }
   }
   if (null != is){
    try {
     is.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return bool;
 }

 //         
 public static boolean copyFile(String ip,int port,String userName,String password,String sourceFile,String targetFile,String targetFileName){
  boolean bool = false;
  Connection conn = null;
  Session session = null;
  try {
   if (StringUtils.isNullOrEmpty(ip) || StringUtils.isNullOrEmpty(userName) || StringUtils.isNullOrEmpty(password) ||
     StringUtils.isNullOrEmpty(sourceFile) || StringUtils.isNullOrEmpty(targetFile)){
    return bool;
   }
   conn = new Connection(ip,port);
   conn.connect();
   boolean isAuth = conn.authenticateWithPassword(userName,password);
   if (!isAuth){
    Log.info("        ");
    return bool;
   }
   //    
   session = conn.openSession();

   //           
   session.execCommand("df -h");
   InputStream staout = new StreamGobbler(session.getStdout());
   BufferedReader br = new BufferedReader(new InputStreamReader(staout));
   String line = null;
   while ((line = br.readLine()) != null){
    System.out.println(line);
   }
   br.close();

   //       
   SCPClient scpClient = conn.createSCPClient();
   SCPInputStream scpis = scpClient.get(sourceFile);

   //          ,         
   File file = new File(targetFile);
   if (!file.exists())
    file.mkdirs();

   FileOutputStream fos = new FileOutputStream(targetFile + targetFileName);
   byte[] buffer = new byte[1024];
   int len = 0;
   while ((len = scpis.read(buffer)) != -1){
    fos.write(buffer,0,len);
   }
   fos.close();
   bool = true;
   //SFTP
   /*SFTPv3Client sftPClient = new SFTPv3Client(conn);
   sftPClient.createFile("");
   sftPClient.close();*/
  }catch (Exception e){
   e.printStackTrace();
   Log.info(e.getMessage());
   Log.info("    :" + sourceFile);
  }finally {
   if (null != session){
    session.close();
   }
   if (null != conn) {
    conn.close();
   }
  }

  return bool;
 }


}
첫 번 째 방법 downloadFile(String url String,String fileName,String filePath)은 우리 가 파일 을 읽 고 쓰 는 것 과 다 를 바 가 없습니다.리 눅 스 서버 파일 을 원 격 으로 읽 는 방법 을 알려 드 리 겠 습 니 다.
  copyFile(String ip,int port,String userName,String password,String sourceFile,String targetFile,String targetFileName)
리 눅 스 서버 의 ip,ssh 가 열 린 포트 번호(일반적으로 기본 값 은 22),서버 사용자 이름과 비밀번호 가 필요 합 니 다.따라서 리 눅 스 서버 가 ssh 연결 을 열 었 는 지 확인 해 야 합 니 다.그렇지 않 으 면 우리 프로그램 은 서버 와 연결 되 지 않 고 파일 복 제 는 말 할 것 도 없습니다.
사실 ssh 2 원 격 서버 를 연결 하 는 것 은 우리 가 Xshell 로 서버 를 연결 하 는 것 과 같 습 니 다.파일 을 복사 할 수 있 을 뿐만 아니 라 Linux 명령 을 실행 하여 Linux 를 조작 할 수도 있 습 니 다.위의 코드 를 보 세 요.

//    
  session = conn.openSession();

  //           
  session.execCommand("df -h");
  InputStream staout = new StreamGobbler(session.getStdout());
  BufferedReader br = new BufferedReader(new InputStreamReader(staout));
  String line = null;
  while ((line = br.readLine()) != null){
  System.out.println(line);
  }
  br.close();
이 코드 는 복사 파일 과 관계 가 없습니다.유지 하 는 이 유 는 df-h 명령(서버 디스크 사용 상황 조회)을 실 행 했 기 때문에 디스크 의 구체 적 인 사용 상황 을 얻 을 수 있 습 니 다.아래 그림 과 같은 효과 가 있 습 니 다.그래서 우 리 는 ssh 2 로 많은 일 을 할 수 있 고 관심 있 는 동 화 를 많이 알 수 있 습 니 다.

 또한 copy File()방법의 마지막 주석 코드 가 있 습 니 다.

//SFTP
  /*SFTPv3Client sftPClient = new SFTPv3Client(conn);
  sftPClient.createFile("files");
  sftPClient.close();*/
또한 SFTP 연결 을 통 해 디 렉 터 리 와 파일 을 원 격 으로 조작 할 수 있 습 니 다.예 를 들 어 디 렉 터 리 생 성,삭제,파일 생 성,삭제 등 입 니 다.
ssh 2 가방 의 다른 기능 과 용법 에 대해 더 이상 설명 하지 않 습 니 다.관심 있 는 동 화 는 댓 글 에서 교 류 를 환영 합 니 다.
이상 은 자바 가 원 격 서버 파일 을 로 컬(http 프로 토 콜 과 ssh 2 프로 토 콜 기반)에 다운로드 하 는 상세 한 내용 입 니 다.자바 다운로드 서버 파일 에 대한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기