一、vi学习
vi是什么
vi(Visual Interface的缩写,即可视化接口)编辑器是Unix及Linux系统下标准的编辑器,vim是vi的增强版,具有语法着色功能。
vi的工作模式
命令模式
刚进入vim的时候,默认就是命令模式,在其他模式下通过按ESC键也可进入该模式。该模式可以用于移动光标、删除字、进行复制粘贴等操作。在命令行下输入字母是没有任何显示的,一般是直接按功能键执行命令。
编辑模式
在命令模式下可通过按i、o、a等键进入编辑模式。在编辑模式下,用户输入的任何字符都会录入文件中。可用ESC键回到命令模式。
末行模式
在命令模式下,用户输入“:”即可进入末行模式,此时Vi会在显示窗口的最后一行显示一个“:”作为末行模式的提示符,等待用户输入命令。
如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。
vi的打开、关闭及编辑
一般通过vim后跟文件路径及文件名来打开。如果文件存在,则打开编辑文件窗口,如果文件不存在,则创建文件并打开。
在末行模式输入w保存,输入q退出,或直接输入wq或x以保存退出。q!命令可以强制退出,具有管理员权限的话可以通过w!强制保存。
至于编辑的话,常用的命令如下:
-
进入编辑模式
i和I: i在光标前插入,I在行首插入
a和A: a在光标后插入,A在行末插入
o和O: o在光标所在行下一行插入,O在光标所在行上一行插入
-
移动光标
- 逐字符移动
h:光标向左移动, j:光标向下移动,k:光标向上移动, l:光标向右移动
H、M、L:光标移动到到可见屏幕第一行(H)、中间行(M)、最后一行(L)
- 大幅移动
^:移动到行, $:移动到行末, G:文档最后一行, gg:文档第一行
-
删除内容
X和x:x删除光标后一个字符,X删除光标前一个字符,包含光标位置字符
dd和 n dd:dd删除所在行,n dd删除指定行数
d0和D:d0删除光标前本行所有内容,D删除光标后本行所有内容,包含光标位置字符
- 其他快捷功能
u:撤销
ctrl + r:重做
.:重复执行上一次操作的命令
yy:复制当前行
p: 在光标所在位置向下新开一行粘贴
v 和 V:v选择单个字符,V选择整行
<<和>>:选择文本之后,向左缩进,向右缩进
以上便是我认为在这次学习过程中可能会高频使用的vim命令。
二、JAVA语言学习
Java是一门面向对象编程语言,具有很多C++和C#的特征,不少语句和C++大同小异,还没有恼人的指针,因此上手不算难事。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,可以用于编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。
Java还有一点比较好的就是一次编译就能在多个平台上运行,原因是代码与机器之间有一个虚拟机JVM,
它屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。但这也对Java的运行速度稍有影响。
编写Helloworld
以一个helloworld.java程序来开启Java的入门:
public class helloworld{
static public String str;
public String GetStr(){
return str;
}
public helloworld(){
str = "Hello World!";
}
public static void main(String[] args) {
helloworld hape = new helloworld();
System.out.println(hape.GetStr());
}
}
输入如下命令,编译并运行:
javac helloworld.java
java helloworld
编译是编译成功了,但却提示"Could not find or load main class helloworld",一找原因才知道是没有配置JDK的环境。
由于没有权限,所以只能使用vi ~/.profile来编辑profile。
使用如下命令配置环境变量:
export JAVA_HOME=/home/administrator/Desktop/java1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
完成后使用source ~/.profile使改动生效。再输入java helloworld便能如预期输出hello world了。

编写计算器小程序
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Calculator extends JFrame{
private JLabel op1 = new JLabel("+",JTextField.CENTER);
private JLabel op2 = new JLabel("=",JTextField.CENTER);
private JLabel res = new JLabel("",JTextField.CENTER);
private JTextField num1 = new JTextField("12");
private JTextField num2 = new JTextField("2");
public Calculator(){
JFrame frame = new JFrame("Calculator");
frame.setSize(400, 200);
frame.setLayout(new GridLayout(2, 5));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
num1.setHorizontalAlignment(JTextField.CENTER);
num2.setHorizontalAlignment(JTextField.CENTER);
frame.add(num1);
frame.add(op1);
frame.add(num2);
frame.add(op2);
frame.add(res);
JButton button1 = new JButton("+");
frame.add(button1);
JButton button2 = new JButton("-");
frame.add(button2);
JButton button3 = new JButton("*");
frame.add(button3);
JButton button4 = new JButton("/");
frame.add(button4);
JButton button5 = new JButton("OK");
frame.add(button5);
button1.addActionListener(new NormalButt());
button2.addActionListener(new NormalButt());
button3.addActionListener(new NormalButt());
button4.addActionListener(new NormalButt());
button5.addActionListener(new SpecialButt());
frame.setVisible(true);
}
private class NormalButt implements ActionListener{
public void actionPerformed(ActionEvent e){
JButton axe = (JButton)e.getSource();
String str = axe.getText();
op1.setText(str);
}
}
public boolean isNum(String str){
return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
}
private class SpecialButt implements ActionListener{
public void actionPerformed(ActionEvent e){
if(!isNum(num1.getText()) || !isNum(num2.getText())){
res.setText("Invalid Input!");
}else{
double number1 = Double.valueOf(num1.getText());
double number2 = Double.valueOf(num2.getText());
if(op1.getText().equals("+")){
res.setText(number1 + number2 + "");
}
else if(op1.getText().equals("-")){
res.setText(number1 - number2 + "");
}
else if(op1.getText().equals("*")){
res.setText(number1 * number2 + "");
}
else if(op1.getText().equals("/")){
res.setText(number1 / number2 + "");
}
}
}
}
public static void main(String[] args){
Calculator begin = new Calculator();
}
}
运行结果:

感觉java编出来的图形界面和古早的小程序很像,莫名有种获得感(雾)。GridLayout是个好东西,免去了绞尽脑汁计算间距大小的头疼。程序里对于是否浮点数的处理还有点问题,挨个添加按钮的行为也有点低效,往后有时间再琢磨琢磨吧。
三、Ant学习
Ant是什么
Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能,大致相当于以往在写C和C++时用过的makefile,但是上手感觉比makefile更为友好。
Ant的构建文件是基于XML编写的,默认名称为build.xml。
Ant的基本元素
- project元素
project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个project元素,否则会发生错误。在每个project元素下,可包含多个target元素。project含有以下属性:
name属性:用于指定project元素的名称。
default属性:用于指定project默认执行时所执行的target的名称。
basedir属性:用于指定基路径的位置。该属性没有指定时,使用Ant的构件文件的附目录作为基准目录。
- target元素
target元素是Ant的基本执行单元,它可以包含一个或多个具体的任务。多个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之外设定。
使用Ant实现helloworld的自动编译
我为helloworld.java编写的build.xml如下:
<project name = "helloworld" default = "run" basedir = ".">
<property name = "src" location = "src"/>
<property name = "build" location = "build"/>
<target name = "clean">
<delete dir = "build"/>
</target>
<target name = "init">
<mkdir dir = "build"/>
</target>
<target name = "complie" depends = "init" >
<javac srcdir = "src" destdir = "build"/>
</target>
<target name = "run" depends = "compile">
<java classname = "helloworld" classpath = "build" />
</target>
</project>
Ant语句中尖括号<>的使用要当心,我总是忘记匹配好开头和结尾,在ant的时候没少报错。此外一条语句完成一个任务时,结尾要记得加"/"。
运行ant的结果如下:

四、Junit学习
Junit是Java的单元测试框架,用于编写和运行可重复的自动化测试,可以自动运行并且检查自身结果并提供即时反馈。使用Junit不需要创建 main()方法,且是白盒测试。
JUnit注解
JUnit使用注解标注为测试方法并配置它们。
@Test:测试注解,标记一个方法可以作为一个测试用例。
@Before:在每次测试之前执行,一般用于准备测试环境(初始化类等)。
@BeforeClass:在所有测试之前,执行一次。使用该注解标记的方法需要定义为static void。
@After:在每项测试后执行,可用于清理测试环境 (例如删除临时数据,还原默认值等)。
@AfterClass:在所有的测试执行完成之后执行一次。使用该注解标记的方法需要定义为static void。
@Test (expected = Exception.class):如果这个测试方法不抛出赋值的异常(Exception.class)将会失败。
Junit断言
JUnit提供静态方法,通过Assert类来测试某些条件。这些断言语句通常以assert开头,允许你指定错误信息、预期结果和实际结果。断言方法将测试返回的实际值和预期值相比较。如果比较失败就会抛出AssertionException异常。
都说会被高频使用的断言:
void assertTrue([String message],boolean condition)
断言一个条件为真
void assertFalse([String message],boolean condition)
断言一个条件为假
void assertEquals([String message],expected value,actual value)
断言两个值相等。expected和actual类型可以是int,short,long,byte,char,Object,第一个参数是一个可选字符串消息
void assertNull([String message],java.lang.Object object)
断言一个对象为空
void assertNotNull([String message],java.lang.Object object)
断言一个对象不为空
void assertSame([String message],java.lang.Object expected,java.lang.Object actual)
断言expected和actual是同一个对象
void assertArrayEquals([String message],expectedArray, resultArray)
断言两个数组内容相同,数组类型可以是int,short,long,byte,char等。
利用Ant、Junit测试通过HelloWorld
先写一个测试的java文helloworldTest.java:
import static org.junit.Assert.*;
import org.junit.Test;
public class helloworldTest
{
public helloworld hola = new helloworld();
@Test
public void testHello()
{
assertEquals("Hello World!", hola.GetStr());
}
}
用如下命令编译并运行之,得到测试结果:
javac helloworldTest.java
java org.junit.runner.JUnitCore helloworldTest

附上此时profile中已经配置的环境变量:

Ant和Junit结合在一块,整出新的build.xml。为了看起来更有层次感一点,增加了一些文件夹的设置。P.S.云桌面上的junit.jar有猫饼,使用它就愣是报错,于是我换成了另一个junit-4.10.jar,药到病除。
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "helloworld" default = "run">
<property name = "build.classes.dir" location = "build/classes"/>
<property name = "src.dir" location = "src" />
<property name = "lib.dir" location = "lib" />
<path id = "compile.path">
<pathelement location = "${lib.dir}/junit-4.10.jar" />
</path>
<target name = "reset">
<delete dir = "${build.classes.dir}" />
<mkdir dir = "${build.classes.dir}"/>
</target>
<target name = "compile">
<javac srcdir = "${src.dir}" destdir = "${build.classes.dir}" classpathref = "compile.path" includeantruntime = "true">
</javac>
</target>
<target name = "run" depends = "reset, compile">
<java fork = "true" classname = "helloworld">
<classpath path = "${build.classes.dir}" />
</java>
</target>
<target name = "test">
<junit printsummary = "true">
<classpath path = "${build.classes.dir}">
<path refid = "compile.path" />
</classpath>
<test name = "helloworldTest" />
</junit>
</target>
</project>
完成之后,ant命令仍然是可以编译运行helloworld.java,而使用ant test命令便能实现Junit的测试。测试结果如下:

至此,对于Vi,Java,Ant和Junit的学习暂时先告一段落。
这篇博客详细介绍了vi编辑器的三种工作模式、使用技巧,接着讲述了Java语言的基础概念、编写HelloWorld及计算器程序。然后,文章探讨了Ant构建工具的原理与使用,并展示了如何通过Ant编译Java程序。最后,博主分享了Junit单元测试框架的学习,包括其注解和断言,并演示了如何结合Ant进行测试。
317

被折叠的 条评论
为什么被折叠?



