Java读取远程主机文件

标签: java 主机 文件 | 发表时间:2013-09-19 00:20 | 作者:
出处:http://www.iteye.com
//Java利用第三方jar包(ganymed-ssh2-build210.jar)读取远程主机文件

package com.poson.cb.web.action.bill;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SFTPv3Client;
import ch.ethz.ssh2.SFTPv3FileAttributes;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import com.poson.cb.ext.domain.RealTimeBilling;
import com.poson.cb.lib.dr.DRApiHPImpl;
import com.poson.cb.service.AppException;
import com.poson.cb.web.action.BaseAction;

//实时清,账单文件查询
public class RealTimeBillingAction extends BaseAction{
Runtime runtime=Runtime.getRuntime();
String useHome=System.getProperty("user.home");
String idxMasterPath = useHome+"ADR/cb/data/master/";   //主侧IDX文件路径
String idxSlavePath = useHome+"ADR/cb/data/slave/";     //备侧文件路径
String[] fileDirName={"bill","mobile","fixed","fileout"};
short outTime=2;   //设置超时时间为2分钟
String shIsMaster="Master";   //当前主侧默认是上海
Connection con=null;

public ActionForward realTimeActionForward(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws AppException, Exception {
List bjList=new ArrayList();
List shList=new ArrayList();
InetAddress address=InetAddress.getLocalHost();

// 1.0 获取主备角色
short sysSate = new DRApiHPImpl().getSystemState();
System.out.println("第三种方法获得主备角色:" + sysSate); // 0-主系统,1-备系统,2-非融灾系统
       
//判断上海是否是主侧
if(sysSate==1 && (getCurrentHostAddress().equals("132.32.24.105"))){
shIsMaster="slave";
}
// 2.0 获取当前侧容灾平台正在处理的IDX(文件)名称
Process p1 = runtime
.exec(new String[] { "/bin/sh", "-c", "dr_stat -l" });
BufferedReader bReader = new BufferedReader(new InputStreamReader(p1
.getInputStream()));
String firstLine = bReader.readLine();
// 读取第二行的记录(第一行为unix返回的列)
while ((firstLine = bReader.readLine()) != null) {
String[] arrs = firstLine.split("\\s{1,}"); // 以空格为分隔符
// 获取IDX文件名
String idxName = arrs[0];
if(idxName != null && !"".equals(idxName)){
//得到当前侧的文件集合
    RealTimeBilling  billing=getFileNameListByIdxOfCurr(idxName.trim(),sysSate);
if(null !=billing){
if(getCurrentHostAddress().equals("132.129.24.18") || getCurrentHostAddress().equals("132.129.24.5")){
shList.add(billing);
}else {
bjList.add(billing);
}
}
}
}

// 获得对端侧文件集合
short endSysStat;
if(sysSate==0){
endSysStat=1;
}else {
endSysStat=0;
}
Session session=getEndtoSession();
//获取对端idxName
session.execCommand("dr_stat -l");
BufferedReader bReader2=new BufferedReader(new InputStreamReader(session.getStdout()));
String endFirstLine = bReader2.readLine();
while((endFirstLine=bReader2.readLine())!=null){
String[] endArrs = endFirstLine.split("\\s{1,}"); // 以空格为分隔符
// 获取IDX文件名
String endIdxName = endArrs[0].trim();
RealTimeBilling  billing1 =getFileNameListByIdxOfEnd(session, endIdxName, endSysStat);
if(null !=billing1){
if(getCurrentHostAddress().equals("132.129.24.18") || getCurrentHostAddress().equals("132.129.24.5")){
bjList.add(billing1);
}else {
shList.add(billing1);
}
}
}
session.close();
p1.destroy();
request.setAttribute("bjList", bjList);
request.setAttribute("shList", shList);
request.setAttribute("shIsMaster", shIsMaster);
return actionMapping.findForward("realTimeBilling");
}

//设置跳转方法
public ActionForward realTimeForward(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws AppException, Exception {
request.setAttribute("bjList", "");
request.setAttribute("shList", "");
request.setAttribute("shIsMaster", "");
return actionMapping.findForward("realTimeForward");
}

// 获得对端session
public Session getEndtoSession(){
String hAddress = "";
String ip,user,pwd;
Session session=null;

try {
//InetAddress iAddress = InetAddress.getLocalHost();
hAddress =getCurrentHostAddress();
System.out.println("本机的IP地址是:" + hAddress);
String ipConfigFile = useHome + "web" + File.separator + "CB"
+ File.separator + "WEB-INF" + File.separator
+ "ipconfig.properties";
Properties properties = new Properties();
properties.load(new FileInputStream(ipConfigFile));
if (hAddress.equals("132.129.24.18") || hAddress.equals(properties.get("sIp").toString().trim())) {
ip=properties.get("bIp").toString().trim();
user=properties.get("bUser").toString().trim();
pwd=properties.get("bPwd").toString().trim();
} else {
ip=properties.get("sIp").toString().trim();
user=properties.get("sUser").toString().trim();
pwd=properties.get("sPwd").toString().trim();
}
System.out.println("对端服务器的IP="+ip+" 用户名:"+user+" 密码:"+pwd);
con=new Connection(ip);
con.connect();
boolean isAuthenticate=con.authenticateWithPassword(user, pwd);
if(isAuthenticate==false){
System.out.println("连接对端服务器认证失败......");
throw new IOException("Authentication failed....");
}
session=con.openSession();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return  session;
}

//获取对端文件集合
public List getEndToFileNameList(){

Session  session=getEndtoSession();
//1.0 获得对端侧
return null;
}

//这种方法可以获得主备系统
public String getMachineRole(){
String mRole="";
try {
String drStatStr="dr_stat -d|head -n1|sed 's/^.*=//'|tr [A-Z] [a-z]";
Process p2=Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",drStatStr});
InputStreamReader inReader=new InputStreamReader(p2.getInputStream());
LineNumberReader lReader=new LineNumberReader(inReader);

p2.waitFor();
while((mRole=lReader.readLine()) !=null){
System.out.println("用第二种方法获得主机角色:"+mRole);
}
} catch (IOException e) {
System.out.println("用第二种方法获得主机角色失败");
e.printStackTrace();
} catch (InterruptedException e) {
System.out.println("用第二种方法获得主机角色失败");
e.printStackTrace();
}
//output :master
return mRole;
}

//通过文件idxName查找对应的文件名称

public RealTimeBilling getFileNameListByIdxOfCurr(String idxName,int sysStat) throws Exception{
RealTimeBilling rBilling=null;
for (int i = 0; i < fileDirName.length; i++) {
String filePath="";
if(sysStat==0){
//在主侧目录查找
filePath=idxMasterPath+fileDirName[i]+File.separator+idxName;
}else if (sysStat==1) {
//在备侧目录查找
filePath=idxSlavePath+fileDirName[i]+File.separator+"processing"+File.separator+idxName;
}
File file=new File(filePath);
if(file.exists()){
rBilling=new RealTimeBilling();
System.out.println("打印文件所在目录:"+file.getPath());
//读取idx文件并获取文件名称
LineNumberReader lNumberReader=new LineNumberReader(new FileReader(file));
String linInfo ="";
while((linInfo=lNumberReader.readLine())!=null){
if(linInfo.indexOf("FILE_NAME")>0){
String fileName=lNumberReader.readLine().trim();
rBilling.setFileName(fileName);
if((Calendar.getInstance().getTimeInMillis()-file.lastModified())/1000/60 > outTime){
rBilling.setOutTime(true);
}else {
rBilling.setOutTime(false);
}
System.out.println("打印当前侧文件名称:"+fileName +"是否超过2分钟:"+rBilling.isOutTime());
break;
}
}
}

}
return rBilling;
}

//在对端侧查找对应的文件
public RealTimeBilling getFileNameListByIdxOfEnd(Session session ,String idxName,short sysStat) throws Exception{
RealTimeBilling rBilling=null;
for (int i = 0; i < fileDirName.length; i++) {
String filePath="";
if(sysStat==0){
//在主侧目录查找
filePath=idxMasterPath+fileDirName[i];
}else if (sysStat==1) {
//在备侧目录查找
filePath=idxSlavePath+fileDirName[i]+File.separator+"processing";
}
session.execCommand("find "+filePath+" -name "+idxName);
BufferedReader bReader1=new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout()))) ;
String pathStr;
while((pathStr=bReader1.readLine())!=null){
session.execCommand("cat "+pathStr);
BufferedReader bReader2=new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout()))) ;
String endFileLine;
while((endFileLine=bReader2.readLine())!=null){
if(endFileLine.indexOf("FILE_NAME")>0){
String fileName=bReader2.readLine().trim();
System.out.println("对端提取的文件名称为:"+fileName);
rBilling=new RealTimeBilling();
rBilling.setFileName(fileName);
    SFTPv3FileAttributes sAttributes= new SFTPv3Client(con).lstat(filePath);
Integer mtime= sAttributes.mtime;  //获得文件的修改时间  需要确认返回的值是否以毫秒为单位
    if(((Calendar.getInstance().getTimeInMillis()-Long.parseLong(mtime.toString()))/1000/60) > outTime){
    rBilling.setOutTime(true);
    }else {
rBilling.setOutTime(false);
}
    System.out.println("对端提取的idxName文件所在路径为:"+filePath +"  该文件的访问时间为:"+mtime +"  是否超时:"+rBilling.isOutTime());
break;
}
}
}
}
return rBilling;
}


public String getCurrentHostAddress(){
String hoString="";
try {
InetAddress iAddress=InetAddress.getLocalHost();
hoString= iAddress.getHostAddress();
} catch (UnknownHostException e) {
System.out.println("获取本机IP地址出错错误......");
e.printStackTrace();
}
return hoString;
}




public static void main(String[] args) {
new RealTimeBillingAction().getEndtoSession();
}
}


利用第三方jar包(ganymed-ssh2-build210.jar)读取远程主机文件的主要步骤为:
1.0 获得session
    con=new ch.ethz.ssh2.Connection(ip);
    con.connect();
    boolean isAuthenticate=con.authenticateWithPassword(user, pwd);
    session=con.openSession();
2.0 通过session执行命令并读取返回结果
     session.execCommand("find "+filePath+" -name "+idxName);
    BufferedReader bReader1=new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout()))) ;



                         2013-09-19 0:19 记 @sanliheludongkou.xichengqu.beijing

                        



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 主机 文件] 推荐:

Java读取远程主机文件

- - ITeye博客
//Java利用第三方jar包(ganymed-ssh2-build210.jar)读取远程主机文件. String idxMasterPath = useHome+"ADR/cb/data/master/";   //主侧IDX文件路径. String idxSlavePath = useHome+"ADR/cb/data/slave/";     //备侧文件路径.

Java的 class文件结构

- - Java - 编程语言 - ITeye博客
Java-class文件结构.        我们都知道我们现在写的源代码计算机是不认识的,我们需要根据指定的编译器进行编译-连接-执行,这样才是我们想要的结果,所以计算机只能认识0或者1 ,那么如何与操作系统或者机器指令无关的程序能执行,那么在操作系统以及机器指令之上的那就是虚拟机了,这样我们编写的代码不再是最终形成二进制本地指令代码,而是一种在操作系统和机器指令之上的虚拟机规定的文件格式.

Java写xml文件的编码问题

- - CSDN博客推荐文章
最近项目中需要生成xml格式的配置文件,用的是 javax.xml.transform.Transformer 类中提供的transform方法,在本地执行没问题,但是一旦把工程部署到Tomcat下运行,就会出现中文乱码的现象,纠结了许久,在大神的帮助下终于解决了. 有篇文章其实已经讲的很清楚了,链接如下:.

JAVA 动态(手动)加载jar文件

- - CSDN博客编程语言推荐文章
//filePath 是jar的绝对路径. //里面是一个url的数组,可以同时加载多个. //根据类名加载指定类,例:. //通过反射调用类中的方法,例如调用addFile方法,有1个String参数和一个int参数:. 如果有返回值,则直接返回需要的值,例:. 作者:kingboy123000 发表于2013-10-23 16:12:30 原文链接.

使用Java处理大文件

- - ImportNew
我最近要处理一套存储历史实时数据的大文件 fx market data,我很快便意识到,使用传统的InputStream不能够将它们读取到内存,因为每一个文件都超过了4G. 甚至编辑器都不能够打开这些文件. 在这种特殊情况下,我可以写一个简单的bash脚本将这些文件分成更小的文件块,然后再读取它.

分析一个Java Class文件

- - CSDN博客推荐文章
Java源码文件TestClass.java:. 展示这个Class文件的16进制内容:. 00 00 00 34 : 版本号是1.8.0;. 00 16: 说明常量池有21个常量,1-21, index留做他用;接下来就是分别这21个常量的描述:. 07/00 02 :CONSTANT_Class_info 常量,类名索引是该常量池的第2项;.

Java根据文件头获取文件类型

- - BlogJava_首页
文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分. 头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation).      为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式.

java,根据头文件判断文件类型

- - Java - 编程语言 - ITeye博客
web判断文件的格式的时候,我们一般都是通过扩展名来判断,这个有点不太靠谱和安全. 下面是利用头文件来判断的代码:. * 根据文件流读取图片文件真实类型.  网上搜索了一些头文件的格式,但是强调一下,txt文件没有固定的头名,需要另外考虑,供参考:. JPEG (jpg),文件头:FFD8FF  .

处理XML文件的三种方式(Java)

- - CSDN博客推荐文章
    DOM(Document Object Model),文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构. 换句话说,这是表示和处理一个HTML或XML文档的常用方法. 有一点很重要,DOM的设计是以对象管理组织(OMG)的规约为基的,因此可以用于任何编程语言.

java实现把文件上传至ftp服务器

- - CSDN博客互联网推荐文章
用java实现ftp文件上传. 我使用的是commons-net-1.4.1.zip. 其中包含了众多的java网络编程的工具包. 1 把commons-net-1.4.1.jar包加载到项目工程中去. * Description: 向FTP服务器上传文件. * @param url FTP服务器hostname.