技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

深入浅出Java访问者模式(1)

一、引子对于系统中一个已经完成的类层次结构,我们已经给它提供了满足需求的接口。但是面对新增加的需求,我们应该怎么做呢?如果这是为数不多的几次变动,而且你不用为了一个需求的调整而将整个类层次结构统统地修改一遍,那么直接在原有类层次结构上修改也许是个不错的主意。... 全文

java 设计模式 访问者模式 java设计模式

Java编程那些事儿10——Java语言简介

         Java语言现在是编程领域主流的开发语言之一,在这里就简单的介绍一下和Java语言相关的一些知识。1.5.1 Java语言历史         1991年,美国的SUN(太阳微系统)公司为了在消费类电子设备(现在称作智能家电)方面进行前沿研究,建立了以James Gosling领导的Green小组进行软件方面的研究,该小组一开始选择当时已经很成熟的C++语言进行设计和开发,但是却发现执行C++程序需要很多的设备内存,这样将增加硬件的成本,不利于市场竞争,所以该小组在C++语言的基础上,创建了一种新的语言,由于该小组的领导很喜欢自己办公室窗外的一棵橡树,所以把该语言的名字叫做Oak,中文意思是橡树,这就是Java语言的前身。... 全文

java 编程 语言 sun jdk 虚拟机

Java 7之基础类型第1篇

一、数据类型Java主要有如下几种数据类型1.整数类型    1) 在Java中,整数类型共有4种,它们有固定的表述范围和字段长度,且不受具体的操作系统的影响,保证了Java的跨平台性    2) Java语言中,整数有三种表现形式,分别是:     a. 十进制整数,如 120, -31, 0     b. 八进制整数,要求以0开头(注意这是数字0,不是字母o),如:012,     c. 十六进制整数,要求以0x开头(注意这是数字0,不是字母o),如: 0x12    3) Java语言中,默认的整数类型是int类型,声明long类型的时候,后面必须要加个l或者L    4) Java中四种整数类型的表述范围:... 全文

java的基本数据类型 基本类型 类型详解 Java类型

Java EE开发四大常用框架(1)

我们对Java EE的框架有过很多介绍, 本文将对Java EE中常用的四个框架做一下系统的归纳,希望大家喜欢。Struts Struts是一个基于Sun Java EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。Struts框架可分为以下四个主要部分,其中三个就和MVC模式紧密相关:... 全文

Swing Hibernate Struts Spring Java EE框架 Java EE

Java程序员从底层到CTO的技术路线图

首先,附一张图片展示所在各个阶段的工作职能:其次,文字型描述所在各个阶段的工作职能:Java程序员高级特性反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。核心编程IO、多线程、实体类、集合类、正则表达式、XML和属性文件、图形编程AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace。网络编程Applet、Socket/TCP/UDP、NIO、RMI、CORBA。Java语法基础类、抽象类、接口、最终类、静态类、匿名类、内部类、异常类、编码规范。Java开发环境JDK、JVM、Eclipse、Linux。Java核心编程技术... 全文

java 程序员 cto 技术 java设计模式

JAVA教程 第四讲 Java的例外处理和I/O流

4.1 什么是例外  例外就是在程序的运行过程中所发生的异常事件,它中断指令的正常执行。Java中提供了一种独特的处理例外的机制,通过例外来处理程序设计中出现的错误。4.1.1 例外示例【例4-1】     import java.io.*;     class ExceptionDemo1{      public static void main( String args[ ] ){       FileInputStream fis = new FileInputStream( "text" );       int b;       while( (b=fis.read())!=-1 ){        System.out.print( b );       }       fis.close( );      }     }    查看编译结果【例4-2】     class ExceptionDemo2{      public static void main( String args[ ] ){       int a = 0;       System.out.println( 5/a );      }     }    运行结果C:\>javac ExceptionDemo2.javaC:\>java ExceptionDemo2  java.lang.ArithmeticException: / by zero at  ExceptionDemo2.main(ExceptionDemo2.java:4)  因为除数不能为0,所以在程序运行的时候出现了除0溢出的异常事件。为什么有的例外在编译时出现,而有的例外是在运行时出现的?让我们继续学习java 的例外处理机制。 4.1.2 例外处理机制  抛弃(throw)例外:  在Java程序的执行过程中,如果出现了异常事件,就会生成一个例外对象。生成的例外对象将传递给Java运行时系统,这一例外的产生和提交过程称为抛弃(throw)例外 两种处理例外的机制:  ◇ 捕获例外:  当Java运行时系统得到一个例外对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一例外的代码。找到能够处理这种类型的例外的方法后,运行时系统把当前例外对象交给这个方法进行处理,这一过程称为捕获(catch)例外。这是积极的例外处理机制。如果Java运行时系统找不到可以捕获例外的方法,则运行时系统将终止,相应的Java程序也将退出。  ◇ 声明抛弃例外:  如果一个方法并不知道如何处理所出现的例外,则可在方法声明时,声明抛弃(throws)例外。这是一种消极的例外处理机制。4.1.3 例外类的层次  在jdk中,每个包中都定义了例外类,而所有的例外类都直接或间接地继承于Throwable类。图4-1为jdk中例外类的继承关系。  java中的例外类可分为两大类:  Error   动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类例外,也不会抛弃这种例外。  Exception    1)运行时例外:   继承于RuntimeException的类都属于运行时例外,例如算术例外(除零错)、数组下标越界例外等等。由于这些例外产生的位置是未知的,Java 编译器允许程序员在程序中不对它们做出处理。   2)非运行时例外:   除了运行时例外之外的其他由Exception 继承来的例外类都是非运行时的例外,例如FileNotFoundException(文件未找到例外)。Java编译器要求在程序中必须处理这种例外,捕获例外或者声明抛弃例外。4.2 例外的处理  java语言中有两种例外处理机制:捕获例外和声明抛弃例外。下面我们做详细介绍。4.2.1 捕获例外  捕获例外是通过try-catch-finally语句实现的。  try{  ......   }catch( ExceptionName1 e ){   ......   }catch( ExceptionName2 e ){   ......   }   ......   }finally{   ......  }  ◇ try  捕获例外的第一步是用try{…}选定捕获例外的范围,由try所限定的代码块中的语句在执行过程中可能会生成例外对象并抛弃。  ◇ catch  每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的例外事件。catch语句只需要一个形式参数指明它所能够捕获的例外类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的例外对象传递给catch块。  在catch块中是对例外对象进行处理的代码,与访问其它对象一样,可以访问一个例外对象的变量或调用它的方法。getMessage( )是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。例如:  try{    ......   }catch( FileNotFoundException e ){    System.out.println( e );    System.out.println( "message: "+e.getMessage() );    e.printStackTrace( System.out );   }catch( IOException e ){    System.out.println( e );   }  catch 语句的顺序:  捕获例外的顺序和catch语句的顺序有关,当捕获到一个例外时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的例外,然后再逐渐一般化。也就是一般先安排子类,再安排父类。  ◇ finally  捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。4.2.2 声明抛弃例外 1.声明抛弃例外  如果在一个方法中生成了一个例外,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃例外,使得例外对象可以从调用栈向后传播,直到有合适的方法捕获它为止。  声明抛弃例外是在一个方法声明中的throws子句中指明的。例如:  public int read () throws IOException{        ......  }  throws子句中同时可以指明多个例外,之间由逗号隔开。例如:   public static void main(String args[]) throws   IOException,IndexOutOfBoundsException {…} 2.抛出例外  抛出例外就是产生例外对象的过程,首先要生成例外对象,例外或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出例外对象是通过throw语句实现的。  例如:  IOException e=new IOException();  throw e ;  可以抛出的例外必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:  throw new String("want to throw");4.3 自定义例外类的使用  自定义例外类必须是Throwable的直接或间接子类。  注意:一个方法所声明抛弃的例外是作为这个方法与外界交互的一部分而存在的。所以,方法的调用者必须了解这些例外,并确定如何正确的处理他们。4.4 I/O 流概述  输入/输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。  Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。  Jdk 提供了包java.io,其中包括一系列的类来实现输入/输出处理。下面我们对java.io包的内容进行概要的介绍。4.4.1 I/O流的层次  1.字节流:  从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。  ◇ InputStream、OutputStream  ◇ FileInputStream、FileOutputStream  ◇ PipedInputStream、PipedOutputStream  ◇ ByteArrayInputStream、ByteArrayOutputStream  ◇ FilterInputStream、FilterOutputStream  ◇ DataInputStream、DataOutputStream  ◇ BufferedInputStream、BufferedOutputStream 2.字符流:  从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。  ◇ Reader、Writer  ◇ InputStreamReader、OutputStreamWriter  ◇ FileReader、FileWriter  ◇ CharArrayReader、CharArrayWriter  ◇ PipedReader、PipedWriter  ◇ FilterReader、FilterWriter  ◇ BufferedReader、BufferedWriter  ◇ StringReader、StringWriter 3.对象流  ◇ ObjectInputStream、ObjectOutputStream 4.其它  ◇ 文件处理:  File、RandomAccessFile;  ◇ 接口  DataInput、DataOutput、ObjectInput、ObjectOutput;4.4.2 InputStream 和OutputStream 1.InputStream  ◇ 从流中读取数据:  int read( ); //读取一个字节,返回值为所读的字节  int read( byte b[ ] ); //读取多个字节,放置到字节数组b中,通常              //读取的字节数量为b的长度,返回值为实际              //读取的字节的数量  int read( byte b[ ], int off, int len ); //读取len个字节,放置                       //到以下标off开始字节                       //数组b中,返回值为实                       //际读取的字节的数量  int available( );   //返回值为流中尚未读取的字节的数量  long skip( long n ); //读指针跳过n个字节不读,返回值为实际             //跳过的字节数量  ◇ 关闭流:  close( ); //流操作完毕后必须关闭    ◇ 使用输入流中的标记:  void mark( int readlimit ); //记录当前读指针所在位置,readlimit                 //表示读指针读出readlimit个字节后                //所标记的指针位置才失效  void reset( );     //把读指针重新指向用mark方法所记录的位置  boolean markSupported( ); //当前的流是否支持读指针的记录功能  有关每个方法的使用,详见java API。 2.OutputStream  ◇ 输出数据:  void write( int b );   //往流中写一个字节b  void write( byte b[ ] ); //往流中写一个字节数组b  void write( byte b[ ], int off, int len ); //把字节数组b中从              //下标off开始,长度为len的字节写入流中  ◇ flush( )       //刷空输出流,并输出所有被缓存的字节  由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。  ◇ 关闭流:   close( );       //流操作完毕后必须关闭 4.4.3 I/O中的例外  进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。如:FileNotFoundException, EOFException, IOException4.5 文件处理  I/O处理中,最常见的是对文件的操作,java.io包中有关文件处理的类有:File、FileInputStream、FileOutputStream、RamdomAccessFile和FileDescriptor;接口有:FilenameFilter。 4.5.1 文件描述  类File提供了一种与机器无关的方式来描述一个文件对象的属性。下面我们介绍类File中提供的各种方法。 ◇ 文件或目录的生成  public File(String path);/*如果path是实际存在的路径,则该File对象    /*表示的是目录;如果path是文件名,则该File对象表示的是文件。*/  public File(String path,String name);//path是路径名,name是文件名  public File(File dir,String name);//dir是路径名,name是文件名 ◇ 文件名的处理  String getName( ); //得到一个文件的名称(不包括路径)  String getPath( ); //得到一个文件的路径名  String getAbsolutePath( );//得到一个文件的绝对路径名  String getParent( ); //得到一个文件的上一级目录名  String renameTo(File newName); //将当前文件名更名为给定文件的                   完整路径 ◇ 文件属性测试  boolean exists( ); //测试当前File对象所指示的文件是否存在  boolean canWrite( );//测试当前文件是否可写  boolean canRead( );//测试当前文件是否可读  boolean isFile( ); //测试当前文件是否是文件(不是目录)  boolean isDirectory( ); //测试当前文件是否是目录 ◇ 普通文件信息和工具  long lastModified( );//得到文件最近一次修改的时间  long length( ); //得到文件的长度,以字节为单位  boolean delete( ); //删除当前文件 ◇ 目录操作  boolean mkdir( ); //根据当前对象生成一个由该对象指定的路径  String list( ); //列出当前目录下的文件 【例4-3】  import java.io.*; //引入java.io包中所有的类  public class FileFilterTest{    public static void main(String args[]){     File dir=new File("d://ex"); //用File 对象表示一个目录     Filter filter=new Filter("java"); //生成一个名为java的过滤器     System.out.println("list java files in directory "+dir);     String files[]=dir.list(filter); //列出目录dir下,文件后缀名                       为java的所有文件     for(int i=0;i<files.length;i++){      File f=new File(dir,files[i]); //为目录dir 下的文件或目录                       创建一个File 对象       if(f.isFile()) //如果该对象为后缀为java的文件,                则打印文件名        System.out.println("file "+f);       else         System.out.println("sub directory "+f ); //如果是目录                             则打印目录名     }    }   }   class Filter implements FilenameFilter{    String extent;    Filter(String extent){     this.extent=extent;    }    public boolean accept(File dir,String name){     return name.endsWith("."+extent); //返回文件的后缀名    }   }4.5.2 文件的顺序处理  类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。例如,下列的语句段是顺序读取文件名为text的文件里的内容,并显示在控制台上面,直到文件结束为止。  FileInputStream fis;    try{    fis = new FileInputStream( "text" );   System.out.print( "content of text is : ");     int b;     while( (b=fis.read())!=-1 ) //顺序读取文件text里的内容并赋值                    给整型变量b,直到文件结束为止。      {                     System.out.print( (char)b );     }   }catch( FileNotFoundException e ){   System.out.println( e );   }catch( IOException e ){   System.out.println( e );   }4.5.3 随机访问文件  对于InputStream 和OutputStream 来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。随机访问文件则允许对文件内容进行随机读/写。在java中,类RandomAccessFile 提供了随机访问文件的方法。类RandomAccessFile的声明为:public class RandomAccessFile extends Object implements DataInput, DataOutput  接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean( )、readInt( )、readLine( )、readFully( ) 等。   接口DataOutput 中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如:writeChar( )、writeDouble( )、write( ) 等。 下面详细介绍RandomAccessFile类中的方法。 ◇ 构造方法:  RandomAccessFile(String name,String mode); //name是文件名,mode          //是打开方式,例如"r"表示只读,"rw"表示可读写,"  RandomAccessFile(File file,String mode); //file是文件对象 ◇ 文件指针的操作  long getFilePointer( ); //用于得到当前的文件指针  void seek( long pos ); //用于移动文件指针到指定的位置  int skipBytes( int n ); //使文件指针向前移动指定的n个字节 4.6 过滤流  过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类  过滤流类层次:          java.lang.Object                |                +----java.io.InputStream                          |                          +----java.io.FilterInputStream  为了使用一个过滤流,必须首先把过滤流连接到某个输入/出流上,通常通过在构造方法的参数中指定所要连接的输入/出流来实现。例如:  FilterInputStream( InputStream in );  FilterOutputStream( OutputStream out );4.6.1 几种常见的过滤流  ◇ BufferedInputStream和BufferedOutputStream    缓冲流,用于提高输入/输出处理的效率。  ◇ DataInputStream 和 DataOutputStream    不仅能读/写数据流,而且能读/写各种的java语言的基本类型,如:boolean,int,float等。  ◇ LineNumberInputStream    除了提供对输入处理的支持外,LineNumberInputStream可以记录当前的行号。  ◇ PushbackInputStream    提供了一个方法可以把刚读过的字节退回到输入流中,以便重新再读一遍。  ◇ PrintStream    打印流的作用是把Java语言的内构类型以其字符表示形式送到相应的输出流。4.7 字符流的处理  java中提供了处理以16位的Unicode码表示的字符流的类,即以Reader和Writer 为基类派生出的一系列类。4.7.1 Reader和Writer    这两个类是抽象类,只是提供了一系列用于字符流处理的接口,不能生成这两个类的实例,只能通过使用由它们派生出来的子类对象来处理字符流。 1.Reader类是处理所有字符流输入类的父类。  ◇ 读取字符   public int read() throws IOException; //读取一个字符,返回值为读取的字符  public int read(char cbuf[]) throws IOException; /*读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量*/  public abstract int read(char cbuf[],int off,int len) throws IOException;   /*读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/  ◇ 标记流  public boolean markSupported(); //判断当前流是否支持做标记  public void mark(int readAheadLimit) throws IOException;    //给当前流作标记,最多支持readAheadLimit个字符的回溯。  public void reset() throws IOException; //将当前流重置到做标记处  ◇ 关闭流  public abstract void close() throws IOException; 2. Writer类是处理所有字符流输出类的父类。  ◇ 向输出流写入字符  public void write(int c) throws IOException;  //将整型值c的低16位写入输出流  public void write(char cbuf[]) throws IOException;  //将字符数组cbuf[]写入输出流  public abstract void write(char cbuf[],int off,int len) throws IOException;  //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流  public void write(String str) throws IOException;  //将字符串str中的字符写入输出流  public void write(String str,int off,int len) throws IOException;  //将字符串str 中从索引off开始处的len个字符写入输出流  ◇ flush( )  刷空输出流,并输出所有被缓存的字节。  ◇ 关闭流  public abstract void close() throws IOException;4.7.2 InputStreamReader和OutputStreamWriter  java.io包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介。   ◇ 生成流对象  public InputStreamReader(InputStream in);   /*in是字节流,而InputStreamReader是字符流,但是其来源是字节流in,  因此InputStreamReader就可以把字节流in转换成字符流处理。/*  public InputStreamReader(InputStream in,String enc) throws UnsupportedEncodingException;  /*enc是编码方式,就是从字节流到字符流进行转换时所采用的编码方式,   例如 ISO8859-1,UTF-8,UTF-16等等*/  public OutputStreamWriter(OutputStream out);  /*out是字节流,而OutputStreamReader是字符流 */  public OutputStreamWriter(OutputStream out,String enc) throws UnsupportedEncodingException; //enc是编码方式  InputStreamReader和OutputStreamWriter的方法:  ◇ 读入和写出字符  基本同Reader和Writer。  ◇ 获取当前编码方式  public String getEncoding();  ◇ 关闭流  public void close() throws IOException;4.7.3 BufferedReader和BufferedWriter ◇ 生成流对象  public BufferedReader(Reader in); //使用缺省的缓冲区大小  public BufferedReader(Reader in, int sz); //sz为缓冲区的大小  public BufferedWriter(Writer out);  public BufferedWriter(Writer out, int sz); ◇ 读入/写出字符  除了Reader和Writer中提供的基本的读写方法外,增加对整行字符的处理。  public String readLine() throws IOException; //读一行字符  public void newLine() throws IOException; //写一行字符【例4-4】  import java.io.*;  public class NumberInput{   public static void main(String args[]){    try{      InputStreamReader ir;      BufferedReader in;      ir=new InputStreamReader(System.in);       //从键盘接收了一个字符串的输入,并创建了一个字符输入流的对象      in=new BufferedReader(ir);      String s=in.readLine();      //从输入流in中读入一行,并将读取的值赋值给字符串变量s      System.out.println("Input value is: "+s);      int i = Integer.parseInt(s);//转换成int型      i*=2;      System.out.println("Input value changed after doubled: "+i);    }catch(IOException e)    {System.out.println(e);}   }  }    运行结果D:\>java NumberInput123Input value is 123Input value changed after doubled: 246  注意:在读取字符流时,如果不是来自于本地的,比如说来自于网络上某处的与本地编码方式不同的机器,那么我们在构造输入流时就不能简单地使用本地缺省的编码方式,否则读出的字符就不正确;为了正确地读出异种机上的字符,我们应该使用下述方式构造输入流对象:      ir = new InputStreamReader(is, "8859_1");  采用ISO 8859_1编码方式,这是一种映射到ASCII码的编码方式,可以在不同平台之间正确转换字符。 4.8 对象的串行化(Serialization)4.8.1 串行化的定义    1. 什么是串行化  对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力,叫做对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。   2. 串行化的目的  串行化的目的是为java的运行环境提供一组特性,其主要任务是写出对象实例变量的数值。4.8.2 串行化方法  在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。 1. 定义一个可串行化对象  public class Student implements Serializable{    int id; //学号    String name; //姓名    int age; //年龄    String department //系别    public Student(int id,String name,int age,String department){     this.id = id;     this.name = name;     this.age = age;     this.department = department;    }  } 2. 构造对象的输入/输出流  要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。  java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。在ObjectInputStream中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。  Student stu=new Student(981036,"Liu Ming",18, "CSD");  FileOutputStream fo=new FileOutputStream("data.ser");  //保存对象的状态  ObjectOutputStream so=new ObjectOutputStream(fo);  try{    so.writeObject(stu);    so.close();    }catch(IOException e )      {System.out.println(e);}  FileInputStream fi=new FileInputStream("data.ser");  ObjectInputStream si=new ObjectInputStream(fi);  //恢复对象的状态  try{    stu=(Student)si.readObject();    si.close();    }catch(IOException e )  {System.out.println(e);}  在这个例子中,我们首先定义一个类Student,实现了 Serializable接口,然后通过对象输出流的writeObject()方法将Student对象保存到文件data.ser中。之后,通过对象输入流的readObject()方法从文件data.ser中读出保存下来的Student对象。 4.8.3 串行化的注意事项 1.串行化能保存的元素  只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。 2.transient关键字   对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 3. 定制串行化  缺省的串行化机制,对象串行化首先写入类数据和类字段的信息,然后按照名称的上升排列顺序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种类,必须定义自己的读取数据流的方式。就是在类的定义中重写writeObject()和readObject()方法。  例如可在4.8.2的例子中,加入重写的writeObject()和readObject()方法,对Student 类定制其串行化。  private void writeObject(ObjectOutputStream out)throws IOException  {    out.writeInt(id);    out.writeInt(age);    out.writeUTF(name);    out.writeUTF(department);  }  private void readObject(ObjectInputStream in)throws IOException  {    id=in.readInt();    age=in.readInt();    name=in.readUTF();    department=in.readUTF();  }4.9 其它常用的流4.9.1 管道流  管道用来把一个程序、线程或代码块的输出连接到另一个程序、线程或代码块的输入 。    管道输入流作为一个通信管道的接收端,管道输出流作为发送端。在使用管道之前,管道输出流和管道输入流必须进行连接。下面有两种连接的方法: 1. 构造方法中连接  PipedInputStream(PipedOutputStream src);  PipedOutputStream(PipedInputStream snk); 2. connect()方法进行连接  类PipedInputStream中定义为:  void connect(PipedOutputStream src);  类PipedOutputStream中定义为:  void connect(PipedInputStream snk);4.9.2 内存的读/写 1. ByteArrayInputStream和ByteArrayOutputStream   ByteArrayInputStream //从字节数组中读取以字节为单位的数据  ByteArrayOutputStream //向字节数组中写入以字节为单位的数据 2. StringBufferInputStream和StringBufferOutputStream   StringBufferInputStream   //从字符串缓冲区StringBuffer中读取以字符为单位的数据  StringBufferOutputStream   //向字符串缓冲区StringBuffer中写入以字符为单位的数据4.9.3 顺序输入流  SequenceInputStream 把几个输入流顺序连接起来。顺序输入流提供了把若干不同的流统一为同一个流的功能,使得程序变得更加简洁。【本讲小结】  例外处理是java语言中一个独特之处,主要使用捕获例外和声明抛弃例外两种方法来处理程序中可能出现例外的语句块,其中捕获例外的方法是一种积极地处理例外的方法,而声明抛弃例外是一种消极的处理例外的方法。  Java中的输入/输出处理是通过使用流技术,用统一的接口表示而实现的。输入/输出流中,最常见的是对文件的处理。Java语言中提供专门处理文件和目录的类,例如:java.io.File,java.io.FileInputStream,java.io.FileOutputStream,java.io.RandomAccessFile和接口java.io.FilenameFilter。输入/输出流根据处理的内容,分为字符流和字节流两种,其中字节流是以byte为基本处理单位的流;而字符流是以16位的Unicode码为处理单位的流。... 全文

处理程序 JAVA 设计 休闲 职场

2011年 “蓝桥杯”选拔赛 java 本科

2011年 “蓝桥杯”选拔赛 java 本科1. 代码填空 (满分3分)圆周率我国古代数学家对圆周率方面的研究工作,成绩是突出的。三国时期的刘徽、南北朝时期的祖冲之都在这个领域取得过辉煌战绩。有了计算机,圆周率的计算变得十分容易了。如今,人们创造了上百种方法求π的值。其中比较常用且易于编程的是无穷级数法。π/4 = 1 – 1/3 + 1/5 – 1/7 + 1/9 - …是初学者特别喜欢的一个级数形式,但其缺点是收敛太慢。π/2 = 1 + 1/3 +1/3*2/5 + 1/3*2/5*3/7 + 1/3*2/5*3/7*4/9 + …... 全文

蓝桥杯 2011年 蓝桥杯选拔赛 java 本科 Java

java程序员面试必备的32个要点(下)

第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?) short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译)第十二,sleep() 和 wait() 有什么区别? ... 全文

java程序员 Object sleep Java 监控

Java编程思想重点笔记(Java开发必看)

Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关系和has-a关系的区别),也有深入的涉及RTTI和JVM底层反编译知识。1. Java中的多态性理解(注意与C++区分)Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意味着通常情况下,我们不必判定是否应该进行动态绑定—它会自动发生。final方法会使编译器生成更有效的代码,这也是为什么说声明为final方法能在一定程度上提高性能(效果不明显)。如果某个方法是静态的,它的行为就不具有多态性:... 全文

java 编程思想 笔记 虚拟机 多态

JAVA开发求职及职业发展必备(持续更新中)

求职阶段1.经验:1~2年:初级,2~4年中级,3~6年高级(实际与个人能力相关)2.学历:    专科(一般)、本科(一般)、研究生及以上,也不排除个别能力出众者是初中或者高中学历。3.外语:    一般为英语CET 4/6,但不一定代表实际水平,一般要求读懂常见单词即可!    部分企业对日语、英语等要求可能较高,特别是外企要求更高!... 全文

开发生涯 java技能 javaEE技能 java求职

Java源码转C#源码的五款最佳工具

Java源码转C#源码的五款最佳工具作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs... 全文

c# java java转C# 语言转换 语言翻译

优化Java堆大小的5个技巧

本文作者Pierre是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE、中间件和JVM技术。根据他多年的工作实践经验,他发现许多性能问题都是由Java堆容量不足和调优引起的。下面他将和大家分享非常实用的5个Java堆优化技巧。1.JVM:对难以理解的东西产生恐惧感... 全文

GC Java性能调优 JVM Heap Java 编程语言

Java开源博客:B3log Solo 0.4.5正式版发布

B3log Logo

Java 开源博客 —— B3LOG Solo 0.4.5 正式版发布了!项目已经迁往 GitHub

支持多编辑器(TinyMCE、KindEditor、Markdown),改进了对服务路径的... 全文

Java Java开源博客 B3log Solo

【Java基础】Java面试题目整理与讲解(一)

1. ArrayList,Vector, LinkedList 的存储性能和特性ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按 序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchroni zed 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后 向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 2.Collection 和 Collections 的区别Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。3.HashMap 和 Hashtable 的区别HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安全,效率上可能高于 Hashtable。 HashMap 允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。 HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。 Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的 方法实现同步,而 HashMap 就必须为之提供外同步。Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。 4.sleep() 和 wait() 有什么区别sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时 后会自动恢复。调用 sleep 不会释放对象锁。 wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发 出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 5.Overload 和 Override 的区别Overloaded 的方法是否可以改变返回值的类型? 方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类 中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded 的 方法是可以改变返回值的类型。 6.同步和异步有何异同,在什么情况下分别使用他们?如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了, 那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程, 在很多情况下采用异步途径往往更有效率。 ... 全文

面试题 java 线程 线程安全 android

Java2007预想(简译Java 2007: The year in preview)(下)

作为桌面语言的Java平台    当一些程序员选择用Java代码来编写他们的桌面应用程序的时候,绝大多数是因为对跨多个平台发布的渴望的驱使。对用Java平台作为桌面开发语言的兴趣,是跟非微软桌面的数量密切相关的。让我们关注一下,之前的一年,Java在三个主要桌面环境里的发展情况。    Windows    明年,Swing将继续在它的窗口外观和感觉上得到小的改进,特别是切换到开源开发后。结果,像LimeWire这样的纯Java程序,比在 Windows上更加像一个本地化的程序。但是开发本地化的Windows应用程序选择的语言仍将是C#(还有一些仍在坚持使用的C和C++),平台将是.NET。Java代码将不会产成任何影响Windows生态系统的印记。    Macintosh    跟微软一样,苹果公司大量抛弃Java代码。Apple热衷于Object-C和Cocoa,但是最终的结果是一样的:只在Mac上开发的开发人员继续被迫放弃Java编码作为Apple上首选的开发语言和环境。    另一方面,当Apple不再在其自有的API(比如,QuickTime和Cocoa)上提供对Java编码的支持时,Apple上的Java虚拟机比前些年更加成型。Apple的Java 6不久将发布。不像Sun的JDK,它将不是开源的,但是无论如何开源程序员都将开始修正它的BUG。    Linux    GPL许可将使把Java代码和开源Linux发行版本绑定成为可能,即使是最纯粹的发行版,这将使Java平台成为Linux开发中最吸引人的语言。如果这些仅仅是早五年发生,Linux社区这些时间里也许就不必同C语言一起苦苦挣扎了,Mono语言也不必要了。Gnome和KDE已经有了Java绑定,所以在下面的这一年中应该给予它们更多的关注。也期望至少能启动一个重大项目,用Java代码来开发一套Linux的GUI程序,就像用C、C++或 C#作为开发语言那样。    Ruby赢得赛跑    如果我们只用一种语言,那么全世界都将变得无聊。虽然对成熟的应用程序开发来说,Java平台是一个优秀的选择,但是它从来没有正真的符合的小型程序和宏的开发需求。Java 6表明了这点,它加入了javax.script包,用来同脚本语言(比如BeanShell、Python、Perl、Ruby、ECMAScript和Groovy)进行互操作,就像一个可以动态调用的虚拟机指令一样,允许把动态输入的语言直接编译到Java虚拟机上运行。    2007年,我将通过Ruby挣钱,虽然它实际上不是我个人最喜爱的。Python显得比Ruby更加清晰和易于理解,我想大多数Java程序员都会同意这一点。然而,Python出生在了一个错误的时候。许多程序员不得不在学习Python和学习Java之间选择,大多数人选择了Java。现在他们已经最终消化了Java的语法,准备再在他们的工具箱里添加一种语言的时候,他们需要的是未来的语言,而不是过去的语言,这样一来,只会是Ruby了。最重要地, 应用在Ruby on Rails中的Ruby绝对是一个杀手。它的易用性极大地吸引着那些灰心的Java企业版(JEE)开发者团队。         除了Rails之外,JRuby计划提供了同现有Java代码和类库的集成,这一点同其他脚本语言做得一样好,甚至更好。实际上,JRuby可能超越标准的Ruby发行版,成为Ruby程序员首选的平台,不仅仅是Java程序员另外做一点Ruby那么回事。这个多好。Python程序员会反对了,像JRuby那样的东西,他们早几年就做出了最好的——Jython,他们是对的,但是我们讨论的是2007将发生什么,而不是什么应当发生。也许不好,但是事实:Ruby有冲劲,但是Python没有。    其它脚本语言也将逐步被挤压。Perl是一个太过时的语言,不能很好地适应现在的应用程序。Groovy苦于缺乏一个清晰的展现,对计算机科学术语的过分使用降低了它可用性和交互性。BeanShell、Jelly和其他大概有半打的脚本语言,从来没有吸引过足够的跟随者。到明年的这个时候,竞争将会结束,Ruby将变为Java程序员脚本语言的选择。        IDE变得更好    2006年的IDE之争,再次证明了竞争的好处。由于受Eclipse压迫,Sun投入了一些精力和资源在NetBeans上,终于让它开始像一个强大的竞争对手了。2006年底前,在一些方面,NetBeans甚至超越了Ecplise。它具有相当占优势的本地化的外观和感觉,在GUI设计方面提供了更好的工具。它所不具有的是Ecplise社区。更多的插件和第三方产品是基于Eclipse的,至少在数量上是这样,并且这一趋势还在加速。    同去年一样,Ecplise在即将在2007年发布的3.3版本上继续努力。今年,Sun也许也会成功的发布NetBeans 6。两者都不是重要发布版,他们仅仅是在这里那里添加一些小的特性,修正bug,清理他们的用户界面(也许不是很必要)。    NetBeans可能继续争夺Eclipse的市场。它起步地太迟,所以有更多的空间成长。(Sun将NetBeans和JDK捆绑下载,对两者不无好处。)年底,这两个IDE可能平分市场。    与此同时,感到满意的Intellj IDEA用户继续会奇怪,这些争论是为了什么,他们会继续坚持他们的信仰,Intellj IDEA是可用的最好的Java IDE。然而,因为其500美元的标价,绝大多数用户无法看到它,所以它的市场份额会继续在5%左右徘徊。    Java企业版    没有哪一部分Java编程像Java企业版一样成功,也没有哪一部分遭受像它一样的斥责。它是一个让人又爱又恨的技术。Java企业版是复杂的、令人困惑的,也是重量给的。没有其他部分的Java编程有如此多的第三方产品来完全或部分替代它:Spring、Hibernate、Restlet、aspects、Struts等等。虽然如此,大多数Java程序员的招聘还是需要JEE经历,所以Sun必须为此做些什么。    在企业环境中,我看到的趋势是对简单化的需求。大型框架出局,小而简单的被采用。不断地,客户拒绝大型的JEE,这个仿佛还在继续。作为替代,客户开始转向更加简单的框架,比如Spring或者完全脱离Java平台的Ruby on Rails。对简单、更易理解系统的需求,驱使人们去关心SOAs(Service oriented Architectures) 和 REST(Representational State Transfer)。    我们可以期望这种简单化的驱动力在2007年里延续。许多深受Rails影响的人开始在其他语言中复制它的成功,比如Python(Turbo Gears)、Groovy(Grails)和Java(Sails)。也许,这些中的某一个会成功,然而,地平线还是不会出现新的“银弹”。因此,商家们将继续采用现有的技术:SOA、REST和Rails。    Java微型版    从最大到最小,在嵌入式领域,我们期望什么?这些年,Java平台在小型系统上已经取得了令人惊奇的成功,2007可能将在这些成功上继续。首先,查看第三版的MIDP(Mobile Information Device Profile),提升了现在更为强大的设备的能力。特别地,我们不久将可以在一个虚拟机上运行几个MIDlet,包括在后台运行一个或多个。也可以查看到加密记录管理系统(RMS,Record Management System)的存储和IPv6的支持。    当前在开发中,适用JavaME的可扩展的2维矢量图形API应当在可用于许多设备的动画功能上提升。除SVG动画,也应该使声音和影像流可用。如果移动网络开放,这可能非常重要,想想看在手机中浏览YouTube。(当然,如果网络不开放,没人愿意看两英寸的公司广告。我对美国的情况表示悲观,但是欧洲也许对它感兴趣。)    移动开发者也能期望看到第一部支持XML API for Java ME的电话。这个API从SAX、DOM、StAX和JAXP中精心挑选出来的子集,来适应电话的有限内存环境。许多人想实际的XML不能适用于电话,今年我们能够知晓他们是对还是错。    尽管好消息不断,Apple的iPhone仍然扮演着作为移动开发平台的Java平台的最主要威胁的角色。iPhone已经发布6个月了,现在已经是这个星球上最热门的、最具吸引力的电话。问题是它将成为一个相对封闭的平台,甚至在电话网络标准上,它将不会运行Java代码。不用多说,这对于那些试图为移动电话、PDA和个人通讯设备购买第三方应用程序的人来说是一个可怕的消息。    小结    考虑到JDK的开源,2007肯定将是Java变成中自互联网炸弹(dot bomb)以来最令人兴奋的一年。直至目前,Java平台一直受Sun公司的目标和投资能力所制约,但是这大概要发生变化了。随着开发者社区坐上掌舵者的位置,我们期望能够看到Java编程能够立刻向各个方面发展。开发者将能够对Java代码做比以前更多的事情。桌面、服务器和嵌入式:所有的都将加速。是的,前进的道路上将会有巨大的失败,但这也是快乐的一部分。好的想法将生存下去,坏的将失败。如果您对 Java 平台有任何不喜欢的,或者一直有迷惑的地方,启动您的 IDE,开始改造吧!    女士们、先生们!启动您的编译器吧!... 全文

Java preview 休闲 职场

Java程序员学习Flex和BlazeDS的十三个理由

本文列述了13个Java程序员应当学习Flex和BlazeDS的理由,讨论 了为什么Flex结合BlazeDS是开发RIA的最佳组合之一。无 论是高度交互的网站还是以Java为后端的企业应用,这项组合都是最佳选择之一。更重要的是,这项组合能同时为开发员和企业带来高回报(ROI)。在阐述Java程序员应当学习BlazeDS的13条理由时,我以一个假想的苏打分派系统来展示如何让已有的Java程序转变为RIA应用。通过这个例子,我同时还会讲解到BlazeDS在已有Java应用或新建Java应用中的多种不同用法。... 全文

flex java actionscript swing adobe java开发工具

Java开发中的事件驱动模型实例详解(2)

1.什么是事件驱动模型?  在讲解事件驱动模型之前,我们现在看看事件驱动模型的三大要素:  ·事件源:能够接收外部事件的源体。  ·侦听器:能够接收事件源通知的对象。  ·事件处理程序:用于处理事件的对象。  学员应该要理解任何基于事件驱动模型的开发技术都包含以上三大要素,不管是.net还是java技术,甚至是以前我们使用的Visual Basic和Delphi语言都有基于以上三大要素的事件驱动模型开发流程。... 全文

java技术 日常生活 大脑神经 Java 编程语言


shaogx.com©2017