1.  方法

方法一:Runtime类

Java里面的lang包里(java.lang.Runtime)提供了一个允许Java程序与该程序所运 行的环境交互的接口,这就是Runtime类。

场景:在运行的java程序linux环境的linux命令
缺点:不能在任意主机上运行linux命令

使用参考:

方法二:远程执行SSH2主机并运行SHELL命令--ganymed-ssh2

场景:在任意主机上运行linux命令,也可以运行在window上

方法三:jsch.jar



注:简单的Java SSH客户端:jcabi-ssh

jcabi-ssh JSch 的一个便利封装, JSch 是SSH2的一个著名纯Java实现。

个人感觉缺点: 需要复制 私钥串

使用:



方法四:j2ssh jar 

SSHTools 是一组 Java 的 SSH 应用和开发包,包括:Java SSH API, SSH Terminal, SSH secured VNC client, SFTP client and SSH Daemon.

j2ssh 也包含在该项目中


用法: j2ssh-core-0.2.9.jar连接远程主机

2. ganymed-ssh2

Ganymed SSH-2 for Java是用纯Java实现SSH-2协议的一个包。在使用它的过程中非常容易,只需要java项目中引入ganymed-ssh2-build210.jar后,指定合法的用户名口令,或者授权认证文件,就可以创建到远程Linux主机的连接,在建立起来的会话中调用该Linux主机上的脚本文件,执行相关操作。

实现原理 

  Ganymed SSH-2 java在整个访问过程中担当SSH的客户端,由于Linux系统自带SSH服务,所以可以直接访问Linux系统并执行相关命令,而 Windows系统则需要首先安装SSH服务。
使用步骤

1.首先构造一个连接器,传入一个需要登陆的ip地址 
Connection conn = new Connection(ipAddr);
conn.connect(); // 连接


2.模拟登陆目的服务器 传入用户名和密码 ,
boolean isAuthenticated = conn.authenticateWithPassword(username, password);它会返回一个布尔值,true 代表成功登陆目的服务器,否则登陆失败

3.打开一个session,有点象Hibernate的session ,执行你需要的linux 脚本命令 。
Session sess = conn.openSession();
sess.execCommand("last");

4.接收目标服务器上的控制台返回结果,读取br中的内容
InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

注: 此时可进一步解析br获取更清晰易读的返回结果

5.得到脚本运行成功与否的标志 :0-成功 非0-失败
System.out.println("ExitCode: " + sess.getExitStatus());

6.关闭session和connection 
sess.close();
conn.close();


使用前注意

使用经验:
1) 如果使用Session.execCommand()方法,则每个session中只能执行一条命令
解决:

方法一:
一批次执行多条命令 : sess.execCommand( "cd test;cat 1.txt" ); 
一批次执行多条命令 :sess.execCommand("cd test && cat 1.txt"); 
 
方法二:

使用Session.startShell()方法代替Session.execCommand()方法

2) 如果使用Sess.execCommand()得到的结果和预期不一样或根本不能执行,那么要注意你的环境变量
解决:
脚本或命令中,尽量使用全路径(避免有时直接在linux下执行echo $PATH 与java中的sess.execCommand("echo $PATH"); 结果不一致
3)  当我只从stdout中读取数据时,进程有时候会挂起
解决:
]   只需使用Ganymed SSH-2自带的StreamGobbler类即可使用2个工作线程并行消费远程的stdout和stderr,StreamGobbler是一个特殊的输入流,它能使用内部工作线程读取、缓存所有另一个输入流输入的信息
InputStream stdout = new StreamGobbler(mysession.getStdout());  
InputStream stderr = new StreamGobbler(mysession.getStderr()); 
然后你就可以以任何顺序访问stdout和stderr,StreamGobblers将会在后台自动消费所有远程端口传递过来的数据并存放在一个内部的buffer中

]   为连接返回结果的读取设置超时时间

入门例子



使用参考:

3. java画图类库

参考:

大部分图表应用的功能都类似,主要在于界面的美观性和使用的灵活性上有一点高低
库名描述

JFreeChart - 多功能Java图表类库

完全开源免费的
图表还能以PNG和JPEG格式的图片输出
生成的图表操作起来非常流畅
ECharts-Java - Java版ECharts图表库ECharts是一款功能非常强大的JavaScript图表库,ECharts-Java是ECharts的Java版
Android图表绘制引擎 - AChartEngine在Android应用中添加可视化统计的功能
Java快速报表组件- DynamicReports
完全免费开源的。和之前介绍的JFreeChart不同,DynamicReports是报表和可视化图表相结合的,可以更加直观地展现和统计数据
Android开源图表库 - MPAndroidChart不仅可以在Android设备上绘制各种统计图 表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活
Java图表类库 - jChartsjCharts是一款基于Java的图表绘制类库
Java智能图表类库 - JChartLib不仅有着漂亮的外观,而且支持图表坐标数值的自动调整,这样我们在图表中 显示数值就比较简单,不用我们计算处理;

保持为 jpg 和 png 格式图片
基于SWT的Java图表类库 - SWTChartSWTChart是一款基于SWT的Java图表类库,也正因为是基于SWT的缘故,SWTChart应用起来非常方便,而且也相当轻巧
  

4. java画图类库-JFreeChart

开源: http://www.oschina.net/p/jfreechart

1) 简介


JFreeChart 支持生成多种不同类型的图表,包括从饼形图、条形图、面积图、直线图、柱状图以及 Gantt 图表等常见类型到 Candlestick、Wind 以及 Wafer Map 图表等较专业、不太常用的类型。确定 JFreeChart 支持的现成图表类型的最快的一种方法是检查 JFreeChart 的 ChartFactory 类的 Javadoc API 文档。


在一些开发环境中,可以使用 JFreeChart 有效地生成面向数据的图表,这些环境包括:


◆生成的文件为可移植网络图形 (PNG) 或 JPEG 格式
◆基于 Java SE Swing 的应用程序,包括小程序
◆Java EE servlet 和 JavaServer 页面 (JSP)
◆与 iText 集成创建 PDF
◆与 Batik 集成创建 SVG 格式

2)主要类

作用

JFreeChart 类

JFreeChart 库中最重要的类之一是它本身,名为 JFreeChart。

该类提供一种 Java 二维图表的表示。利用该类上的方法,开发人员可以控制生成的图表的各个方面,并可以创建表示图表的抽象窗口工具包 (AWT) BufferedImage。

您只需非常少的额外工作即可直接使用 JFreeChart 创建几种简单的图表类型
ChartFactory 类ChartFactory 类用于创建不同类型的图表。该类的每种静态方法都根据其生成的图表类型命名,无论调用何种类型的图表,每种方法都返回一个通用的 JFreeChart 类实例。扫描该类的 Javadoc 文档可以加深了解
ChartUtilities 类与 ChartFactory 类相似,ChartUtilities 类也具有大量静态方法。

该类提供的大多数方法都可以将图表转换为一种图像格式或基本的 HTML 图像映射。
  
  

3) 入门实例

package ssh2;

import java.awt.Font;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;

public class TestJfree2 {

	public static void main(String[] args) {
		

		 DefaultPieDataset dpd=new DefaultPieDataset(); //建立一个默认的饼图
	        dpd.setValue("管理人员", 25);  //输入数据
	        dpd.setValue("市场人员", 25);
	        dpd.setValue("开发人员", 45);
	        dpd.setValue("其他人员", 10);
	        
	        JFreeChart chart=ChartFactory.createPieChart("标题",dpd,true,true,false); 
	        //可以查具体的API文档,第一个参数是标题,第二个参数是一个数据集,第三个参数表示是否显示Legend,第四个参数表示是否显示提示,第五个参数表示图中是否存在URL
	        
	       // 中文不能显示,都变成了一个个的小方框
			Font titleFont = new Font("黑体", Font.BOLD, 20); 
			TextTitle textTitle = chart.getTitle(); 
			textTitle.setFont(titleFont);// 为标题设置上字体 
			 
			Font plotFont = new Font("宋体", Font.PLAIN, 16); 
			PiePlot plot = (PiePlot) chart.getPlot(); 
			plot.setLabelFont(plotFont); // 为饼图元素设置上字体 
			 
			Font LegendFont = new Font("楷体", Font.PLAIN, 18); 
			LegendTitle legend = chart.getLegend(0); 
			legend.setItemFont(LegendFont);// 为图例说明设置字体 
			
			//显示每一种情况占用的百分比是多少
			plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} {2}",NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));// 显示百分比 
	        
	        ChartFrame chartFrame=new ChartFrame("某公司人员组织数据图",chart); 
	        //chart要放在Java容器组件中,ChartFrame继承自java的Jframe类。该第一个参数的数据是放在窗口左上角的,不是正中间的标题。
	        chartFrame.pack(); //以合适的大小展现图形
	        chartFrame.setVisible(true);//图形是否可见
	}

}

5. js中画图

1) 分类


2)ECharts

这个开源的图标库来自百度EFE数据可视化团队。
入门实例教程

疑问解答:

Logo

更多推荐