之前有个很诡异的问题,就是更新JAR压缩包中的class文件,会出现JAR文件本身的Last Modification Time保持不变的情况。这个问题到现在都没有找出原因,后来只能通过touch来人为修改。所以也顺便学习了一下touch的其他用法。 修改为指定的时间 假设有个file1的文件,它的时间信息显示为: $ stat file1 File: ‘file1’ Siz...
Java 7开始有一个有意思的功能,就是结合了自动关闭资源和异常处理的try-with-resources语句。按照旧式的处理方式,关闭资源一般放在try-catch的finally块中,需要显式地关闭。比如关闭文件句柄、数据库中的连接、语句和记录集等。而try-with-resources不需要显式声明关闭,它会自动调用close()方法,防止程序员忘记关闭资源而引起内存可能的泄漏。因此这...
仔细研究(类与成员变量的初始化),可以解释很多疑问。这里顺便分析一下Java界一直存在的疑惑。 为什么对super的调用必须是当前类构造器函数中的第一个语句? 先说明一下JLS语言规范对super调用的规则 如果父类存在默认构造函数(就是无参构造函数),子类的构造函数中,Java会隐式地在第一行语句前填入 super(); 用户也可以显式地调用 super(); 且必须保...
之前研究过变量(类变量与实例变量的内存存储),顺便这次分析一下类变量的初始化问题,也能从另外一个角度来证明类变量的内存分配的共享性质。 假设我定义一个ClassA,含有一个实例变量s,一个默认构造函数(无参构造器),一个有参构造函数,还有一个实例方法check(String)。 public class ClassA { String s; public ClassA(){ s ...
在Oracle Agile的代码中有一段非常不好的设计,就是关闭FTP连接释放socket资源的过程被定义在封装类的finalize()方法中。比如下面的代码。 private void disconnect() throws IOException { // Disconnect from FTP site if (this.m_connected) { this.m...
变量有类变量、实例变量和局部变量。局部变量比较好区别。类变量与实例变量的区别就在于前者在类中被定义时有static修饰符。 类变量属于类级别,因此在多个线程中引用时是共享的,因此只存在于一个内存区域。而实例变量仅仅属于类定义的具体实例,多个实例之间不共享实例变量,因此他们使用不同的内存地址。 这里就出现了一个问题。实例都是类的具体定义,都是保存在heap堆中,因为堆都是保存具体的对象,所以...
创建String变量的时候,对象的产生和内存分配会因为创建方式不同而有显著的差别。 直接赋值 String a1 = "hello"; String a2 = "hello"; String a3 = "hello"; System.out.println("a1=a2?" + (a1==a2)); System.out.println("a1=a3?" + (a1==a3)); 创...
Tomcat如果以命令行的方式启动,JVM以及程序参数的设置非常简单,只要修改命令文件中的参数就可以了。偶尔接触到Tomcat在Windows上以Service的形式启动,找到JVM设置的位置,花了不少的冤枉时间,因为Tomcat文档几乎没有提到。 JVM以及程序参数 Tomcat被注册为Service之后,相应的所有启动参数全部写到注册表中,具体的路径就是: HKEY_LOCAL_M...
前面提到了Java推荐的串行化ObjectInputStream/ObjectOutputStream 缺点比较明显(生成的数据大;人和其他语言无法阅读),所以已经不再适用了。相反的,JSON或者XML格式处理串行化已经是主流,优点自然显而易见: 数据小,快速传输 人能直接阅读,各语言都能解析 可以构造字符串,反串行化生成实例对象 这里举个Google的开源Gson,用于...
PipedInputStream和PipedOutputStream通过pipe使得同一个JVM进程中的不同线程下的两个输入输出流可以交换数据。Pipe流设计时有下面的限制。 输入流不能比输出流先关闭 输入流必须完整无缺地读到全部的输出流数据,不能只读一部分 输出流和输出流必须显式地调用close()关闭 PipedInputStream的读处于阻塞状态,即等待Piped...