- 博客(24)
- 资源 (1)
- 收藏
- 关注
原创 Java调用linux命令及Shell脚本
Java可以通过Runtime.getRuntime().exec()方法调用linux平台下的命令及Shell脚本。获取命令执行结果通常有两种,一种是waitfor方法,另一种是exitValue。但waitfor方法可能造成阻塞,原因如下:当调用exec方法后,JVM启动一个子进程,该进程会与JVM进程建立3个管道连接,即标准输入流、标准输出流、错误错误流。假设该程序不间断向标准输出流和标准错...
2018-06-12 00:11:11 12719 2
原创 关于Normalizer.normalize()方法的用途
在工作中,经常在看到Normalizer.normalize()方法的身影,遂了解了下这个方法的作用。现假设系统对外部输入作校验,如果发现输入中包含"<"或者">"字符,就判定此输入不合法,无法通过校验。但如果输入的是全角形式的字符,判断就会稍微变得麻烦,而且并不方便,一旦有所遗漏,出错之后排查可能会花费较多的时间。// 包含全角尖括号String sbcCase = "\uFe64...
2018-04-13 00:20:43 52506 2
原创 Linux下公私钥登录
开发中ssh远程登录linux主机是很常见的操作,但是常见的登录方式是用户名/密码,缺点就是每次都需要输入密码,如果不小心输错了就很抓狂了,稍显麻烦。另外一种比较常用且安全的免密码登录方式就是私钥登录,目标主机上保存一份公钥,需要登录到该主机上时使用私钥即可登录,可以免去输入密码的麻烦。如果对于公私钥的概念不太清楚,可以看下这篇文章,个人觉得讲得很好 ------【转载】公钥、私钥、数字签...
2018-04-10 23:39:34 5376
原创 JAXB解析与生成XML
使用JAXB可以快速完成Java类到XML的映射,方便XML文件的解析与生成。常用注解@XmlRootElement(name = "Country")将Java类或枚举类型映射成XML中根元素,设置name属性的值可指定义根元素名称,不设置则默认为类型首字母小写的名称。@XmlType(propOrder = {"name", "capital", "population", "foundati...
2018-04-08 23:42:44 4454 1
原创 泛型擦除的简单验证
通过对Java泛型的了解,知道Java泛型在运行时是会被擦除掉的,也就是说泛型的限制只在编译期起作用。下面就用一个简单的例子验证一下,使用反射绕过编译,在运行时往集合中加入不同类型的元素。正常情况下,若限制list中的元素类型为String,再往里面插入整型的元素是会有编译错误的。接下来使用反射,在运行时动态加入其他数据类型。 List<String> list = ne...
2018-04-07 23:15:39 351
原创 VirtualBox安装CentOS联网配置
安装好CentOS虚拟机后,默认是不能连接到互联网的。这里就简单讲下怎么配置联网,其他linux发行版也可以参考此配置。首先,在VirtualBox中设置桥接网卡然后,修改/etc/sysconfig/network-scripts/ifcfg-enp0s3配置文件,将ONBOOT修改为yes,保存修改后使用service network restart命令重启网络生效。、注意: 修改配置文件的时...
2018-02-09 22:59:39 2381
原创 基础Socket通信
本文使用三个类完成客户端与服务端的 Socket 通信。 Client:客户端,可完成信息收发 Server:服务端,监听客户端请求,为了方便,也可以收发信息 MessageHandleRunnable:实际收发信息的 Runnable 类 import java.io.IOException;import java.net.ServerSocket;impor...
2016-11-30 21:11:40 421
原创 JVM、JRE与JDK的关系
最开始学 Java 的时候不是很在意这些比较基础的东西,只是知道怎么使用。现在学得有些日子了,虽然也不是很清楚底层的具体实现,但是对于整个体系的搭建大致有了一些了解。最近由于找到工作了比较松懈,而且也在考驾照,所以有些日子没好好写代码了。今天一时想起,把之前的笔记整理了一下,顺便加深下自己的印象。JDK、JRE、JVM这三者的英文解释如下:JDK---Java Developmen
2015-12-22 21:46:29 644
原创 Java 实现单向链表
Java 类库中其实是提供了链表的实现类的,但是如果自己来实现会不会很有成就感呢?我们知道,Java 官方是没有指针的概念的,当然我们可以把对象的引用理解为指针,虽然与 C 或 C++ 中的指针概念不尽相同。既然如此,最重要的一步就是怎么来表示一个链表中的结点。在 Java中,我们可以定义一个专门表示结点的类,最好是内部类,确保类的封装性与完整性。此结点类可定义如下:class Node
2015-09-27 17:04:12 595
原创 字符串的“压缩”
这题本是前几天笔试时的一道题,当时思路不是很清晰,写得不是很对。后来仔细想想理清思路之后重新写了一下,经过多组输入的测试,还未发现明显的bug。这题的要求大致是这样的:任意输入一个字符串,比如 wwwabc,要求将连续出现的字符进行压缩,压缩后所得字符串应该为 3wabc;又例如abcdddefg,压缩后的字符串应该为 abc3defg。代码如下所示:import java.util.
2015-09-19 10:48:40 516
原创 使用BigDecimal进行精确数字运算
我们都知道在 Java 中常用的浮点数类型有 float 和 double 这两种,但是其实这两种类型的数据并无法精确表示运算结果。先看一个例子:public class PrecisionTest { public static void main(String[] args) { System.out.println(0.03 * 0.045); System.out.println...
2015-09-14 21:19:08 558
原创 有一个数组,每隔两个数删掉一个数,到末尾又循环到开头继续进行,求最后一个被删除的数的原始下标位置
源代码中有较详细的注释,这里就不多写了。/** * 有一个数组a[N],要求每隔两个数删掉一个数,到末尾则又循环到开头继续进行 * 求最后一个被删掉的数的原始下标位置 * * 例如,一个数组:{0, 1, 2, 3, 4, 5, 6, 7} * 0->1->2(第一遍,删除)->3->4->5(第一遍,删除)->6->7-> * ...
2015-09-11 11:57:20 9975 3
原创 文件复制实现
package study;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.UnsupportedEncoding
2015-07-22 22:24:38 388
原创 使用 Jpcap 进行 ARP 抓包
由于选修课网络协议分析的期末作业是关于网络协议方面的,而之前并没有使用 Java 进行过网络协议底层的编程经历,所以显得有些麻烦。Java 不能直接操作底层的网络协议,所以必须依靠 JNI 使用本地操作系统的 Socket 部分接口,而刚好可以通过 Jpcap 这个中间件中封装好的方法来调用 Winpcap 进行抓包并解析,所以在 Jpcap + Winpcap 环境下进行抓包分析。环境搭
2015-06-14 21:10:27 3760 1
原创 解决Eclipse中“诡异”的错误:找不到或无法加载主类……
近两天在用Eclipse写代码的时候突发奇想,把所有生成的 .class 文件统统删掉,以为只要重新运行就可以重新生成新的 class 文件,哪知道出问题了,控制台提示->错误:找不到或无法加载主类……。自己忙活了好久,也没有有效的解决方法。后来在网上找了找,终于发现了真正的原因。原来,Eclipse 中的 Java 编译器是基于 .java 文件的新旧来判断是否进行编译。也就是说,一个 .j
2015-06-03 20:19:29 33118 7
原创 Java参数传递
既然说到参数传递,那么就得说说 Java 中方法参数的类型。Java 中方法参数的类型有两种:基本数据类型(数字,布尔值)对象引用那么,参数传递的方法呢,也可以分为两种,一种是值传递,表示方法接收的是调用者提供的值;另一种就是引用传递,表示方法接收的是调用者提供的变量地址。Java 中的参数传递采用的是值传递的方式,也就是说方法得到的是所有参数值的一个拷贝。对于基本数据类型而言
2015-05-27 15:37:21 429
原创 归并排序
归并排序(Merging Sort)归并排序是分治思想最典型的例子。归并排序中最基本的操作是“归并”,即将两个或两个以上的有序数组组合成一个更大的有序数组。按照归并顺序的不同,归并排序可以分为自顶向下和自底向上两类。基本思想:要将一个数组排序,可以先(递归地)将它拆分成两半分别排序,然后将结果归并起来。或者先归并微型数组,然后再成对归并得到的子数组,直到最后整个数组归并在一起。我们
2015-05-23 19:18:55 524
原创 希尔排序
希尔排序(Shell‘s Sort)又称“缩小增量排序”(Diminishing Increment Sort),是一种基于插入排序的快速的排序算法。对于大规模的乱序数组插入排序很慢,因为它只会交换相邻的元素。如果最小的元素正好在数组的尽头,要将它插入到正确的位置就得进行 N - 1次移动。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部排序,并最终使用插入排序将局部有序的
2015-05-22 10:10:05 478
原创 选择排序之简单选择排序
选择排序的基本思想:首先,找到数组中最小的哪个元素,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素,那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。重复前面的步骤,直到整个数组有序。说到这儿,还得提到冒泡排序。选择排序其实算得上是冒泡排序的一个升级版。它们之间最主要的区别是:冒泡排序每一次比较都可能交换,而选择排序则是在每次比较时,记录最小
2015-05-20 20:47:56 590
原创 快速排序
快速排序的基本思想:任意选择一数作为个基准数,通过一趟排序将要排序的数据分割成两个独立的部分。其中一部分所有数都小于基准数,位于其左侧,另一部分所有数都大于基准数,位于其右侧。然后按照同样的方法对分别对两部分数据进行排序,直到最后所有数据都变得有序。基准数可以任意选取。假设现在有这样一个初始序列:首先,我们选取第一个数 5 作为基准数,并在开头和结尾分安插上一个哨兵 l 和
2015-05-19 17:12:18 632
原创 直接插入排序
插入排序的基本思想:先把要排序的数组分成两部分,第一部分只包含第一个元素,天然有序,而第二部分则包含了数组中除开第一个元素的剩余所有元素。依次将第二部分中的每一个元素插入到已经有序的第一部分中,并且仍保持第一部分有序。每次插入一个元素,有序部分将增加一个元素。重复此过程,直到最后有序部分包含所有元素。当然,有序部分也可以是最后一个元素。好了,话不多说,上图。初始数组如下:
2015-05-17 19:18:43 516
原创 冒泡排序
package algorithmAndDesignPatterns;import java.util.Random;/** * 优化后的冒泡排序 * @author Wll * */public class BubbleSortTest { public static void main(String[] args) { int[] arr = getRandomArra
2015-05-11 17:36:02 470
原创 关于javac与java命令的使用
自学Java差不多快一年了,很少写博客,有时候想写但是感觉所学只是皮毛便又作罢,这里就当是献丑了。对于一开始就使用Eclipse这类的集成开发工具进行编程的同学来说,在DOS下编译和运行java程序是不太熟悉的,而这又是运行Java程序的很基础的命令,了解一下还是有好处的。下面就是以前写的总结经过修改过后的模样:【java命令对大小写敏感。而javac命令不区分大小写,但它后缀必须为小
2015-04-02 20:19:17 851
原创 统计一篇英文文章中出现次数最多的10个单词
import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.Comparat
2014-10-12 00:19:09 5166
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人