java Io 全解
2015-10-28 21:38
471 查看
java.lang.Object
java.io.File
一个字符两个字节
一个字节八位
Int类型占4个字节
文件存取通常是循序的,每在文件中存取一次,文件的读取位置就会相对于目前的位置前进一次.然而有时必须制定文件的某个区段进行读取或写入的动作,也就是进行随机存取(RandomAccess),即要能在文件中随意第移动读取位置.这时可以使用RandomAccessFile,使用它的seek()方法来指定文件存取的位置,指定的单位是字节.
为了移动存取位置时的方便,通常在随机存取文件中会固定每一个数据的长度.例如长度固定为每一个学生个人的数据,Java中并没有直接的方法可以写入一个固定长度数据,所以在固定每一个长度方面必须自行设计.
计算机中的数据都是以0与1的方式来存储,如果要在两个装置之间进行数据的存取,当然也是以0与1位的方式来进行,Java将数据于目的地及来源之间的流动抽象华为一个流(Stream),而流当中流动的则是位数据.
流里面放的都是0和1,由于位是由于0和1来表示的,所以叫做位流.
数据流动抽象化为一个串流(Stream)
InputStream是所有表示位输入串流的类之父类
System中的标准输入串流in对象就是一个InputStream类型的实例
OutputSream是所有表示位输出串流的类之父类
System中的标准输出串流对象out其类型是java.io.PrintSream,OutputStream的子类.
很少直接操作InputStream货OutputStream上的方法,这些方法比较低阶
通常会操作它们的子类:
System.out.println(“输入字符十进制表示:”+System.in.read());
建立FileInputSream或FileOutputStream的实例时,必须制定文件位置及文件名,实例被创建时文件的串流就会开启.
不适用串流时,必须关闭文件串流,以释放与串流相依的系统资源.
BufferedOutputStream的资料成员buf是个位数组,默认为512个字节.
数据输出流允许应用程序以适当方式将基本Java数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
ObjectInputStream对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。
对对象直接进行读写操作
把能够实现Serializable接口的对象,表示这个对象可序列化或可串行化的
要直接储存对象,定义该对象的类必须实现java.io.Serializable接口
publicclassUserimplementsSerializable
{
privatestaticfinallongserialVersionUID=1L;
...
}
serialVersionUID代表了可串行化对象版本,从文件读回对象时两个对象的serialVersionUID不相同的话,就会丢出java.io.InvalidClassException
属性文件的读写
以properties为扩展名的文件叫属性文件
key=value的形式(value不用用引号)
#为单行注释
java.util.Properties
load()加载属性文件
getProperty("key")获取value
java.io.File
boolean | canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
boolean | canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 |
int | compareTo(Filepathname) 按字母顺序比较两个抽象路径名。 |
boolean | createNewFile() 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。 |
staticFile | createTempFile(Stringprefix,Stringsuffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
staticFile | createTempFile(Stringprefix,Stringsuffix,Filedirectory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
boolean | delete() 删除此抽象路径名表示的文件或目录。 |
void | deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 |
boolean | equals(Objectobj) 测试此抽象路径名与给定对象是否相等。 |
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
File | getAbsoluteFile() 返回抽象路径名的绝对路径名形式。 |
String | getAbsolutePath() 返回抽象路径名的绝对路径名字符串。 |
File | getCanonicalFile() 返回此抽象路径名的规范形式。 |
String | getCanonicalPath() 返回抽象路径名的规范路径名字符串。 |
String | getName() 返回由此抽象路径名表示的文件或目录的名称。 |
String | getParent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回null。 |
File | getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回null。 |
String | getPath() 将此抽象路径名转换为一个路径名字符串。 |
int | hashCode() 计算此抽象路径名的哈希码。 |
boolean | isAbsolute() 测试此抽象路径名是否为绝对路径名。 |
boolean | isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 |
boolean | isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
long | lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 |
long | length() 返回由此抽象路径名表示的文件的长度。 |
String[] | list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。 |
String[] | list(FilenameFilterfilter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。 |
File[] | listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。 |
File[] | listFiles(FileFilterfilter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。 |
File[] | listFiles(FilenameFilterfilter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。 |
staticFile[] | listRoots() 列出可用的文件系统根目录。 |
boolean | mkdir() 创建此抽象路径名指定的目录。 |
boolean | mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。 |
boolean | renameTo(Filedest) 重新命名此抽象路径名表示的文件。 |
boolean | setLastModified(longtime) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。 |
boolean | setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。 |
String | toString() 返回此抽象路径名的路径名字符串。 |
URI | toURI() 构造一个表示此抽象路径名的file:URI。 |
URL | toURL() 将此抽象路径名转换成一个file:URL。 |
FileDemo |
importjava.util.*; importjava.io.*; publicclassFileDemo{ publicstaticvoidmain(String[]args)throwsIOException{ Scannerscan=newScanner(System.in); System.out.println("请输入文件或文件夹路径!"); Stringpath=scan.next(); Filefile=newFile(path); if(file.isFile()){ System.out.printf("%s是文件\n",file.getName()); System.out.printf("%s文件%s\n",file.getName(),file.canRead()?"可读":"不可读"); System.out.printf("%s文件%s\n",file.getName(),file.canWrite()?"可写":"不可写"); System.out.printf("该文件为%d个字节\n",file.length()); }elseif(file.isDirectory()){ List<File>fileList=newArrayList<File>(); System.out.printf("%s是文件夹\n",file.getName()); File[]files=file.listFiles(); for(FiletempFile:files){ if(tempFile.isFile()){ fileList.add(tempFile); //System.out.printf("%s\n",tempFile.getName()); }else{ System.out.printf("&&&&[%s]&&&\n",tempFile.getName()); } } for(Filetemfile:fileList){ System.out.printf("%s\n",temfile.getName()); } }else{ System.out.printf("%s文件不存在",file.getName()); file.mkdirs(); } } } |
java.lang.Object
java.io.RandomAccessFile
一个字符两个字节
一个字节八位
Int类型占4个字节
文件存取通常是循序的,每在文件中存取一次,文件的读取位置就会相对于目前的位置前进一次.然而有时必须制定文件的某个区段进行读取或写入的动作,也就是进行随机存取(RandomAccess),即要能在文件中随意第移动读取位置.这时可以使用RandomAccessFile,使用它的seek()方法来指定文件存取的位置,指定的单位是字节.
为了移动存取位置时的方便,通常在随机存取文件中会固定每一个数据的长度.例如长度固定为每一个学生个人的数据,Java中并没有直接的方法可以写入一个固定长度数据,所以在固定每一个长度方面必须自行设计.
Filefile=newFile(args[0]); //建立RandomAccessFile实例并以读写模式开启文件 RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw"); for(inti=0;i<students.length;i++){ //使用对应的write方法写入数据 randomAccessFile.writeChars(students[i].getName()); randomAccessFile.writeInt(students[i].getScore()); } |
//使用seek()方法操作存取位置 randomAccessFile.seek((num-1)*Student.size()); Studentstuent=newStudent(); //使用对应的read方法读出数据 stuent.setName(readName(randomAccessFile)); stuent.setScore(randomAccessFile.readInt()); System.out.println("姓名:"+student.getName()); System.out.println("分数:"+student.getScore()); //设定关闭文件 randomAccessFile.close(); privatestaticStringreadName(RandomAccessFilerandomAccessfile)throwsIOException{ char[]name=newchar[15]; for(inti=0;i<name.length;i++) name[i]=randomAccessfile.readChar(); //将空字符取代为空格符并传回 returnnewString(name).replace('\0',''); } |
java.lang.StringBuilder |
用来累加字符串,一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。 在 StringBuilder上的主要操作是 append和 insert方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。 append方法始终将这些字符添加到生成器的末端;而 insert方法则在指定的点添加字符。 例如,如果 z引用一个当前内容为" start"的字符串的生成器对象,则该方法调用 z.append("le")将使字符串生成器包含" startle",而 z.insert(4, "le")将更改字符串生成器,使之包含" starlet"。 |
void | close() 关闭此随机存取文件流并释放与该流关联的所有系统资源。 |
FileChannel | getChannel() 返回与此文件关联的惟一FileChannel对象。 |
FileDescriptor | getFD() 返回与此流关联的不透明文件描述符对象。 |
long | getFilePointer() 返回此文件中的当前偏移量。 |
long | length() 返回此文件的长度。 |
int | read() 从此文件中读取一个数据字节。 |
int | read(byte[]b) 将最多b.length个数据字节从此文件读入字节数组。 |
int | read(byte[]b, intoff,intlen) 将最多len个数据字节从此文件读入字节数组。 |
boolean | readBoolean() 从此文件读取一个boolean。 |
byte | readByte() 从此文件读取一个有符号的八位值。 |
char | readChar() 从此文件读取一个Unicode字符。 |
double | readDouble() 从此文件读取一个double。 |
float | readFloat() 从此文件读取一个float。 |
void | readFully(byte[]b) 将b.length个字节从此文件读入字节数组,并从当前文件指针开始。 |
void | readFully(byte[]b, intoff,intlen) 将正好len个字节从此文件读入字节数组,并从当前文件指针开始。 |
int | readInt() 从此文件读取一个有符号的32位整数。 |
String | readLine() 从此文件读取文本的下一行。 |
long | readLong() 从此文件读取一个有符号的64位整数。 |
short | readShort() 从此文件读取一个有符号的16位数。 |
int | readUnsignedByte() 从此文件读取一个无符号的八位数。 |
int | readUnsignedShort() 从此文件读取一个无符号的16位数。 |
String | readUTF() 从此文件读取一个字符串。 |
void | seek(longpos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。 |
void | setLength(longnewLength) 设置此文件的长度。 |
int | skipBytes(intn) 尝试跳过输入的n个字节以丢弃跳过的字节。 |
void | write(byte[]b) 将b.length个字节从指定字节数组写入到此文件,并从当前文件指针开始。 |
void | write(byte[]b, intoff,intlen) 将len个字节从指定字节数组写入到此文件,并从偏移量off处开始。 |
void | write(intb) 向此文件写入指定的字节。 |
void | writeBoolean(booleanv) 按单字节值将boolean写入该文件。 |
void | writeByte(intv) 按单字节值将byte写入该文件。 |
void | writeBytes(Strings) 按字节序列将该字符串写入该文件。 |
void | writeChar(intv) 按双字节值将char写入该文件,先写高字节。 |
void | writeChars(Strings) 按字符序列将一个字符串写入该文件。 |
void | writeDouble(doublev) 使用Double类中的doubleToLongBits方法将双精度参数转换为一个long,然后按八字节数量将该long值写入该文件,先定高字节。 |
void | writeFloat(floatv) 使用Float类中的floatToIntBits方法将浮点参数转换为一个int,然后按四字节数量将该int值写入该文件,先写高字节。 |
void | writeInt(intv) 按四个字节将int写入该文件,先写高字节。 |
void | writeLong(longv) 按八个字节将long写入该文件,先写高字节。 |
void | writeShort(intv) 按两个字节将short写入该文件,先写高字节。 |
void | writeUTF(Stringstr) 使用modified UTF-8编码以与机器无关的方式将一个字符串写入该文件。 |
RandomAccessFileDemo |
importjava.util.*; importjava.io.*; publicclassRandomAccessFileDemo{ publicstaticvoidmain(String[]args)throwsFileNotFoundException,IOException{ Students1=newStudent("tom",20); Students2=newStudent("Jack",30); Students3=newStudent("zhang3",20); Students4=newStudent("Liudehua",10); Student[]students={s1,s2,s3,s4}; Scannerscan=newScanner(System.in); System.out.println("请输入一个文件路径!"); Stringpath=scan.next(); //RandomAccessFile工具,与File文件建立关联,即打开File文件,以RW(读写)形式打开 RandomAccessFileraf=newRandomAccessFile(newFile(path),"rw"); for(Studentstudent:students){ raf.writeChars(student.getName()); raf.writeInt(student.getAge()); } System.out.println("请选择1-4的学生"); intcount=scan.nextInt(); raf.seek((count-1)*Student.getSize()); char[]chars=newchar[10]; for(inti=0;i<10;i++){ chars[i]=raf.readChar(); } Stringname=String.valueOf(chars); intage=raf.readInt(); System.out.printf("第%d个学生的名字为%s,年龄为%d",count,name,age); raf.close(); } } |
java.lang.Object
java.io.InputStream
java.io.InputStream与java.io.OutputStream
计算机中的数据都是以0与1的方式来存储,如果要在两个装置之间进行数据的存取,当然也是以0与1位的方式来进行,Java将数据于目的地及来源之间的流动抽象华为一个流(Stream),而流当中流动的则是位数据.流里面放的都是0和1,由于位是由于0和1来表示的,所以叫做位流.
数据流动抽象化为一个串流(Stream)
InputStream是所有表示位输入串流的类之父类
System中的标准输入串流in对象就是一个InputStream类型的实例
OutputSream是所有表示位输出串流的类之父类
System中的标准输出串流对象out其类型是java.io.PrintSream,OutputStream的子类.
很少直接操作InputStream货OutputStream上的方法,这些方法比较低阶
通常会操作它们的子类:
System.out.println(“输入字符十进制表示:”+System.in.read());
建立FileInputSream或FileOutputStream的实例时,必须制定文件位置及文件名,实例被创建时文件的串流就会开启.
不适用串流时,必须关闭文件串流,以释放与串流相依的系统资源.
FileInputStreamfileInputStream=newFileInputStream(newFile(srgs[0])); FileOutputStreamfileOutputStream=newFileOutputStream(newFile(args[1])); ... fileInputStream.close(); fileOutputStream.close(); |
while(true) { if(fileInputStream.available()<1024) { //剩余的资料比1024少 //一位一位读出再写入目标文件 intremain=-1; while((remain=fileInputStream.read())!=-1) { fileOutputStream.write(remain); } break; }else { //从来源文件读取数据至缓存区 fileInputStream.read(buffer); //将数组数据写入目标文件 fileOutputStream.write(buffer); } } |
类FileInputStream方法摘要 | ||||||||||||||||||
|
类FileOutputStream方法摘要 | ||||||||||||||
|
importjava.util.*; importjava.io.*; publicclassFileStreamDemo{ publicstaticvoidmain(String[]args)throwsFileNotFoundException,IOException{ Scannerscan=newScanner(System.in); System.out.println("请输入你要复制的文件"); StringinPath=scan.next(); System.out.println("请输入你要复制到哪里"); StringoutPath=scan.next(); FileinFile=newFile(inPath); //创建FileInputStream对象,与FIle文件关联; FileInputStreamfis=newFileInputStream(inFile); //创建FileOutputStream对象,与outPath文件关联; FileOutputStreamfos=newFileOutputStream(newFile(outPath)); System.out.println("开始复制"); longstartTime=System.currentTimeMillis(); /*for(inti=0;i<=inFile.length();i++){ intflag=fis.read(); fos.write(flag); }*/ /*intflag=-1; while((flag=fis.read())>=0){ fos.write(flag); }*/ byte[]buffer=newbyte[1024*20]; while(true){ if(fis.available()<1024*20){ intflag=fis.read(); if(flag<0)break; fos.write(flag); } fis.read(buffer); fos.write(buffer); } longendTime=System.currentTimeMillis(); System.out.println("复制完毕"); System.out.printf("用时%d",endTime-startTime); fis.close(); fos.close(); } } |
java.io.InputStream
java.io.FilterInputStream
BufferedInputStream与BufferedOutputStream
BufferedInputStream的资料成员buf是个位数组,默认为2048字节
BufferedOutputStream的资料成员buf是个位数组,默认为512个字节.
BufferedInputStreambufferedInputStream=newBufferedInputStream(newFileInputStream(srcFile)); BufferedOutputStreambufferedOutputStream=newBufferedOutputStream(newFileOutputStream(desFile)); System.out.println("复制文件:"+srcFile.length()+"字节"); while(bufferedInputStream.read(data)!=-1){ bufferedOutputStream.write(data); } //将缓冲区中的数据全部写出 bufferedOutputStream.flush(); //关闭串流 bufferedInputStream.close(); bufferedOutputStream.close(); |
类BufferedInputStream方法摘要 | ||||||||||||||||
|
类BufferedOutputStream方法摘要 | ||||||
|
importjava.util.*; importjava.io.*; publicclassBufferedStreamDemo{ publicstaticvoidmain(String[]args)throwsFileNotFoundException,IOException{ Scannerscan=newScanner(System.in); System.out.println("请输入文件路径!"); StringinPath=scan.next(); System.out.println("请输入存放路径!"); StringoutPath=scan.next(); FileinFile=newFile(inPath); BufferedInputStreambin=newBufferedInputStream(newFileInputStream(newFile(inPath))); BufferedOutputStreambout=newBufferedOutputStream(newFileOutputStream(newFile(outPath))); System.out.println("开始复制"); longstartTime=System.currentTimeMillis(); byte[]data=newbyte[1]; while((bin.read(data))!=-1){ bout.write(data); } longendTime=System.currentTimeMillis(); System.out.println("复制完毕"); System.out.printf("用时%d秒",(endTime-startTime)/1000); bin.close(); bout.close(); } } |
java.io.InputStream
java.io.FilterInputStream
DataInputStream与DataOutputStream
主要是对java的基本数据类型,以及字符串提供的一些读写操作数据输出流允许应用程序以适当方式将基本Java数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
提供一些对java基本数据型态写入的方法 |
DataOutputStreamdataOutputStream=newDataOutputStream(newFileOutputStream(args[0])); for(Membermember:member) { //写入UTF字符串 dataOutputStream.writeUTF(member.getName()); //写入int资料 dataOutputStream.writeInt(member.getAge()); } //清除所有数据至目的地 dataOutputStream.flush(); //关闭串流 dataOutputStream.close(); |
DataInputStreamdataInputStream=newDataInputStream(newFileInputStream(args[0])); //读出数据并还原为对象 for(inti=0;i<members.length;i++){ //读出UTF字符串 Stringname=dataInputStream.readUTF(); //读出int资料 intscore=dataInputStream.readInt(); members[i]=newmember(name,score); } //关闭串流 dataInputStream.close(); |
类DataInputStream方法摘要 | ||||||||||||||||||||||||||||||||||||
|
类DataOutputStream方法摘要 | ||||||||||||||||||||||||||||||
|
importjava.util.*; importjava.io.*; publicclassDataStreamDemo{ publicstaticvoidmain(String[]args)throwsException{ Students1=newStudent("Aldrich",25); Students2=newStudent("zhangsan",34); Students3=newStudent("lisi",23); Students4=newStudent("wangwu",12); Students5=newStudent("zhaoliu",21); Student[]Students={s1,s2,s3,s4,s5}; Scannerscan=newScanner(System.in); System.out.println("请输入一个文件!"); Stringpath=scan.next(); DataOutputStreamdout=newDataOutputStream(newFileOutputStream(newFile(path))); DataInputStreamdin=newDataInputStream(newFileInputStream(newFile(path))); for(Studentstudent:Students){ dout.writeUTF(student.getName()); dout.writeInt(student.getAge()); } dout.flush(); for(inti=0;i<5;i++){ Stringname=din.readUTF(); intage=din.readInt(); System.out.printf("第%d个学生的名字为%s,年龄是%d\n",i+1,name,age); } din.close(); dout.close(); } } |
java.io.InputStream
ObjectInputStream与ObjectOutputStream
ObjectOutputStream将Java对象的基本数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。通过使用流中的文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。ObjectInputStream对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。
对对象直接进行读写操作
把能够实现Serializable接口的对象,表示这个对象可序列化或可串行化的
要直接储存对象,定义该对象的类必须实现java.io.Serializable接口
publicclassUserimplementsSerializable
{
privatestaticfinallongserialVersionUID=1L;
...
}
serialVersionUID代表了可串行化对象版本,从文件读回对象时两个对象的serialVersionUID不相同的话,就会丢出java.io.InvalidClassException
类ObjectInputStream方法摘要 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
类ObjectOutputStream方法摘要 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
importjava.util.*; importjava.io.*; publicclassObjectStreamDemo{ publicstaticvoidmain(String[]args)throwsException{ Students1=newStudent("tom",20); Students2=newStudent("Jack",30); Students3=newStudent("zhang3",20); Students4=newStudent("Liudehua",10); Student[]students={s1,s2,s3,s4}; Scannerscan=newScanner(System.in); System.out.println("请输入一个路径!"); Stringpath=scan.next(); ObjectOutputStreamoout=newObjectOutputStream(newFileOutputStream(newFile(path))); ObjectInputStreamoin=newObjectInputStream(newFileInputStream(newFile(path))); for(Studentstudent:students){ oout.writeObject(student); } oout.flush(); for(inti=0;i<4;i++){ Studentstudent=(Student)oin.readObject(); System.out.printf("第%d个学生的名字为%s,年龄为%d\n",i+1,student.getName(),student.getAge()); } oout.close(); oin.close(); } } |
java.util.Dictionary<K,V>
java.util.Hashtable<Object,Object>
Properties
Properties类表示了一个持久的属性集。
Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
属性文件的读写
以properties为扩展名的文件叫属性文件
key=value的形式(value不用用引号)
#为单行注释
java.util.Properties
load()加载属性文件
getProperty("key")获取value
类Properties方法摘要 | ||||||||||||||||||||||
|
importjava.util.Properties; importjava.io.*; publicclassPropertiesDemo{ publicstaticvoidmain(Stringargs[])throwsException{ //构建Properties工具对象 Propertiesprop=newProperties(); //加载属性文件 prop.load(newFileInputStream(newFile("d:\\src\\school.properties"))); Stringname=prop.getProperty("name"); Stringaddress=prop.getProperty("address"); System.out.println(name); System.out.println(address); } } |
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统