关于Java的IO流

一.字节流

字节流分为 输入字节流和输出字节流,其中输入字节流对应着read,读取文件内容,字节输出流对应着write,向文件中写入,这里可以比喻成读书,知识就进入了脑海,所以是InputStream,写字是将脑海中的知识写出,所以是OutputStream。
在使用字节流时,不能直接使用,通常要经过处理流(这里涉及到装饰者模式)
装饰者模式:

在这里插入图片描述
演示:


/**
 * 一切都可以是字节流(inputStream,outputStream);
 * 还有字符流(read,write),字符流也可以看为是字节流
 * 字符流一般处理字符集的文件,而字节流所有都可以处理
 * 字节流需要处理流才有用(比如FileInputStream)*/
public class IOTest {
    public static void main(String[] args) throws IOException {

        InputStream is =null;
        //第一步选择源
        File file = new File("test.txt");
        try {
            //第二步选择流
            is= new FileInputStream(file);
            //第三步操作
            byte[] bytes=new byte[1024];//1k1k的进行读取
            int len=-1;
            //这里会将读取的长度赋值给len并将读取的元素赋值给
            // bytes,当没有元素的时候读到的是-1
            while ((len=is.read(bytes))!=-1){
               String s=new String(bytes,0,len);
                System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //第四步释放资源
            if(is!=null){
                is.close();
            }
        }

    }
}

public class OSTest {
    public static void main(String[] args) throws IOException {
        //第一步寻找源
        File file=new File("test.txt");
        FileOutputStream os =null;

        try {
            //第二步选择流,后面的append是选择是否在原有的基础上追加内容
            os=new FileOutputStream(file,true);
            //第三步操作
            String s="hell world";
            byte[] bytes=s.getBytes();//字符串转化成byte类型的数组
            os.write(bytes,0,s.length());
            os.flush();//每次写完刷新一下
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //第四步释放资源
            if(os!=null) os.close();
        }
    }
}

除了字节流,还有字符流,字符流适用于直接读取文本内容,更方便快捷:操作上有一点的小差异

public class ReaderTest {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        FileReader re =null;
        try {
            re= new FileReader(file);
            char[] chars=new char[1024];
            int len=-1;
            while((len=re.read(chars))!=-1){
                String s=new String(chars,0,len);
                System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(re!=null) re.close();
        }
    }
}

public class WriteTest {
    public static void main(String[] args) {
        File file = new File("test.txt");
        Writer wr =null;
        try {
           wr=new FileWriter(file,true);
           String s="我一路向北";
            /*第一种写法
            char[] chars = s.toCharArray();字符串转化为字符数组
            wr.write(chars,0,chars.length);
            */
          /*  //第二种写法直接写入
            wr.write(s);
            wr.flush();*/
          /*第三种写法*/
            wr.append("xij").append("xasda");
            wr.flush();//必须要刷新,不然会操作失败
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

缓冲流:用于提高效率,直接将原来的处理流套上即可,操作没什么改变:

/**
 * 字节输入缓冲流,只要将字节输出流放进构造里即可,操作还是和原来一样
 * 知识效率变高*/
public class BufferIS {
    public static void main(String[] args) {
        File file = new File("test.txt");
        FileInputStream is =null;
        try {
          is=new FileInputStream(file);
            BufferedInputStream BufferIS = new BufferedInputStream(is);
            int len=-1;
            byte[] bytes = new byte[1024];
            while((len=BufferIS.read(bytes))!=-1){
                String s=new String(bytes,0,len);
                System.out.println(s);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

缓冲字节输出流:

/**
 * 字节输出缓冲流,只要将字节输出流放进构造里即可,操作还是和原来一样
 * 知识效率变高*/
public class BufferOS {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        FileOutputStream os =null;
        BufferedOutputStream BufferOS =null;
        try {
          os= new FileOutputStream(file);
            BufferOS=  new BufferedOutputStream(os);
            String s="woyiluxiangbei";
            byte[] bytes = s.getBytes();
            BufferOS.write(bytes,0,s.length());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            BufferOS.close();
        }
    }
}

还有字符缓冲流,但是在原有的基础上提供了更加便利的方法,使操作更加简便:
在使用时候一定要注意不能使用多态!!!!

BufferReader提供了readLine()方法可以整行读取,不用再像原来那样麻烦

/**
 * 字符缓冲流,只要在原有的基础上套一层,就可以提高性能,
 * 操作一样*/
public class BReader {
    public static void main(String[] args) throws IOException {
      /*  第一种写法,只是普普通通的加上缓冲,但没有用新方法
        File file = new File("test.txt");
        Reader reader = new BufferedReader(new FileReader(file));
        int len =-1;
        char[] chars = new char[1024];
        while((len=reader.read(chars))!=-1){
            String s = new String(chars, 0, len);
            System.out.println(s);
        }*/
      //第二种采用新方法
        File file = new File("test.txt");
        //不能使用多态,即不能使用Reader reader=null
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String s=null;
        while ((s=reader.readLine())!=null){
            System.out.println(s);
        }
    }
}

而BufferedWriter则提供了newLine()进行换行

/**
 * 字符缓冲流,提高效率*/
public class BWriter {
    public static void main(String[] args) throws IOException {
     /* 第一种写法:没有用到新方法,只是在原有的基础上加缓冲流
        File file = new File("test.txt");
        Writer writer = new BufferedWriter(new FileWriter(file));
        String s="World";
        writer.write(s);
        writer.flush();*/
     //第二种写法,注意不能使用多态,即不能使用Writer w=null
        File file = new File("test.txt");
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        writer.append("Hello");
        writer.newLine();//新方法,无需在用/r/n进行换行,这个就代表换行
        writer.append("World");
        writer.flush();
    }
}

还有转化流:InputStreamReader,可以提供字符集

public class Inreader {
    public static void main(String[] args) {
        //InputStreamReader将字节流转化为字符流操作
        InputStreamReader isr = new InputStreamReader(System.in);
        //加入缓冲
        BufferedReader reader = new BufferedReader(isr);
        OutputStreamWriter osw = new OutputStreamWriter(System.out);
        //加入缓冲
        BufferedWriter writer = new BufferedWriter(osw);
        try{
            String msg="";
            while (!msg.equals("exit")){
                msg=reader.readLine();
                writer.write(msg);
                writer.newLine();
                writer.flush();
            }
            }catch (Exception e){

        }
    }
}

OutputStreamWriter:

public class OutWriter {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        FileOutputStream osm =null;
        OutputStreamWriter osw =null;
        BufferedWriter writer =null;
        try {
          osm= new FileOutputStream(file);
          //将字节流转化为字符流并指定字符集
           osw= new OutputStreamWriter(osm,"UTF-8");
           writer= new BufferedWriter(osw);
           String s="我一路向北";
           writer.write(s);
           writer.flush();//记住要刷新
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(writer!=null) writer.close();
            if(osw!=null) osw.close();
            if(osm!=null) osm.close();
        }
    }
}

打印流:

/**
 * 打印流*/
public class PWriter {
    public static void main(String[] args) throws FileNotFoundException {
        PrintStream ps=System.out;
        ps.println("xx");
       ps=new PrintStream(new BufferedOutputStream(new FileOutputStream("test.txt")),true);
       ps.println("Hello jay");
       ps.flush();//可以设置自动刷新

        //第二个打印流
        PrintWriter pw=new PrintWriter(new BufferedOutputStream(new FileOutputStream("test.txt")),true);
        pw.print("asfka");
        pw.flush();
    }
}

字节数组流:在网络编程的时候有需要

在这里插入图片描述
在这里插入图片描述

数据流:专门操作基本数据类型,字符串的

在这里插入图片描述

对象流:不仅可以操作基本数据类型,还可以操作对象,操作的对象必须序列化

/**
 * 操作对象的流,除了可以操作基本数据类型,还可以操作对象,其构造函数需要一个字节流*/
public class ObjectISOS {
    public static void main(String[] args) throws Exception {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeInt(1);//对象数组流同样可以操作基本数据类型
        person person = new person("jr",2);
        oos.writeObject(person);//写入对象
        oos.flush();
        byte[] bytes = bos.toByteArray();

        //读取
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(bis);
        int i = ois.readInt();//同样按照上面写入的顺序读取
        person o = (TestISOS.person) ois.readObject();
        System.out.println(o.getName()+"==>"+i);

    }
}
class person implements Serializable{
    private transient String name;//transient关键字修饰的属性不会被序列化
    private int age;

    public person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值