好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java工具jsch.jar实现上传下载

在做运维的时候,我们一般使用shell脚本实现文件的服务器之间定时传输,那么对于一些不会shell脚本的童鞋,就得使用万能的编程语言了,这里我们介绍一款java操作ftp的工具,那就是jsch.jar。工具已经写好,可以根据实际情况做调整,注释很清晰。大家按需阅读:

?

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

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

package com.wdy.tools.utils.sftputil;

 

import java.io.file;

import java.io.fileinputstream;

import java.io.fileoutputstream;

import java.io.inputstream;

import java.io.outputstream;

import java.util.arrays;

import java.util.collections;

import java.util.properties;

import java.util.vector;

 

import org.apache测试数据mons.logging.log;

import org.apache测试数据mons.logging.logfactory;

 

import com.jcraft.jsch.channel;

import com.jcraft.jsch.channelsftp;

import com.jcraft.jsch.jsch;

import com.jcraft.jsch.session;

 

/**

  * 利用jsch.jar针对sftp的上传和下载

  * 需要jar包:

  * commons-lang3-3.2.1.jar

  * commons-logging.jar

  * jsch-0.1.53.jar

  * log4j-1.2.17.jar

  * @author wangdy

  *

  */

public class jschsftputils {

 

  private static final log log = logfactory.getlog(jschsftputils. class );

 

  /**

  * 利用jsch包实现sftp下载文件

  * (这里是将serverpath下的指定扩展名的文件,全部下载到localpath下)

  * @param ip 主机ip

  * @param user 主机登陆用户名

  * @param psw 主机登陆密码

  * @param port 主机ssh2登陆端口,如果取默认值,传<=0的值,如-1

  * @param localpath 下载的本地目录的路径

  * @param serverpath 服务器目录

  * @param fileexetension 文件扩展名,格式如:'.txt'

  * @param isdelete 是否删除该路径下扩展名为fileexetension的远程文件

  * @throws exception

  */

  public static void sshsftpdownload(string ip, string user, string psw, int port, string serverpath, string localpath, string fileextension, boolean isdelete) throws exception {

  session session = null ;

  channel channel = null ;

  jsch jsch = new jsch();

  if (port <= 0 ) {

  // 连接服务器,采用默认端口

  session = jsch.getsession(user, ip);

  } else {

  // 采用指定的端口连接服务器

  session = jsch.getsession(user, ip, port);

  }

  // 如果服务器连接不上,则抛出异常

  if (session == null ) {

  throw new exception( "session is null" );

  }

  // 设置登陆主机的密码

  session.setpassword(psw); // 设置密码

  // 设置第一次登陆的时候提示,可选值:(ask | yes | no)

// session.setconfig("stricthostkeychecking", "no");

  properties sshconfig = new properties();

  sshconfig.put( "stricthostkeychecking" , "no" );

  session.setconfig(sshconfig);

  // 设置登陆超时时间ms

// session.connect(640);

  session.connect();

  log.info( "session connected." );

  log.info( "opening channel." );

  try {

  // 创建sftp通信通道

  channel = (channel) session.openchannel( "sftp" );

  channel.connect();

// channel.connect(1000);

  channelsftp sftp = (channelsftp) channel;

  log.info( "connected to " + ip + "." );

  // 进入服务器指定的文件夹

  sftp.cd(serverpath);

  /**

  * 列出服务器指定的文件列表(可以加参数,指明要下载的文件类型)

  * 说明:如果fileextension不为空,则下载指定扩展名的文件集;

  * 如果fileextension为"",则下载该目录下所有类型的文件,如果是文件夹的话,会报错,如果您路径下有以.连接的文件夹,请注意,这是不可以的,程序会在过滤到该文件夹时中断

  */

  vector<?> v = null ;

  if (fileextension != null && ! "" .equals(fileextension)) {

  v = sftp.ls( "*" +fileextension);

  } else {

  try {

   v = sftp.ls( "*.*" ); //ls -al | grep \"^-\"只显示文件---// ls -al | grep "^d"只显示目录包括.和..

  } catch (exception e) {

   log.info( "您操作的是一个文件夹!" );

  }

  }

 

  for ( int i = 0 ; i < v.size(); i++) {

// log.info("fileinfos: "+v.get(i));

  string[] fileinfos = v.get(i).tostring().replaceall( "\t" , " " ).split( " " );

  string filename = fileinfos[fileinfos.length- 1 ];

  log.info( "filename is: " +filename);

  // 以下代码实现从服务器下载一个文件到 本地

  inputstream instream = sftp.get(filename);

  outputstream outstream = new fileoutputstream( new file(localpath+ "/" +filename));

  byte b[] = new byte [ 1024 ];

  int n;

  while ((n = instream.read(b)) != - 1 ) {

   outstream.write(b, 0 , n);

  }

  outstream.flush();

  outstream.close();

  instream.close();

  log.info( "文件[" +filename+ "]下载成功!---->>>>下载到目录[" +localpath+ "]中." );

  //下载成功后,删除文件

  if (isdelete) {

   deleteonefile(serverpath, filename, sftp);

   log.info( "文件[" +filename+ "]删除成功!" );

  }

  }

  } catch (exception e) {

  e.printstacktrace();

  } finally {

  session.disconnect();

  channel.disconnect();

  }

  }

 

  /**

   * 利用jsch包实现sftp上传文件

   * @param ip 主机ip

   * @param user 主机登陆用户名

   * @param psw 主机登陆密码

   * @param port 主机ssh2登陆端口,如果取默认值,传<=0的值,如-1

   * @param localpath 本地目录

   * @param serverpath 服务器目录

   * @param fileextension 上传文件的扩展名 格式如:'.txt'

   */

  public static void sshsftpupload(string ip, string user, string psw, int port,string localpath, string serverpath, string fileextension) throws exception {

  session session = null ;

  channel channel = null ;

  jsch jsch = new jsch();

  if (port <= 0 ) {

  // 连接服务器,采用默认端口

  session = jsch.getsession(user, ip);

  } else {

  // 采用指定的端口连接服务器

  session = jsch.getsession(user, ip, port);

  }

  // 如果服务器连接不上,则抛出异常

  if (session == null ) {

  log.info( "session is null,服务器连接失败" );

  throw new exception( "session is null,服务器连接失败" );

  } else {

  log.info( "connected success, ip is [" +ip+ "]" );

  }

  // 设置登陆主机的密码

  session.setpassword(psw); // 设置密码

  // 设置第一次登陆的时候提示,可选值:(ask | yes | no)

  session.setconfig( "stricthostkeychecking" , "no" );

  // 设置登陆超时时间ms

  session.connect( 960 );

  try {

  // 创建sftp通信通道

  channel = (channel) session.openchannel( "sftp" );

  channel.connect( 1000 );

  channelsftp sftp = (channelsftp) channel;

  // 进入服务器指定的文件夹

  sftp.cd(serverpath);

  // 列出服务器指定的文件列表

// vector v = sftp.ls("*.sh");

// for (int i = 0; i < v.size(); i++) {

// system.out.println(v.get(i));

// }

  // 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换一下流就可以了

  string[] files = getlocalfilenamearray(localpath); //获取所有文件名数组

  for ( int i = 0 ; i < files.length; i++) {

  string filename = files[i];

  if (fileextension != null && ! "" .equals(fileextension)) { //如果扩展名不为空,则上传该路径下指定扩展名的文件

   if (filename.endswith(fileextension)) {

   outputstream outstream = sftp.put(filename); //要上传到服务器的文件,可以另外设个名字,也可以用本地的名称

   inputstream instream = new fileinputstream( new file(localpath+ "/" +filename)); //读取本地文件

   byte b[] = new byte [ 1024 ];

   int n;

   while ((n = instream.read(b)) != - 1 ) {

   outstream.write(b, 0 , n);

   }

   outstream.flush();

   outstream.close();

   instream.close();

   log.info( "文件[" +localpath+ "/" +filename+ "]上传成功!---->>>>上传到目录[" +serverpath+ "]中." );

   } else {

   log.info( "警告:文件[" +filename+ "]不是指定类型[" +fileextension+ "]的文件" );

   }

  } else { //如果扩展名为空,则上传该路径下的所有文件

   outputstream outstream = sftp.put(filename); //要上传到服务器的文件,可以另外设个名字,也可以用本地的名称

   inputstream instream = new fileinputstream( new file(localpath+ "/" +filename)); //本地文件

   byte b[] = new byte [ 1024 ];

   int n;

   while ((n = instream.read(b)) != - 1 ) {

   outstream.write(b, 0 , n);

   }

   outstream.flush();

   outstream.close();

   instream.close();

   log.info( "文件[" +filename+ "]上传成功!---->>>>上传到目录[" +serverpath+ "]中." );

  }

  }

  } catch (exception e) {

  e.printstacktrace();

  } finally {

  session.disconnect();

  channel.disconnect();

  }

  }

 

 

  /**

   * 利用jsch包实现sftp下载、上传文件(该方法暂不适用)

   * @param ip 主机ip

   * @param user 主机登陆用户名

   * @param psw 主机登陆密码

   * @param port 主机ssh2登陆端口,如果取默认值(默认值22),传-1

   * @param privatekey 密钥文件路径

   * @param passphrase 密钥的密码

   *

   */

  public static void sshsftp(string ip, string user, string psw , int port ,string privatekey ,string passphrase) throws exception{

   session session = null ;

   channel channel = null ;

   jsch jsch = new jsch();

   //设置密钥和密码

   if (privatekey != null && ! "" .equals(privatekey)) {

    if (passphrase != null && "" .equals(passphrase)) {

     //设置带口令的密钥

     jsch.addidentity(privatekey, passphrase);

    } else {

     //设置不带口令的密钥

     jsch.addidentity(privatekey);

    }

   }

   if (port <= 0 ){

    //连接服务器,采用默认端口

    session = jsch.getsession(user, ip);

   } else {

    //采用指定的端口连接服务器

    session = jsch.getsession(user, ip ,port);

   }

   //如果服务器连接不上,则抛出异常

   if (session == null ) {

    throw new exception( "session is null" );

   }

   //设置登陆主机的密码

   session.setpassword(psw); //设置密码

   //设置第一次登陆的时候提示,可选值:(ask | yes | no)

   session.setconfig( "stricthostkeychecking" , "no" );

   //设置登陆超时时间

   session.connect( 30000 );

   try {

    //创建sftp通信通道

    channel = (channel) session.openchannel( "sftp" );

    channel.connect( 1000 );

    channelsftp sftp = (channelsftp) channel;

    //进入服务器指定的文件夹

    sftp.cd( "domains" );

    //列出服务器指定的文件列表

    vector<?> v = sftp.ls( "*.txt" );

    for ( int i= 0 ;i<v.size();i++){

     log.info(v.get(i));

    }

    //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了

    outputstream outstream = sftp.put( "1.txt" );

    inputstream instream = new fileinputstream( new file( "c:/print.txt" ));

    byte b[] = new byte [ 1024 ];

    int n;

    while ((n = instream.read(b)) != - 1 ) {

     outstream.write(b, 0 , n);

    }

    outstream.flush();

    outstream.close();

    instream.close();

   } catch (exception e) {

    e.printstacktrace();

   } finally {

    session.disconnect();

    channel.disconnect();

   }

  }

 

 

  //***************utils******************//

  /**

  * 读取指定路径下的所有文件

  * @param localpath 指定路径

  * @return string[] 文件名数组

  */

  public static string[] getlocalfilenamearray(string localpath){

  file diskfile = new file(localpath);

  string[] filenamelist = diskfile.list() ;

  if (filenamelist!= null ){

  //按照文件名倒序排序

  arrays.sort(filenamelist,collections.reverseorder());

  }

  return filenamelist ;

  }

 

 

  /**

  * 删除指定目录的,指定扩展名的远程文件

  * @param directory 要删除文件的目录

  * @param sftp channelsftp实体

  * @param fileextension 文件扩展名(删除远程文件,扩展名不能为空)

  */

  public void deleteall(string directory, channelsftp sftp, string fileextension) {

   try {

   sftp.cd(directory);

   vector<?> v = null ;

   if (fileextension != null && "" .equals(fileextension)) {

   v=sftp.ls( "*" +fileextension);

  } else {

// v=sftp.ls("");//此处有风险

  log.warn( "fileextension is not null! please check" );

  }

   for ( int i = 0 ; i < v.size(); i++) {

   string[] fileinfos = v.get(i).tostring().replaceall( "\t" , " " ).split( " " );

  string filename = fileinfos[fileinfos.length- 1 ];

    sftp.rm(filename);

   }

   } catch (exception e) {

   e.printstacktrace();

   }

  }

 

  /**

  * 删除单个文件

  *

  * @param directory

  *   要删除文件所在目录

  * @param deletefile

  *   要删除的文件

  * @throws exception 

  */

  public static void deleteonefile(string directory, string deletefile, channelsftp sftp) throws exception {

  sftp.cd(directory);

  sftp.rm(deletefile);

  }

 

 

}

这就是整个工具的内容了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/wdy_2099/article/details/72853363

查看更多关于Java工具jsch.jar实现上传下载的详细内容...

  阅读:27次