迭代器是功能一样的,所以,可以用迭代替代枚举。
合并原理:多个读取流对应一个输出流。三一 切割原理:一个读取流对应多个输出流。一三
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.add(new FileInputStream(new File(dir,x+SP))); } Enumeration 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