java Io流学习(二) 字节流

来源:互联网 发布:阿里云域名咋续费 编辑:程序博客网 时间:2024/05/19 13:15

一、IO流分类

 IO流若按照流的方向可以分为

输出流(内容从程序内存到磁盘文件的过程,即向文件中添加内容)的类:OutputStream,Writer.

输入流(内容从磁盘空间到程序内存的过程,即从文件中读取内容)的类:InputStream,Reader.

按照操作对象也可以分为:

字节流(操作对象是单个字节)的类:InputStream,OutputStream.

字符流(操作对象是单个字符)的类:Reader,Writer.

因此IO流的顶级父类就是InputStream,OutputStreamReader,Writer,其余的流类都是继承于这4个类,因此只需要了解4个父类的属性方法,基本子类操作就没有多大问题

二、InputStream(字节输入流)

    InputStream是java所有的字节输入流的父类,其本质是一个抽象类,因此实例化父类对象的时候一般通过子类对象向上实例化,而对于InputStream的API只需要了解几个常规的即可(下面会举实例展示各个APi的作用)


1、read()方法

package com;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;public class Test5 {public static void main(String[] args) throws Exception {   File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan"   //InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象   InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream//read()方法,单字节读取,返回的int就是读取到的字节的int表示方式,byte c[]=new byte[1024]; //创建字节数组,用于存储读取出来的字节int z=0;int x=0;while((z=stream.read())!=-1){ //进入循环c[x]=(byte)z; //注意要转成字节然后存放到存放到字节数组中去x++;}stream.close();System.out.println(new String(c)+"1");}}

2、read(byte[])方法

package com;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;public class Test4 {    public static void main(String[] args) throws Exception {        File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan"//    InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream//read(byte[])方法,一次读取,返回读取成功的字节个数,同时字节会读入到数组中--较为方便byte b[]=new byte[1024];int i=stream.read(b); stream.close();System.out.println(i);System.out.println(new String(b,0,i));}}

3、read(byte b[],int off,int len)

package com;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;public class Test6 {public static void main(String[] args) throws Exception {  File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan"   //InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象   InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream//read(bytep[] b,int off ,int len)方法,从输出流中读取最多len个字节到数组中,从下表0ff开始添加数据   int len=(int)file.length();      byte[] b=new byte[1024];      int i=0;while((i=stream.read(b, 0, len))!=-1){  //等于是多次调用read()方法,单个字节单个字节的读取,知道len个字节为止System.out.println(new String(b));}stream.close();}

    以上3个方法运行的结果都是“zhangsan”,但是追究效率来说,建议使用read(byte[] b )方法较好,一次读入,注意在建立数组的时候的长度,可以根据流的长度来确认,避免占用较多内存


三、OutputStream (字节输出流)

    OutputStream是javaio流中所有输出流的父类,因此同上述的输入流一样,只需要了解其常用API即可(重点在write方法)


1)write(int b)方法

package com;import java.io.*;public class Test7 {public static void main(String[] args) throws Exception { File file=new File("D:"+File.separator+"c.txt");//创建file对象,注意此时我的D盘是没有c.txt的文件的  //流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容   //OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象   OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStream//write(int b)方法,注意参数是字节的int型位数,而不是常规intString str="hello";byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节for (int i = 0; i < b.length; i++) {stream.write(b[i]);}stream.close();}}

2)write(byte[])方法


package com;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;public class Test8 {public static void main(String[] args) throws Exception {File file=new File("D:"+File.separator+"c.txt");//创建file对象,注意此时我的D盘是有c.txt的文件的  //流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容   //OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象   OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStreamString str="zhangsan";byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节stream.write(b); //一次输出整个数组stream.close();}}

3)write(byteb [] ,int off,int len )

package com;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;public class Test9 {public static void main(String[] args) throws Exception {File file=new File("D:"+File.separator+"c.txt");//创建file对象,注意此时我的D盘是有c.txt的文件的  //流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容   //OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象   OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStreamString str="wagnwu";byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节int len=b.length-1; //少取一个字节stream.write(b, 0, len);//等于是单个单个字节输出stream.close();}}

    以上3个write()方法的结果,请自行运行查看,仔细观察会发现,三种方法的情况的话,后两种方法效率会较高(第二种一次性输出所有字节,第三种获取字节只输出想要的部分内容),另注意,输出流操作完毕后记得运行close()方法



原创粉丝点击