Java之IO流进阶篇:内存流,打印流,对象流
程序员文章站
2022-03-26 21:53:16
Java中的IO流,即为输入输出流。所谓输入输出流,都是相对于程序而言,程序就是这个参照物。一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputStream,Writer 输入输出流子类众多,详情见下图: 1.内存流 用来操作内存 ByteArr ......
java中的io流,即为输入输出流。所谓输入输出流,都是相对于程序而言,程序就是这个参照物。一张图看懂输入输出流:
输入流抽象基类:inputstream,reader
输出流抽象基类:outputstream,writer
输入输出流子类众多,详情见下图:
1.内存流
用来操作内存
bytearrayinputstream 内存到程序 不需要关闭 不使用内存资源,内存不够建议不用
bytearrayoutputstream 程序到内存 不需要关闭 不使用内存资源,内存不够建议不用
内存输入流和内存输出流:
首先创建字节数组,一般引用数据类型存放在内存中。显然此时,可以创建字节数组输入流,读入程序当中。
package com.test; import java.io.bytearrayinputstream; import java.io.ioexception; public class bytearrayinputstreamdemo { public static void main(string[] args) throws ioexception { // todo auto-generated method stub //1.创建字节数组(要读取的数据) byte[] data= {10,15,50,33,12,22}; //2.创建流 bytearrayinputstream bais=new bytearrayinputstream(data); //3.读取 // int d; // while((d=bais.read())!=-1) { // system.out.println(d); // } // bais.close();//实际操作中无需关闭流 byte[] buf=new byte[1024]; int len; while((len=bais.read(buf))!=-1) { for (int i = 0; i < len; i++) { system.out.println(buf[i]); } } } }
package com.test; import java.io.bytearrayoutputstream; public class bytearrayoutputstreamdemo { public static void main(string[] args) { // todo auto-generated method stub //1.创建字节数组输出流对象 bytearrayoutputstream baos=new bytearrayoutputstream(); //2.写入数据 baos.write(12); baos.write(20); baos.write(18); baos.write(32); //3.获取输出流中的字节数据 byte[] data=baos.tobytearray(); for (byte b : data) { system.out.println(b); } } }
使用内存流读取图片:
package com.test; import java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; public class readimg { public static void main(string[] args) throws ioexception { // todo auto-generated method stub //1.创建文件字节输入流 fileinputstream fis=new fileinputstream("e:\\xx.png"); bytearrayoutputstream baos=new bytearrayoutputstream(); byte[] buf=new byte[1024]; //2.读取数据 int len; while((len=fis.read(buf))!=-1) { baos.write(buf,0,len); } //3.获取图片数据 byte[] imgbyte=baos.tobytearray(); system.out.println(imgbyte.length); //4.创建文件输出流 fileoutputstream fos=new fileoutputstream("e:\\xx1.png"); bytearrayinputstream bais=new bytearrayinputstream(imgbyte); //5.读取数组 byte[] buf1=new byte[1024]; int len1; while((len1=bais.read(buf1))!=-1) { fos.write(buf1,0,len1); } fis.close(); fos.close(); bais.close(); baos.close(); } }
2.打印流
printsream:操作字节,自动刷新,可设置字符集
printwriter :不能操作字节,内部有缓冲区
打印字节流实例:
package com.test; import java.io.bufferedoutputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.printstream; public class printstreamdemo { //打印流(字节) public static void main(string[] args) throws ioexception { // todo auto-generated method stub //printstream ps=new printstream("e:\\aaa.txt"); bufferedoutputstream bos=new bufferedoutputstream(new fileoutputstream("e:\\xx.txt")); printstream ps=new printstream(bos,true); ps.print("123456"); ps.print(true); ps.println("abcdef"); ps.printf("%d", 200); ps.printf("%.2f", 3.1415926); ps.printf("%s", "我爱生活"); ps.printf("%x", 256); } }
打印字符流实例:
package com.test; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.filewriter; import java.io.ioexception; import java.io.printwriter; public class printwriterdemo { public static void main(string[] args) throws ioexception { // todo auto-generated method stub printwriter pw=new printwriter(new fileoutputstream("e:\\bbb.txt")); pw.println("123"); pw.close(); } }
3.对象序列化与反序列化(对象流)
本例举一个学生类student.class序列化和反序列化的过程。
创建的学生类:
package com.test; import java.io.serializable; public class student implements serializable { private static final long serialversionuid=123l;//序列化与反序列化的唯一标记 private int stuno;//序列化和访问权限没有关系 string name; //transient int age;//transient 瞬时的,不能序列化瞬时的属性 //static string address="北京";//静态变量不能被序列化 public student() { super(); // todo auto-generated constructor stub } public student(int stuno, string name) { super(); stuno = stuno; this.name = name; } public int getstuno() { return stuno; } public void setstuno(int stuno) { stuno = stuno; } public string getname() { return name; } public void setname(string name) { this.name = name; } }
使用对象类序列化和反序列化学生类:
package com.test; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.objectinputstream; import java.io.objectoutputstream; public class serializedemo { public static void main(string[] args) throws ioexception, classnotfoundexception { //序列化过程: //1.创建序列化对象 student stu=new student(1101,"小明"); //2.创建文件输出流 fileoutputstream fos=new fileoutputstream("e:\\receive.bin"); //3.创建对象流接入输出流 objectoutputstream oos=new objectoutputstream(fos); //4.对象流输出序列化对象保存在文件中 oos.writeobject(stu); oos.close(); //反序列化过程: //1.创建对象流 fileinputstream fis=new fileinputstream("e:\\receive.bin") ; objectinputstream ois=new objectinputstream(fis); //2.反序列化 student stu1=(student)ois.readobject(); ois.close(); system.out.println("学号:"+stu1.getstuno()); system.out.println("姓名:"+stu1.getname()); } }
控制台输出信息(表明反序列化成功):