20120414-16杂知识点记录


20120415-17 杂知识点记录

Properties是Hashtable的子类。也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串。是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。
Properties的方法:
Set<String> stringPropertyNames():返回此属性列表中的键集,其中该键及其对应值是字符串。其键或值不是 String 类型的属性被忽略。返回值是此属性列表中的键集,其中该键及其对应值是字符串。该方法是从1.6版本开始的。
void list(PrintStream out):将属性列表输出到指定的输出流。
void list(PrintWriter out:将属性列表输出到指定的输出流。
void load(InputStream inStream):从输入流中读取属性列表(键和元素对)。
void load(Reader reader):按简单的面向行的格式从输入字符流中读取属性列表(键和元素对),这个方法是1.6版开始的。
void store(OutputStream out, String comments):以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
void store(Writer writer, String comments):以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。这个方法也是从1.6版开始的。

在加载配置信息时需要有一定的格式,即”键=值”形式。配置文件中以#开头的行都是注释,加载时不会去加载它。
配置形式诸如:
name=zhangsan
age=24
之类的太简单,如果复杂或者大量的配置信息就不适用,而是应用如下方式(xml):

<persons>
    <person id="001">
        <name>zhangsan</name>
        <age>20</age>
    </person>
    <person id="002">
        <name>lisi</name>
        <age>25</age>
    </person>
</persons>

上述的配置文件格式,用Java自身提供的读取方式很麻烦,网上常用的读取配置文件工具为:dom4j(dom for java)。

Java中的SequenceInputStream
它没有对应的OutputStream,它可以将多个文件封装成流对象,并写入到一个流文件中去。相当于合并文件。比如将多个小说的章节合并成一个小说。这样只要原文件可读,目标文件一定可读。
Java中文件的切割:
按一个指定的大小,将某个文件切割成多个碎片文件。这个时候要注意,即使是文本文件,切割后的文件碎片也不一定是可读的。比如按每个碎片1K字节,切割文件。当某个碎片文件的最后一个字符是个汉子时,即第1024个字节可能只含半个中文字符。这样相当于把一个汉子切割成两个字节,并存储到不同的碎片中。这样,每个碎片文件用txt打开时,显示的内容就不是可读的。所以,切割时,原文件可读,目标碎片不一定可读。

Enumeration获取Vector类中所有元素方式

Vector<E> v = new Vector<E>();
v.add(e1);
v.add(e2);
…
Enumeration<E> en = v.elements();

Vector效率低,所以常用的是ArrayList:

List<E> list = new ArrayList<E>();//或ArrayList<E> list = …
list.add(l1);
list.add(l2);
…
final Iterator<E> it = list.iterator();
//用到匿名内部类时,要对访问的局部变量进行final修饰
//如果非要用到Enumeration的时候(比如传参数),再进行下面操作(匿名内部类):
Enumeration<E> en = new Enumeration<E>()
        {
            public boolean hasMoreElements() //这两个方法必须重载
            {
                return it.hasNext();
            }

            public E nextElement() //返回迭代的下一个元素
            {
                return it.next();
            }
        };


关于父类的疑问:

为什么一个没有父类的Java类会自动从java.lang.Object类继承?如下面是一个普通的Java类:

public class Test    // 实际从Object类继承
{
        public static void main(String[] args) {
        System.out.println(new SuperClassTest().getClass()
                .getGenericSuperclass().toString());
    }
}

运行结果是:class java.lang.Object

从上面的代码可以看出,实际上,Test类的父类就是Object,因此,在Test中可以使用Object类的public或protected资源,如toString方法。那么Java编译器和JVM到底是如何做的呢?
了解这个原因其实并不需要知道JVM的实现细节。只要思考一下对于这种虚拟机程序的原理即可。一般对于这种靠虚拟机运行的语言(如Java、C#等)会有两种方法处理默认继承问题。
1. 在编译源代码时,当遇到没有父类的类时,编译器会将其指定一个默认的父类(一般为Object),而虚拟机在处理到这个类时,由于这个类已经有一个默认的父类了,因此,VM仍然会按着常规的方法来处理每一个类。对于这种情况,从编译后的二进制角度来看,所有的类都会有一个父类。
2. 编译器仍然按着实际代码进行编译,并不会做额外的处理。如果一个类没有显式地继承于其他的类,编译后的代码仍然没有父类。然后由虚拟机运行二进制代码时,当遇到没有父类的类时,就会自动将这个类看成是Object类的子类(一般这类语言的默认父类都是Object)。
从上面两种情况可以看出,第1种情况是在编译器上做的文章,也就是说,当没有父类时,由编译器在编译时自动为其指定一个父类。第2种情况是在虚拟机上做文章,也就是这个默认的父类是由虚拟机来添加的。Java是属于第一种情况。(参考:http://www.blogjava.net/nokiaguy/archive/2008/05/06/198711.html

猜你喜欢

转载自blog.csdn.net/nazhidao/article/details/7468013
今日推荐