标签:黑马程序员
------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
黑马程序员——25,打印流,合并流,对象序列化,管道流,RandomAccessFile
/*
IO流的打印流:专门用于打印的流
字节打印流PrintStream
PrintStream的构造函数可以接收file对象,String型字符串路径,字节输出流
字符打印流PrintWriter
PrintWriter的构造函数可以接收file对象,字符串路径,字节输出流,字符输出流
PrintWriter有刷新方法。写的时候记得刷新。
*/
import java.io.*; class Ioliou25 { public static void main(String[] args)throws IOException { File f=new File("f:\\yyyyyyyk.txt"); BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); // PrintWriter pw=new PrintWriter(System.out,true);//这个带true的就自动刷新,不用写flush方法了 //InputStreamReader是字节与字符的桥梁 //PrintWriter pw=new PrintWriter(f,true);//这种写法编译错误,PrintWriter类没有这种构造函数 /* PrintWriter构造函数里面可以带true的只有 PrintWriter(OutputStream out,boolean autoFlush) PrintWriter(Writerout, boolean autoFlush) */ // PrintWriter pw=new PrintWriter(System.out); PrintWriter pw=new PrintWriter(new FileWriter(f),true);//使用FileWriter嵌套f的话就可以带true String s=null; while((s=bufr.readLine())!=null) { if(s.equals("over"))//设置结束语句 break; // pw.write(s.toUpperCase()); //没有换行 pw.println(s.toUpperCase());//这个使用println方法更为常见 //pw.flush(); } bufr.close(); pw.close(); } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线————
/* 切割文件 */ import java.io.*; import java.util.*; class Ioliou27 { public static void main(String[] args)throws IOException { //qiege(); //hebing(); hebing2(); } publicstatic void qiege()/*切割文件*/throws IOException { File f=new File("f:\\8.11\\8.11练习.png");//建立文件对象 FileInputStream fis=new FileInputStream(f);//关联目的文件 FileOutputStream fos=null; int i=0,k=0; byte[] by=new byte[1024*10]; while((i=fis.read(by))!=-1) { k++; fos=new FileOutputStream("f:\\8.11\\8.11练习"+k+".part"); //每一次循环k值都不同所以对应有不同的关联的碎片文件 fos.write(by,0,i); } fis.close(); fos.close(); } public static void hebing()/*合并文件*/throws IOException { ArrayList<FileInputStream> al=new ArrayList<FileInputStream>(); //这里采用的是ArrayList集合 for(int x=1;x<=4;x++) { al.add(new FileInputStream("f:\\8.11\\8.11练习"+x+".part")); //把与文件相关联的流装进集合中 } final Iterator<FileInputStream> it= al.iterator(); //被匿名内部类访问的局部成员要被final修饰 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:\\8.11\\8.11练习合并.png"); int i=0; byte[] by= new byte[1024]; while((i=sis.read(by))!=-1) { fos.write(by,0,i); } sis.close(); fos.close(); } public static void hebing2()/*第二种合并方法*/throws IOException { Vector<FileInputStream> v=new Vector<FileInputStream>(); for(int x=1;x<=4;x++) { v.add(new FileInputStream("f:\\8.11\\8.11练习"+x+".part")); } Enumeration<FileInputStream> en=v.elements(); SequenceInputStream sis=new SequenceInputStream(en); FileOutputStream fos=new FileOutputStream("f:\\8.11\\8.11练习合并2.png"); int i=0; byte[] by=new byte[1024*10]; while((i=sis.read(by))!=-1) { fos.write(by,0,i); } sis.close(); fos.close(); } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线——————
/*
对象的序列化
ObjectInputStream和ObjectOutputStream的使用。
序列化就是把对象储存在硬盘上。
*/
/*
实现了Serializable接口,那么该类会用uid号标识。
uid号与成员有关。
如果类中的成员发生变化,uid就会相应的发生变化。
当然也可以自动指定该类的固定uid
办法是在该类中添加:
public static final long serializableUID=42L;
其中举一个例子说明uid的作用:
第一次编译Per类所在java文件而产生的.class文件,
然后再编译运行主函数所在的java文件,把对象存储在硬盘上,
此时java会给Per类自动生成uid,由Per类生成的对象则是对应
也会有相同的uid
接着增删改Per类的成员,第二次编译Per类所在的java文件
而产生的.class文件对应的uid会变化的!第二次编译运行主函数
所在的java文件需要读取对象的时候就会报出运行异常。因为,
已经储存在硬盘里面的对象的uid号是第一次的uid号,Per类所在的
java文件第二次产生的.class文件的uid号与对象的uid号不同,所以
就会出现异常。
为了解决这个问题,在Per类中添加
public static final long serializableUID=42L;
就使得无论Per类怎么改动都只有对应一个uid号。
Per类的对象uid号也是这个,Per类编译产生的.class文件uid号也是这个。
对象在硬盘上的写入和读取都对应同一个uid号,就不会发生异常了。
*/
import java.io.*; import java.util.*; class Ioliou28 { public static void main(String[] args)throws Exception { // xieru(); duqu() ; } public static void xieru() throws Exception { File f=new File("f:\\北方.txt"); FileOutputStream fos=new FileOutputStream(f); ObjectOutputStream oops=new ObjectOutputStream(fos); oops.writeObject(new Per("呼呼呼",26,"jkl")); //写入对象,写入的对象所属的类必须是实现了Serializable借口 oops.close(); } public static void duqu() throws Exception { File f=new File("f:\\北方.txt"); FileInputStream fos=new FileInputStream(f); ObjectInputStream oips=new ObjectInputStream(fos); Object obj=oips.readObject();//readObject方法返回的是Object类型的对象 //readObject方法会抛出一个ClassNotFoundException,为了简便,抛出都是Exception Per p =(Per)obj; oips.close(); soc(p); } public static void soc(Object obj) { System.out.println(obj); } } import java.io.*; import java.util.*; class Per implements Serializable { //public static final long serializableUID=42L; static String name="无名";//静态成员不能被序列化 private int age; transient String country="cn";//transient修饰的成员也不能被序列化 Per(String name, int age,String country) { this.name=name; this.age=age; this.country=country ; } public String toString() { return name+":"+age+":"+country; } }
——————分割线——————
/*
管道流:
PipedInputStream PipedOutputStream
管道输入流和管道输出流可以连接,与多线程密切相关。
一般是一条线程负责管道输入流,一条线程负责管道输出流。
*/
class Read() implements Runnable throws IOException { private PipedInputStream pis=null; Read(PipedInputStream pis) { this.pis=pis; } public void run() { int i=0; byte[] by=new byte[1024]; while((i=pis.read(by))!=-1) { //填写内容 } } } class Write() implements Runnable throws IOException { private PipedOutputStream pos=null; Write(PipedOutputStream pos) { this.pos=pos; } public void run( ) { // int i=0; // byte[] by=new byte[1024]; pos.write("huhuhu".getBytes()); } } import java.io.*; class Ioliou29 { public static void main(String[] args)throws IOException { PipedInputStream pis=new PipedInputStream(); PipedOutputStream pos=new PipedOutputStream(); pis.connect(pos);//管道输入流和管道输出流连接 Read r=new Read(pis); Write w=new Write(pos); Thread t1=new Thread(r); Thread t2=new Thread(w); t1.start(); t2.start(); } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线——————
/*
RandomAccessFile类是IO包的成员
随机访问,这个类应用的很广,
里面封装了字节写入流和字节读取流,
所以具备了读写的功能,
但是只是针对文件才可以进行操作,不能对路径进行操作。
操作文件还需要模式:
常用的两种模式:"r"只读,"rw"读写。
该类里面还封装了非常大的数组,还有一个指针指示数组。
通过getFilePointer方法获得指针位置,
通过seek方法指定指针位置
*/
import java.io.*; class Ioliou30 { publicstatic void main(String[] args) throws IOException { write(); read(); } public static void write()throws IOException { File f=new File("f:\\学习.txt"); RandomAccessFile raf=new RandomAccessFile(f,"rw");//关联文件并确定操作模式 //如果文件不存在会自动创建 raf.write("一二三".getBytes()); raf.writeInt(56);//写入数字时最好用writeInt,以32位形式写入 raf.write("四五六".getBytes()); raf.writeInt(85);//写入数字时最好用writeInt,以32位形式写入 } public static void read()throws IOException { File f=new File("f:\\学习.txt"); RandomAccessFile raf=new RandomAccessFile(f,"rw");//关联文件并确定操作模式 soc("raf.getFilePointer()="+raf.getFilePointer());//getFilePointer方法返回内部数组指针位置 //raf.seek(2);//调整内部数组的指针指向第2位 byte[] by=new byte[4]; raf.read(by);//按照字节数组读取 String s=new String(by);//按照字节数组转成字符串 int i= raf.readInt();//按照32位读取数据 soc(s); soc(i); } public static void soc(Object obj) { System.out.println(obj); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
黑马程序员——25,打印流,合并流,对象序列化,管道流,RandomAccessFile
标签:黑马程序员
原文地址:http://blog.csdn.net/dangaodeaiyi/article/details/47608655