Vi,Java,Ant,Junit
1. vi编辑器
1. 1 什么是vi
vi是Linux和Unix上最基本的文本编辑器,工作在字符模式下。由于不需要图形界面,vi是效率很高的文本编辑器。尽管在Linux上也有很多图形界面的编辑器可用,但vi在系统和服务器管理中的功能是那些图形编辑器所无法比拟的。
vi编辑器通常被简称为vi,而vi又是“Visual interface”的简称。它在Linux上的地位就像Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。
1.2 vi工作模式
vi有三种基本工作模式:命令模式、文本输入模式、末行模式。
命令模式
在任意模式下按下ESC键即可以进入到命令行模式,在用户使用vi命令的开始也是这种模式,可以用于移动光标、删除字、进行复制粘贴等操作,在命令行下输入字母是没有任何显示的,一般是直接按功能键执行命令
编辑模式
在命令模式下输入插入命令i、a 、o可以进入编辑模式。该模式下,用户输入的任何字符都被文件输入,可用ESC键回到命令模式下。
末行模式
在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。
如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。
1.3 命令模式下常用命令
-
进入编辑模式
i和I: i在光标前插入,I在行首插入
a和A: a在光标后插入,A在行末插入
o和O: o在光标所在行下一行插入,O在光标所在行上一行插入
-
移动光标
h:光标向左移动
j:光标向下移动
k:光标向上移动
l:光标向右移动
H、M、L:光标移动到到可见屏幕第一行(H)、中间行(M)、最后一行(L)
^:移动到行首
$:移动到行末
G和gg:G文档最后一行,gg文档第一行
-
删除命令
X和x:x删除光标后一个字符,X删除光标前一个字符,包含光标位置字符
dd和 n dd:dd删除所在行,n dd删除指定行数
d0和D:d0删除光标前本行所有内容,D删除光标后本行所有内容,包含光标位置字符
-
其他功能命令
u:撤销
ctrl + r:重做
.:重复执行上一次操作的命令
yy:复制当前行,5 yy复制5行
p: 在光标所在位置向下新开一行粘贴
v 和 V:v选择单个字符,V选择整行
<<和>>:选择文本之后,向左缩进,向右缩进
1.4 底行模式下常用命令:
- 搜索替换
r和R:r替换当前字符,R替换光标后的字符
/ + str:n查找下一个,N查找前一个
%s/abc/123/g:将文件中所有abc替换为123
10s/abc/123/g:将第一行至第10行之间的abc替换成123
2. java语言
2.1 什么是java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。 Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
2.2 java环境配置
这里主要是设置好JAVA_HOME环境变量,一开始用的是whereis java
命令,但给出的并不是实际的java路径,后来查阅后使用以下命令来找到java的安装路径。
/usr/libexec/java_home
然后将得到的路径填入到~/.bash_profile文件中。
export JAVA_HOME=$(/usr/libexec/java_home)
2.3 java计算器小程序
这里使用的swingUI库。
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.event.*;
public class Carculator extends JFrame{
public Carculator() {
JPanel panel;
JLabel result, op, eq;
JTextField op1, op2;
JButton add, sub, mul, div, equal;
setBounds(100, 100, 450, 200);
setTitle("Carculator");
// op1 and op2
op1 = new JTextField("12");
op2 = new JTextField("2");
op = new JLabel("",JLabel.CENTER);
eq = new JLabel("=",JLabel.CENTER);
result = new JLabel("",JLabel.CENTER);
add = new JButton("+");
sub = new JButton("-");
mul = new JButton("*");
div = new JButton("/");
equal = new JButton("ok");
panel = new JPanel();
//2 row 5 col
panel.setLayout(new GridLayout(2,5));
panel.add(op1);
panel.add(op);
panel.add(op2);
panel.add(eq);
panel.add(result);
panel.add(add);
panel.add(sub);
panel.add(mul);
panel.add(div);
panel.add(equal);
add(panel);
ActionListener res = new ActionListener() {
public void actionPerformed(ActionEvent e){
result.setText("");
double num1 = Double.parseDouble(op1.getText());
double num2 = Double.parseDouble(op2.getText());
if(op.getText().equals("+")){
result.setText("" + (num1 + num2));
}
if(op.getText().equals("-")){
result.setText("" + (num1 - num2));
}
if(op.getText().equals("*")){
result.setText("" + (num1 * num2));
}
if(op.getText().equals("/")){
result.setText("" + (num1 / num2));
}
}
};
ActionListener chop = new ActionListener() {
public void actionPerformed(ActionEvent e) {
op.setText(((JButton)e.getSource()).getText());
}
};
// calculate
add.addActionListener(chop);
sub.addActionListener(chop);
mul.addActionListener(chop);
div.addActionListener(chop);
equal.addActionListener(res);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Carculator();
}
}
3. Ant
3.1 什么是ant
Ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。由Apache软件基金会所提供。Ant 也可以有效地用于构建非Java应用程序,例如 C 或 C++ 的应用程序。更一般地,Ant 可以用来驾驶任何类型的能在目标和任务来描述过程。
3.2 ant使用
Ant 是以 build.xml 为默认的文件,如果不存在 build.xml,则 Ant 会报错,不过我们可以指定特定名称的 xml 文件作为 Ant 编译的文件,使用以下命令进行编译。
ant -buildfile ant.xml
3.3 ant基本元素
project:
project
元素是一个构建xml文件必不可少的元素,且只能有一个此元素,作为最外层的元素,所有其他的元素标签都必须在其包含范围内。
name
属性:用于指定 project 元素的名称。default
属性:用于指定project
默认执行时所执行的target
的名称。basedir
属性:用于指定基路径的位置。该属性没有指定时,使用Ant
的构件文件的附目录作为基准目录。
target:
target
元素是构建文件执行的基本单位,一个xml文件中可以有多个 target 元素,每一个 target 元素代表一个独立的任务。
name
属性:指定 target 元素的名称,这个属性在一个 project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target。depends
属性:用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以 “.” 间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target ,被依赖的 target 会先执行。if
属性:用于验证指定的属性是存在,若不存在,所在 target 将不会被执行。unless
属性:该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。description
属性:该属性是关于 target 功能的简短描述和说明。
property
property 元素可看作参量或者参数的定义,project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。
Javac:编译
Java: 运行
jar
用来生成一个JAR文件
destfile
表示JAR文件名。basedir
表示被归档的文件名。includes
表示别归档的文件模式。exchudes
表示被排除的文件模式。compress
表示是否压缩。
javac
将 java 程序编译成 class 文件
-
srcdir
表示源程序的目录 -
destdir
表示 classes 文件的输出目录 -
include
表示被编译的文件的模式。 -
classpath
表示所使用的类路径。
java
执行编译生成的.class文件
classname
表示将执行的类名。jar
表示包含该类的JAR文件名。classpath
所表示用到的类路径。
3.4 ant测试
这里结合了JUnit进行helloworld代码的编译测试。
<?xml version="1.0" encoding="UTF-8"?>
<project name="AntDemo" default="junit" basedir=".">
<!-- 变量设置 -->
<!-- 源代码src路径 -->
<property name="src.path" value="src/java"/>
<!-- 编译文件class路径 -->
<property name="build.path" value="build"/>
<!-- 单元测试代码路径 -->
<property name="test.path" value="src/test"/>
<!-- lib包路径 -->
<property name="lib.path" value="lib"/>
<!-- 设置classpath -->
<path id="compile.path">
<fileset dir="${lib.path}">
<include name="**/*.jar"/>
</fileset>
<pathelement path="${build.path}"/>
</path>
<!-- 清除历史编译class -->
<target name="clean" description="clean">
<delete dir="${build.path}"/>
</target>
<!-- 编译测试文件,初始化目录 -->
<target name="compile" description="compile">
<mkdir dir="${build.path}"/>
<javac srcdir="${src.path}" destdir="${build.path}" classpathref="compile.path"/>
<javac srcdir="${test.path}" destdir="${build.path}" classpathref="compile.path"/>
</target>
<!-- 执行测试案例 -->
<target name="junit" depends="clean,compile">
<junit printsummary="true">
<classpath refid="compile.path"/>
<test name="HelloWorldTest"/>
</junit>
</target>
</project>
编写好build.xml
文件后就可以直接运行ant命令。
可以看到每一个target都有对应的测试命令和信息的显示,这里junit就是测试的具体结果。
4. JUnit
4.1 什么是JUnit
JUint是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试。
4.2 JUnit优点
- JUnit 是一个开放的资源框架,用于编写和运行测试。
- 提供注解来识别测试方法。
- 提供断言来测试预期结果。
- JUnit 测试允许你编写代码更快,并能提高质量。
- JUnit 优雅简洁。没那么复杂,花费时间较少。
- JUnit测试可以自动运行并且检查自身结果并提供即时反馈。所以也没有必要人工梳理测试结果的报告。
4.3 JUnit常用注解
@Test:测试注解,标记一个方法可以作为一个测试用例 。
@Before:Before注解表示,该方法必须在类中的每个测试之前执行,以便执行某些必要的先决条件。
@BeforeClass:BeforeClass注解指出这是附着在静态方法必须执行一次并在类的所有测试之前
@After:After注释表示,该方法在每项测试后执行
@AfterClass:当需要执行所有测试在JUnit测试用例类后执行
4.4 常用断言
-
void assertEquals([String message],expected value,actual value)
断言两个值相等。值类型可能是int,short,long,byte,char,Object,第一个参数是一个可选字符串消息
-
void assertTrue([String message],boolean condition)
断言一个条件为真
-
void assertNotNull([String message],java.lang.Object object)
断言一个对象不为空
-
void assertSame([String message],java.lang.Object expected,java.lang.Object actual)
断言两个对象引用相同的对象
-
void assertArrayEquals([String message],expectedArray,resultArray)
断言预期数组和结果数组相等,数组类型可能是int,short,long,byte,char,Object
4.5 Junit测试
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.junit.Before;
import org.junit.Test;
public class HelloWorldTest {
PrintStream os = null;
HelloWorld helloworld;
ByteArrayOutputStream bytes = null;
//测试前初始化
@Before
public void setUp() {
//获得标准输出流
bytes = new ByteArrayOutputStream();
os = System.out;
System.setOut(new PrintStream(bytes));
}
//测试主体
@Test
public void testPrint() {
helloworld = new HelloWorld();
helloworld.print(); //调用函数
String str = new String("Hello, World!\n");
assertEquals(str, bytes.toString()); //判断输出是否一致
}
}