好文档 - 专业文书写作范文服务资料分享网站

java各知识点详细总结

天下 分享 时间: 加入收藏 我要投稿 点赞

迭代器是功能一样的,所以,可以用迭代替代枚举。

合并原理:多个读取流对应一个输出流。三一 切割原理:一个读取流对应多个输出流。一三

import java.io.*; import java.util.*; class SplitFileDemo{

private static final String CFG = \ private static final String SP = \

public static void main(String[] args) throws IOException{ File file = new File(\ File dir = new File(\ meger(dir); }

//数据的合并。

public static void meger(File dir)throws IOException{ if(!(dir.exists() && dir.isDirectory()))

throw new RuntimeException(\指定的目录不存在,或者不是正确的目录\ File[] files = dir.listFiles(new SuffixFilter(CFG)); if(files.length==0)

throw new RuntimeException(\扩展名.proerpties的文件不存在\ //获取到配置文件

File config = files[0]; //获取配置文件的信息。

Properties prop = new Properties();

FileInputStream fis = new FileInputStream(config); prop.load(fis);

String fileName = prop.getProperty(\

int partcount = Integer.parseInt(prop.getProperty(\ //--------------------------

File[] partFiles = dir.listFiles(new SuffixFilter(SP)); if(partFiles.length!=partcount)

throw new RuntimeException(\缺少碎片文件\ //---------------------

ArrayList al = new ArrayList(); for(int x=0; x

al.add(new FileInputStream(new File(dir,x+SP))); }

Enumeration en = Collections.enumeration(al); SequenceInputStream sis = new SequenceInputStream(en); File file = new File(dir,fileName);

FileOutputStream fos = new FileOutputStream(file); byte[] buf = new byte[1024]; int len = 0;

while((len=sis.read(buf))!=-1){ fos.write(buf,0,len);

56 / 67

}

fos.close(); sis.close(); }

//带有配置信息的数据切割。

public static void splitFile(File file)throws IOException{ //用一个读取流和文件关联。

FileInputStream fis = new FileInputStream(file); //创建目的地。因为有多个。所以先创建引用。 FileOutputStream fos = null; //指定碎片的位置。

File dir = new File(\ if(!dir.exists()) dir.mkdir();

//碎片文件大小引用。 File f = null;

byte[] buf = new byte[1024*1024];

//因为切割完的文件通常都有规律的。为了简单标记规律使用计数器。 int count = 0; int len = 0;

while((len=fis.read(buf))!=-1){

f = new File(dir,(count++)+\ fos = new FileOutputStream(f); fos.write(buf,0,len); fos.close(); }

//碎片文件生成后,还需要定义配置文件记录生成的碎片文件个数。以及被切割文件的名称。

//定义简单的键值信息,可是用Properties。 String filename = file.getName(); Properties prop = new Properties(); prop.setProperty(\ prop.setProperty(\

File config = new File(dir,count+\ fos = new FileOutputStream(config); prop.store(fos,\ fos.close(); fis.close(); } }

class SuffixFilter implements FileFilter{ private String suffix;

SuffixFilter(String suffix){ this.suffix = suffix; }

public boolean accept(File file){

return file.getName().endsWith(suffix);

57 / 67

} }

-----------------------------------------------------------------------------------------------

RandomAccessFile: 特点:

1:该对象即可读取,又可写入。

2:该对象中的定义了一个大型的byte数组,通过定义指针来操作这个数组。

3:可以通过该对象的getFilePointer()获取指针的位置,通过seek()方法设置指针的位置。 4:该对象操作的源和目的必须是文件。

5:其实该对象内部封装了字节读取流和字节写入流。 注意:实现随机访问,最好是数据有规律。

class RandomAccessFileDemo{

public static void main(String[] args) throws IOException{ write(); read();

randomWrite(); }

//随机写入数据,可以实现已有数据的修改。

public static void randomWrite()throws IOException{

RandomAccessFile raf = new RandomAccessFile(\ raf.seek(8*4);

System.out.println(\ raf.write(\王武\ raf.writeInt(102); raf.close(); }

public static void read()throws IOException{

RandomAccessFile raf = new RandomAccessFile(\只读模式。 //指定指针的位置。

raf.seek(8*1);//实现随机读取文件中的数据。注意:数据最好有规律。 System.out.println(\getFilePointer()); byte[] buf = new byte[4]; raf.read(buf);

String name = new String(buf); int age = raf.readInt();

System.out.println(name+\

System.out.println(\ raf.close(); }

public static void write()throws IOException{

//rw:当这个文件不存在,会创建该文件。当文件已存在,不会创建。所以不会像输出流一样覆盖。

RandomAccessFile raf = new RandomAccessFile(\读写模式 //往文件中写入人的基本信息,姓名,年龄。 raf.write(\张三\

58 / 67

raf.writeInt(97); raf.close(); } }

------------------------------------------------------------------------------------------------ 管道流:管道读取流和管道写入流可以像管道一样对接上,管道读取流就可以读取管道写入流写入的数据。

注意:需要加入多线程技术,因为单线程,先执行read,会发生死锁,因为read方法是阻塞式的,没有数据的read方法会让线程等待。

public static void main(String[] args) throws IOException{ PipedInputStream pipin = new PipedInputStream(); PipedOutputStream pipout = new PipedOutputStream(); pipin.connect(pipout);

new Thread(new Input(pipin)).start(); new Thread(new Output(pipout)).start(); }

------------------------------------------------------------------------------------------------

对象的序列化:目的:将一个具体的对象进行持久化,写入到硬盘上。

注意:静态数据不能被序列化,因为静态数据不在堆内存中,是存储在静态方法区中。

如何将非静态的数据不进行序列化?用transient 关键字修饰此变量即可。

Serializable:用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。

import java.io.*;

class ObjectStreamDemo {

public static void main(String[] args) throws Exception{ writeObj(); readObj(); }

public static void readObj()throws Exception{

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(\ Object obj = ois.readObject();//读取一个对象。 System.out.println(obj.toString()); }

public static void writeObj()throws IOException{ ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(\

oos.writeObject(new Person(\ //写入一个对象。 oos.close(); }

59 / 67

}

class Person implements Serializable{

private static final long serialVersionUID = 42L;

private transient String name;//用transient修饰后name将不会进行序列化 public int age;

Person(String name,int age){ this.name = name; this.age = age; }

public String toString(){ return name+\ } }

-----------------------------------------------------------------------------------------------

DataOutputStream、DataInputStream:专门用于操作基本数据类型数据的对象。

DataOutputStream dos = new DataOutputStream(new FileOutputStream(\ dos.writeInt(256); dos.close();

DataInputStream dis = new DataInputStream(new FileInputStream(\ int num = dis.readInt(); System.out.println(num); dis.close();

-----------------------------------------------------------------------------------------------

ByteArrayInputStream:源:内存

ByteArrayOutputStream:目的:内存。

这两个流对象不涉及底层资源调用,操作的都是内存中数组,所以不需要关闭。 直接操作字节数组就可以了,为什么还要把数组封装到流对象中呢?因为数组本身没有方法,只有一个length属性。为了便于数组的操作,将数组进行封装,对外提供方法操作数组中的元素。

对于数组元素操作无非两种操作:设置(写)和获取(读),而这两操作正好对应流的读写操作。这两个对象就是使用了流的读写思想来操作数组。

//创建源:

ByteArrayInputStream bis = new ByteArrayInputStream(\ //创建目的:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); int ch = 0;

while((ch=bis.read())!=-1){ bos.write(ch); }

System.out.println(bos.toString());

----------------------------------------------------------------------------------------------- 网络编程: 端口:

60 / 67

java各知识点详细总结

迭代器是功能一样的,所以,可以用迭代替代枚举。合并原理:多个读取流对应一个输出流。三一切割原理:一个读取流对应多个输出流。一三importjava.io.*;importjava.util.*;classSplitFileDemo{privatestaticfinalStringCFG=\priv
推荐度:
点击下载文档文档为doc格式
0xx6j6egbx8uhsm07rry
领取福利

微信扫码领取福利

微信扫码分享