io


前言

提示:谨以此篇


提示:以下是本篇文章正文内容,下面案例可供参考

一、字节流的分类?

流可分为节点流和处理流
节点流:直接从数据源读取数据
处理流(包装流):其他流进行包装,目的是提高性能

1.从文件中读取出来的字节打印时为其编码值

FileInputStream in=new FileInputStream(“r.txt”)
int b=0;
while(true){
b=in.read();一次读取一个字节
if(b==-1)
{break;
}System.out.println((char)b);
}
in.close();

2.复制文件(打开文件后会自动编码成字符)

代码如下(示例):

FileInputStream in=new FileInputStream("D:/2串讲名词代词形容词副词.pdf");//读取
		FileOutputStream out=new FileOutputStream("D:/textpdf.pdf");
		int len;
		while((len=in.read())!=-1) {
			out.write(len);
		}
		in.close();
		out.close();

为了提高效率可以建立一个字节数组,一次读数组长度的字节

FileInputStream in=new FileInputStream(f);
		byte[] b2=new byte[1024];
		int len=in.read(b2)一次性读1024 个字节;
		while(len!=-1) {
			File f2=new File("new.txt");
			FileOutputStream out2=new FileOutputStream(f2);
			out2.write(b2,0,len)这里用3个参数的方法;
			//out2.write(b2);该方法是将b2.length 个字节从指定字节数组写入此文件输出流中。
			len=in.read(b2);
		}

byte字节数组是每次读取1024个字节后会一次覆盖上一次的位置,假如最后读取的字节为1000<1024,则会把后面的24个字节也复制过去,则可能导致乱码。


write(int b) 将指定字节写入此文件输出流. write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中。

二、字符流

当程序需要在控制台打印文件内容时,若文件中包含中文则char(字节)会出现乱码,这时需用到字符流。

FileWriter write=new FileWriter("write.txt");
		String str=("哇");
		write.write(str);
		write.close();
		FileReader reader=new FileReader("write.txt");
		int ch;
		while((ch=reader.read())!=-1){
			System.out.println((char)ch);
		}
		reader.close();

注意:eclipse默认使用gbk编码,当txt文件用utf-8编码保存,读取时会出现乱码。
解码:字节,字节数组–》字符,字符数组
编码:字符,字符数组–》字节,字节数组

三、缓冲区(内置byte[8192])

BufferedInputStream
BufferedOuputStream
BufferedReader
BufferedWriter
readline()方法

使用不带缓存的inputstream时
每次你读取时,系统执行读取操作把数据读出来,你指定读一个字节那就读一个字节,指定一个数组那就读一个数组的,你的程序和数据的读取效率有非常大的关系。
而使用bufferedinputstream时,是这样的
当你创建bufferedinputstream,后他会立即去读数据然后放到jvm管理的内存里,
每次你读取时,他不会再去系统中读取,会去内存中读取数据,之后再判断内存中剩的还多不,不多就再由它去指挥系统读取操作,不论你是读一个字节还是一个数组,系统都不一定会去操作硬盘。
你的程序和数据读取的效率关联就非常微小了。
换个角度想,
如果你用不带buffer的流,打开文件然后立即关闭,系统不会有任何数据调用,关闭会很快执行。
而你用带buffer的流打开文件,哪怕没读取就立即执行关闭了,这个关闭也不会立即执行,而且系统也已经把一部分数据读取的内存了,会比用不带buffer的效率低。
————————————————
版权声明:本文为CSDN博主「skypiea9」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yusufolu9/article/details/53886841

四、转换流

InputStreamReader和OutputStreamWriter
构造方法
public InputStreamReader(InputStream in)
public InputSreamReader(InputStream in,String charsetName)
如: Reader isr = new
InputStreamReader(System.in,”ISO5334_1”);

五、打印流,数据流和对象流

打印流:PrintStream PrintWriter(只有输出流,没有输入流)
PrintStream(File file)
数据流:DataInputstream DataOutputstream:用来读写基本数据类型和string类型。

   FileOutputStream t=new FileOutputStream("D://JAVA.TXT");
		BufferedOutputStream b=new BufferedOutputStream(t);
		DataOutputStream d=new DataOutputStream(b);
		d.writeInt(2);
		d.writeByte(123);
		d.writeBoolean(true);
        d.writeDouble(3.14);
        d.close();//必须关流,不然传不进去
        System.out.println("ok");
        FileInputStream in=new FileInputStream("D:/JAVA.TXT");
        DataInputStream i=new DataInputStream(in);
        System.out.println(i.readInt());
        System.out.println( i.readByte());
        System.out.println( i.readBoolean());
        System.out.println(i.readDouble());
        //必须对应
        i.close();

对象流:ObjectInputstream ObjectOutputstream:用来读写任意类型

六、序列化:serializable

持久化:将内存中的数据保存入硬盘(内存中的数据不能一直保存)
被持久化的类必须进行序列化(实现这个接口)
public class student implements Serializable{
private String name;
private int age;
private transient int password;//瞬态变量 阻止序列化(设置为static也可以)接收端的密码接收不到,为0
private static final long serialVersionUID = 1L;

对象储存在文件中会默认设置serialVersionUID,在代码中Bean类也会有个serialVersionUID,在读取时如果更改Bean类的属性会导致serialVersionUID不同,读取时报错(java.io.InvalidClassException),所以最好统一,方便后期更改属性。
serialVersionUID 用于表示本地对象和获取的对象是不是同一个类型

}

student s=new student("libai",12,123123);
		ObjectOutputStream o=new ObjectOutputStream(new FileOutputStream("D:/object.txt"));
		o.writeObject(s);
		ObjectInputStream i=new ObjectInputStream(new FileInputStream("D:/object.txt"));
		System.out.println(i.readObject());
打印:student [name=libai, age=12, password=0]

序列化从文件拿出的对象和放入的对象不相等
在javaweb中在客户端打印图片要用到
ServletOutputStream out=resp.getOutputStream();

FileInputStream in =new FileInputStream("D:\\javawork\\java\\Mybatis\\image\\ta.jpg");
        BufferedInputStream bin =new BufferedInputStream(in);
        ServletOutputStream outputStream = resp.getOutputStream();
        int read =-1;
        while((read=bin.read())!=-1){
            outputStream.write(read);
        }
        outputStream.close();
        bin.close();
        in.close();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值