博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习笔记(20)
阅读量:4691 次
发布时间:2019-06-09

本文共 4891 字,大约阅读时间需要 16 分钟。

IO流:

按照数据的流向分类:

  • 输入流
  • 输出流

判断使用输入流还是输出流的依据:以当前程序作为参照物,观察数据是流入还是流出,如果流出则使用输出流,如果数据是流入,则使用输入流。

按照处理的单元划分:

  • 字节流:字节流读取的都是文件中的二进制数据,读取到二进制数据u不会经过任何的处理
  • 字符流:字符流处理的数据是以字符为单位的,字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能识别的字符

字符流=字节流+解码

输入字节流

---------| InputStream 所有输入字节流的基类 抽象类
--------------| FileInputStream 读取文件数据的输入字节流
使用FileInputStream读取文件数据的步骤:

  1. 找到目标文件
  2. 建立数据的输入通道
  3. 读取文件的数据,使用流对象的read方法即可
  4. 关闭资源
package cn.itcast.input;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;/*  输入字节流 ---------| InputStream    所有输入字节流的基类        抽象类 --------------| FileInputStream    读取文件数据的输入字节流  使用FileInputStream读取文件数据的步骤:      1.找到目标文件      2.建立数据的输入通道      3.读取文件的数据,使用流对象的read方法即可     4.关闭资源      */public class Demo1 {    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        readTest1();        readTest2();        readTest3();        readTest4();    }        //方式一:缺陷:无法读取完整一个文件的数据    public static void readTest1() throws IOException {        //找到目标文件        File file=new File("E:\\a.txt");        //建立数据的输入通道        FileInputStream fileInputStream=new FileInputStream(file);        //读取文件中的数据        int content = fileInputStream.read();//读取一个字节的数据,把读到的数据返回        System.out.println("读到的内容是:"+ (char)content);        //关闭资源        实际上就是释放资源        fileInputStream.close();    }        //方式二:使用循环读取文件的数据    public static void readTest2() throws IOException {        File file=new File("E:\\a.txt");        FileInputStream fileInputStream=new FileInputStream(file);        int content=0;//声明该变量用于存储读取到的数据        while ((content=fileInputStream.read())!=-1) {            System.out.print((char)content);        }        fileInputStream.close();    }        //方式三:使用缓冲数组读取    缺点:无法读取完整一个文件的数据    public static void readTest3() throws IOException {        //找到目标文件        File file = new File("E:\\a.txt");        FileInputStream fileInputStream=new FileInputStream(file);        //建立缓冲字节数组,读取文件的数据        byte[] buf=new byte[(int)file.length()];        int length=fileInputStream.read(buf);//数据已经存储到了byte数组中了,如果使用read读取数据传入字节数组,那么数据是存储到了字节数组中的,而这时候read方法的返回值是表示本次读取了几个字节数据到字节数组中        //使用字节数组构建字符串        String str=new String(buf);        System.out.prin  tln("内容:"+str);        //System.out.println(length);        //关闭资源        fileInputStream.close();    }        //方式四:使用缓冲数组配合循环一起读取    public static void readTest4() throws IOException {        File file = new File("E:\\a.txt");        FileInputStream fileInputStream=new FileInputStream(file);        //建立缓冲数组配合循环读取文件的数据        int length=0;        byte[] buf=new byte[4];        while ((length=fileInputStream.read(buf))!=-1) {            System.out.print(new String(buf, 0, length));        }        fileInputStream.close();    }}结果:读到的内容是:aabcadafafad内容:abcadafafadabcadafafad

使用缓冲数组的效率更高(方法四)

缓冲数组一般是1024的倍数,这样符合计算机的运算单位

 

输出字节流:

-----------------|  OutputStream是所有输出字节流的父类  抽象类

FileOutputStream使用步骤:

  1. 找到目标文件
  2. 建立数据的输出通道
  3. 把数据写出,使用write方法,一次写一个字节
  4. 关闭资源

写出时可以使用字节数组把数据写出  byte【】

注意:

  • 使用FileOutputStream的时候,如果目标文件不存在,那么会自动创建目标文件对象
  • 使用FileOutputStream写数据的时候,如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据
  • 使用FileOutputStream写数据的时候,如果目标文件已经存在,需要在原来数据基础上追加数据的时候,应该使用new FileOutputStream(file,true)这个构造函数,第二个参数为true。
  • 使用FileOutputStreamd的write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是把低八位的二进制数据写出,其他二十四位数据全部丢弃

 创建目标文件对象是建立管道的那句代码执行的,可以用debug看

关闭资源 原则:先开后关,后开先关

缓冲输入字节流:BufferedInputStream  为了提高读取文件数据的效率

其实该类内部只不过是维护了一个8KB的字节数组而已

注意:凡是缓冲流都不具备读写文件的能力

BufferedOutputStream要注意的细节:

  1. 使用BufferedOutputStream写数据的时候,它的write方法是先把数据写到它内部维护的字节数组中
  2. 如果需要把数据真正写到硬盘上面,需要调用flush方法或者是close方法,或者是内部维护的字节数组已经填满数据的时候
package cn.itcast.buffered;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class Demo2 {    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        //找到目标文件        File infile=new File("D:\\1.jpg");        File outFile=new File("E:\\1.jpg");        //建立数据的输入输出通道        FileInputStream fileInputStream=new FileInputStream(infile);        FileOutputStream fileOutputStream=new FileOutputStream(outFile);        //建立缓冲输入输出流        BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);        BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);        //边读边写        int content=0;        while ((content=bufferedInputStream.read())!=-1) {
//传入缓冲数组时候,返回的是读取的字节个数,没传入的时候,返回的是读取到的内容 bufferedOutputStream.write(content); //bufferedOutputStream.flush(); 不需要每次传入一点东西就刷,填满了自动会刷,最后一次传入的还有后面的close解决 } //关闭资源 bufferedOutputStream.close(); bufferedInputStream.close(); }}结果:

拷贝图片

转载于:https://www.cnblogs.com/zhangwugai/p/11182174.html

你可能感兴趣的文章
【小白的CFD之旅】19 来自计算网格的困惑
查看>>
将Winform程序快速转换为在浏览器中运行的程序
查看>>
dfhg发过火刚开始
查看>>
APIO2010 特别行动队
查看>>
super关键字
查看>>
多线程爬虫实现(下)
查看>>
GraphQL(二):GraphQL服务搭建
查看>>
JS中的函数浅析
查看>>
干货 | LVS虚拟服务器简介
查看>>
包教不包会系列-javascript 原型链与继承
查看>>
Python学习教程:玩转树莓派—搭建属于自己的云盘服务
查看>>
Python学习教程:用Python做一个三阶拼图
查看>>
关于OI中的各种数学(持续更新)
查看>>
Codeforces 1203F2. Complete the Projects (hard version)
查看>>
P3158 [CQOI2011]放棋子
查看>>
Codeforces 1220B. Multiplication Table
查看>>
P3153 [CQOI2009]跳舞
查看>>
P1080 国王游戏
查看>>
BZOJ 1629. [Usaco2007 Demo]Cow Acrobats
查看>>
BZOJ 1634. [Usaco2007 Jan]Protecting the Flowers 护花
查看>>