Java基础知识之系统命令调用、序列化、JDO、匿名内部类
1. JAVA调用系统命令或可执行程序
// String cmd = "F:\\apache-tomcat-6.0.20.exe";
// String cmd = "D:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE F:\\test.doc";
// String cmd = "cmd.exe /c start F:\\test.doc";
String cmd = "ping www.baidu.com";
Runtime run = Runtime.getRuntime();//返回与当前 Java 应用程序相关的运行时对象
try {
Process p = run.exec(cmd);// 启动另一个进程来执行命令
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBr.readLine()) != null)
//获得命令执行后在控制台的输出信息
System.out.println(lineStr);// 打印输出信息
//检查命令是否执行失败。
if (p.waitFor() != 0) {
if (p.exitValue() == 1)//p.exitValue()==0表示正常结束,1:非正常结束
System.err.println("命令执行失败!");
}
inBr.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
2.Java序列化(串行化)
是Java建立的一种传输机制,它能够把对象的信息转换成一系列的字节码,这些字节码可以被传输到网络或者存储到一个文件中。序列化的使用非常简单,但他还是有限制的。它必须立即存取对象的特征,而且它不适合存取大批量的数据。在更改一个对象的属性时如果有错误发生它无法实现“回滚”,因此不适于应用程序对数据完整性的要求,而且不能实现多个线程或程序异步读写数据。所有这些不足都使得序列化无法满足大多数数据存储要求。
1)串行化能保存的元素
串行化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。 a.永久性保存对象,保存对象的字节序列到本地文件中;b.通过序列化对象在网络中传递对象;c.通过序列化在进程间传递对象。
2)串行化:需要将对象的状态保存下来,在需要时再将对象恢复。接口Serialization用来作为实现对象串行化的工具 ,只有实现了Serialization的类的对象才可以被串行化。
3)transient关键字
对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的。例如一个Thread对象或一个FileInputStream对象 ,对于这些字段,我们必须用transient关键字标明,否则编译器将报措。
另外 ,串行化可能涉及将对象存放到 磁盘上或在网络上发达数据,这时候就会产生安全问题。因为数据位于Java运行环境之外,不在Java安全机制的控制之中。对于这些需要保密的字段,不应保存在永久介质中 ,或者不应简单地不加处理地保存下来 ,为了保证安全性。应该在这些字段前加上transient关键字。
4)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
5) a. 在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。b. Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。c. Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
3.JDO
JDO 是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API.JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用).这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上.另外,JDO很灵活,因为它可以在任何数据底层上运行.JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强.
JDO:JDO集成了很多上述持久性机制的特性,这使得在JDO中创建一个持久化(persistence)类就像创建一个序列化类一样简单。JDO支持批量数据的存储,数据一致性,并发处理和JDBC的查询功能。就像对象-关系映射软件和对象数据库一样,它允许使用面向对象的高级特性比如“继承”。它避免了像EJB中实体Bean一样必须依赖于来自厂商定义的严格规范。同EJB一样,JDO也不规定任何特定的后端数据库。但是,这里还是要说一下,世界上没有“万灵丹”。所以,使用JDO并不是对于每一个应用程序都是有好处的。很多应用程序完全可以使用其他更理想的存储机制。
4. 内部类、匿名内部类
1.内部类基本理论:
关于JAVA内部类:一个内部类的定义是定义在另一个类内部的类。存在它的原因是:
1)一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。
2)对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。
2. 匿名内部类
案例:
public class MyMain {
public static void main(String args[]) {
new Out(){
void show(){
System.out.println("this is Anonymous InterClass showing.");
}
}.show();
new MyInter(){
public void print(){
System.out.println("this is myInter showing.");
}
}.print();
}
}
class Out{
void show(){
System.out.println("this is Out showing.");
}
}
interface MyInter{
void print();
}
匿名内部类就是没有名字的内部类。 注意:
1)匿名内部类不能有构造函数
2)匿名内部类不能定义任何静态成员、方法和类
3)匿名内部类不能是public、protected、private、static
4)只能创建匿名内部类的一个实例
5)一个匿名内部类用其隐含实现一个接口或实现一个类。
6)因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效
--------------------------------------------------------------------
PS: 欢迎关注公众号"Devin说",会不定期更新Java相关技术知识。
--------------------------------------------------------------------