java调用系统命令Demo

java调用系统命令范例

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class SystemCommandCall {
    public static void main(String[] args) throws Exception {
        String cmd = "ping 8.8.8.8"; //运行的命令

        Runtime runtime = Runtime.getRuntime();

        Process p = runtime.exec(cmd);

        InputStream is = p.getInputStream();
        InputStreamReader isr = new InputStreamReader(is, "UTF-8");
        BufferedReader reader = new BufferedReader(isr);

        for (String line; (line = reader.readLine()) != null;) {
            System.out.println(line);
        }
    }
}

junit的Rule使用方法介绍

简介

通过java annotations(注解)形式将TestRule或TestRule子类的实例添加到测试类中,来扩展各种测试功能。

环境

  • java 1.8
  • gradle

文件目录

.
├── main
│   ├── java
│   └── resources
└── test
    ├── java
    │   └── example
    │       ├── TestTemporaryFolder.java
    │       └── TestTestName.java
    └── resources

Continue reading

使用JAVA的ExecutorService来限制线程数量

前言

诸如利用多线程并行访问数据库可以提高系统的并发性能,但是线程变多伴随而来的是,当线程数大于DBMS(数据库管理系统)设置的最大DB连接数时,程序就挂掉了。在JAVA中如何避免这种问题呢?

解决方法

使用ExecutorService,限制最大线程数量

ExecutorService是?

ExecutorService是JAVA标准的并行计算库[java.util.concurrent]里包含的接口,封装原来难以使用的JAVA线程,使其简单化。

Continue reading

java stream api介绍

简介

Stream API借助前面介绍的java lambda表达式来进行集合数据处理。
下面举些常用的例子来熟悉下。

forEach

stream方法不调用也可以使用forEach

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).forEach(System.out::println);

filter

集合内数据过滤

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().filter(x -> x > 3.0).forEach(System.out::println);

Continue reading

Java lambda表达式

lambda表达式

lambda表达式是一种只拥有一个函数式接口的方法的叫法,可以简化封装。

函数式接口

在lisp这样的函数式编辑语言中,可以简单地把函数当作参数传递。在java中,由于函数不是对象,故不能直接当作参数传递。但可以通过函数式接口实现函数传递。

package foo;

public interface Func {
    public double apply(double x);
}

ps. 函数式接口只拥有一个抽象方法的接口
Continue reading

从问题角度来思考设计模式(2) – 结构编

目录

  1. 生成编
  2. 结构编
  3. 行为编

让API返回信息适配多样性

  • 改造前
FooAPI fooAPI = new FooAPI(lat, lng);
FooPlace place = new FooPlace();
place.setAddress(fooAPI.getPostalCode() + " " + fooAPI.getAddress()); // 邮编 **市**区
place.setStation(
    new StringJoiner(",")
    .add(fooAPI.getStation1())
    .add(fooAPI.getStation2())
    .add(fooAPI.getStation3())
    .toString());  //A车站,B车站,C车站

上面代码是API返回信息整形用例。这里只使用了FooAPI,未来如果返回信息的整形方式不变的话,倒也没有什么问题。但从易维护的角度思考,这称不上一个好的设计。
Continue reading

从问题角度来思考设计模式(1) – 生成编

目录

  1. 生成编
  2. 结构编
  3. 行为编

简介

关于设计模式可以理解为,那些经常会遇到的问题以及如何解决所洗练出来的总结。所以我们在考虑进行设计时,首先要做的就是查询当前所面临的问题,是否已经有很好的解决方案,而不是闭门造车。身边有些同事喜欢需求来了,直接上来就撸代码,认为为了迎合设计模式而设计的工作,会有过度设计的嫌疑。什么时候是导入新工具,新技术的最佳时机?当一个事物让人难以忍受的时候,这时改变所带来的团队收益远大于痛苦程度,就可以很平缓地推进。反之,强推工具反而引来的不是技术上的问题,而是人为的抵制。是不是很奇妙!

本文主要通过问题配合设计模式,来说明设计模式所带来的前后效果,加深大家各种模式的印象。

Continue reading