------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----
一、打印、合并切割。
1、打印流
打印流提供了print,println方法,可以讲各种类型的数据原样打印。
字节打印流 PrintStream:
Constructor() 参数列表
1.File f
2.String str (“字符串路径”)
3.字节输出流 FileOutputStream
字符打印流 PrintWriter:(常用于WEB开发)
Constructor() 参数列表
1.File f
2.String str (“字符串路径”)
3.字节输出流 FileOutputStream
4.字符输出流,Writer
<例> BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true); //true参数代表自动刷新。boolean autoflush
注意:
2、合并切割
SequenceInputStream(序列流):用于整合多个输入流对象
Constructor() :构造方法:
1、SequenceInputStream(Enumeration en); //枚举类型(老版迭代器),集合Vector.
2、SequenceInputStream(InputStream s1,InputStream s2);
<示例1>将1.txt,2.txt,3.txt文件合并为一个文件。
/*示例:合并文件 * 思路:建立三个输入流关联三个文件 * 将三个流对象存入Vector集合中 * 利用Vector对象的 elements()方法建立Enumeration * 将Enumeration对象作为参数传递至SequenceInputStream()的参数,合并输入流 * IO操作。 */ import java.io.*; import java.util.*; public class IoTest1 { public static void main(String[] args) throws IOException { Vector<FileInputStream> v = new Vector(); //创建结合对象,泛型规定集合元素类型为 FileInputStream字节输入 v.add(new FileInputStream("D:\\1.txt")); //添加元素 v.add(new FileInputStream("D:\\2.txt")); v.add(new FileInputStream("D:\\3.txt")); v.add(new FileInputStream("D:\\4.txt")); Enumeration en = v.elements(); //获取Enumeration对象 SequenceInputStream sis = new SequenceInputStream(en); //创建序列流,合并输入流 PrintStream ps = new PrintStream("d:\\5.txt"); //打印字节流关联输出文件 byte[] temp = new byte[1024]; int len = 0; while(( len = sis.read(temp)) != -1) { ps.write(temp,0,len); } ps.close(); sis.close(); } }
切割思路:定义一个数组:Byte[] temp = new byte[注意大小避免内存溢出]
while((fis.read(temp)) != -1) {
fos = new FileOuputStream("d:\\"+(count++) + ".bmp");
fos.write("f");
fos.close();
}
<练习,切割并合并一个魔兽大脚文件>
/*切割合并综合示例 */ import java.io.*; import java.util.*; public class IoTest1 { public static void main(String[] args) throws IOException { //splitFile(new File("d:\\BigFoot_WOW_5.0.0.5.exe")); mergeFile(); } /*将某文件切割成大小为5MB的碎片*/ public static void splitFile(File f1) throws IOException { FileInputStream fis = new FileInputStream(f1); //输入 FileOutputStream fos = null; //输出 byte[] temp = new byte[1024*1024] ; //定义字节数组存放读取的文件 int i = 1; //文件名计数器 int count = 0; //输出次数计数器 int len = 0; while((len = fis.read(temp)) != -1) { fos = new FileOutputStream("F:\\Bigfoot_"+i+".part",true); //想f1_i.part文件中续写内容 fos.write(temp,0,len); //每次写入1MB文件 count ++; if (count % 5 == 0) { //档写入大小为5MB时,关闭输出流,并且计数器i自加,下一次循环生成信的文件 i++; fos.close(); } } fis.close(); } public static void mergeFile() throws IOException { ArrayList<FileInputStream> al = new ArrayList<FileInputStream>(); for(int i = 1; i<=5;i++) { al.add(new FileInputStream("F:\\Bigfoot_"+i+".part")); } final Iterator<FileInputStream> it = al.iterator(); Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() { public boolean hasMoreElements() { return it.hasNext(); } public FileInputStream nextElement() { return it.next(); } }; SequenceInputStream sis = new SequenceInputStream(en); FileOutputStream fos =new FileOutputStream("F:\\BIGFOOT.EXE"); byte[] temp = new byte[1024*1024]; int len = 0; while((len = sis.read(temp)) != -1) { fos.write(temp,0,len); } fos.close(); sis.close(); } }
三、RandomAccessFile
RandomAccessFile简介:
此类继承至Object,并不是IO体系中的子类,但它是IO包内的成员,它的内部封装了流。
其内部封装了一个数组,而且通过数组的指针对元素进行操作,通过getFilePointer获取指针,通过seek改变指针位置。
只能操作文件,而且操作文件有四种模式:r rw rws rwd.
方法: read(各种基本数据类型), readLine();
RandomAccessFile raf = new RandomAccessFile("D:\\abc.txt","rw");
raf.getFilePointer();
raf.seek();
raf.readInt();
raf.writeInt();
一个汉子 为一个字符,两个字节,16bits. int型数据4个字节,33bits.
三、Object流,Data流,ByteArray流
1、对象的序列化:
ObjectInputStream/ObjectOutputStream:用于操作对象的流。 被操作的对象需要实现Serializable接口。
Class Person implements Serializable {
public static final longVersionId = 42L;
}
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("abc.txt"));
Person p = (Person)ois.readObject();
ois.close();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("xyz.txt"));
oos.writeObject(new Person("",""));
oos.close();
1、DataStream:基本数据类型流对象。
DataInputStream/DataOutputSteam可以用于操作基本数据类型的数据流对象。
常用方法:
readInt();readBoolean();readUTF();
1、ByteArrayStream:
用于操作字节数组的流对象,构造函数接受数据源。
流读写思想:
源设备 键盘System.in 硬盘FileStream 内存ByteArrayStream
目的设备控制台System.out 硬盘FileStream 内存:ByteArrayStream
FileInputStream fis = new FileInputStream("a.txt"); //创建字节输入流,关联a.txt ByteArrayOutputStream baos = new ByteArrayOutputStream(); //创建内存输出流 byte[] arr = new byte[5]; //创建字节数组,大小为5 int len; while((len = fis.read(arr)) != -1) { //将文件上的数据读到字节数组中 baos.write(arr, 0, len); //将字节数组的数据写到内存缓冲区中 } System.out.println(baos); //将内存缓冲区的内容转换为字符串打印 fis.close();