java :IO流

一、字符与字节
字节是计算机存储容量的度量单位 1byte =8bit

字符是指计算机中所使用的文字和符号,比如1、2、3、4、A、B、C、a、b、c、!、#、@、——》等等。

二、IO流的概述
打个比方:
北京—>火车站—>上海
北京:源头
火车站:Java
上海:目的地
北京进火车站:输入流
出火车站到上海:输出流

三、字节输入流
java.io.InputStream;抽象类,是所有字节输入流的父类
java.io.FileInputStream;文件字节输入流,继承了InputStream

换行符号
windows系统:\r\n
linux系统:/n
mac系统:/r

1、作用:
把硬盘文件数据读取到内存中

2、构造方法:
FileInputStream(String name)
FileInputStream(File file)

3、使用方法:
int read()
;从输入流的数据中,读取下一个字节。

int read(byte[] b)
:从输入流的数据中,读取多个字节,并将字节存储缓冲在b数组中。

void close()
:关闭输入流,释放资源,清理内存

读取数据的原理

java程序–>JVM(java虚拟机)–>OS(操作系统)–>OS调用读取数据的方法–>读取文件

 public static void main(String[] args) throws IOException{
        //创建文件字节输入流的对象,读取对象
        FileInputStream fis = new FileInputStream("D:\\IO\\B.txt");
        //使用字节输入流调用对象
        /*
        int l = fis.read();
        System.out.println(l);//97

        int l1 = fis.read();
        System.out.println(l1);//98
*/
        //每一个字节就要写一段代码,可以使用循环
        int len =0;
        while ((len=fis.read())!=-1){//-1是已经到末尾
            System.out.println(len);
        }
    }

文件输入字节流的String构造方法
String(byte[] bytes)
String(byte[] bytes, int offset, int length)

public static void main(String[] args) throws IOException {
    //创建文件字节输入流对象,并读取传递数据的对象
    FileInputStream fis = new FileInputStream("D:\\IO\\B.txt");

    /*
    //读取多个字节
    byte [] bytes =new byte[5];
    System.out.println(fis.read(bytes));//5
    System.out.println(new String(bytes));//abcdb

    //重复打印
    System.out.println(fis.read(bytes));//5
    System.out.println(new String(bytes));//cd好
    */

    //以上代码太繁琐,可以使用while
    byte [] b = new byte[1024];
    int len = 0;
    while ((len=fis.read(b))!=-1){
        System.out.println(len);//19

        //这种输出方法因为字节是1024个单位,所以输出打印后会有空格
       // System.out.println(new String(b));//abcdbcd好好学习(后面是空格)
        System.out.println(new String(b,0,len));//abcdbcd好好学习
    }
    fis.close();
}

四、字节输出流
java.io.OutputStream;抽象类,是所有字节输出流的父类
java.io.FileOutputStream;文件字节输出流,继承了OutputStream
1、作用:
从内存输出文件到硬盘中

2、原理
java程序–>JVM(java虚拟机)–>OS(操作系统)–>OS来调用写数据的方法–>写入到文件

3、构造方法
FileOutputStream(String name):写入的目的地是一个文件的路径
FileOutputStream(File file):写入的目的地是一个文件

4、使用方法
public abstract void write(int b)
:写入指定输出流(单个)

public void write(byte[] b)
:写入指定数组长度的输出流(多个)

public void write(byte[] b, int off, int len)
:在指定数组长度的基础上,使用索引值调用指定长度的字节

public void close() :释放资源,关闭输出流,清理内存

public static void main(String[] args) throws IOException{
    //创建文件字节输出流对象,并传递写入数据目的地
    FileOutputStream fos = new FileOutputStream("D:\\IO\\A.txt");//路径相对和绝对都可以
       //文件字节输出流对象调用write,文件写入数据
       fos.write(98);//,
       //释放资源
    fos.close();
}
public static void main(String[] args)throws IOException {
    //创建文件字节输出流对象,并传递写入数据到目的地
    FileOutputStream fos = new FileOutputStream("D:\\IO\\B.txt");

    //使用字节数组
    byte [] bytes ={97,98,99,100};
    fos.write(bytes);//在B.txt文档里会有abcd

    //在字节数组的基础选择一部分写入文本
    //1是索引值,3是从索引值起向后取出几个
    fos.write(bytes,1,3);//bcd

    //字符串转换字节
    byte[] bytes1 = "好好学习".getBytes();
    //用数组集合打印字节
    System.out.println(Arrays.toString(bytes1));
    //[-27, -91, -67, -27, -91, -67, -27, -83, -90, -28, -71, -96]
    //文本输出结果
    fos.write(bytes1);//好好学习
}
/*
使用IO流复制文件
1、先要创建文件字节输入流读取文件,读入数据
2、再创建文件字节输出流写入文件,写入文件到目的地
 */
 public static void main(String[] args) throws IOException{
    //创建文件字节输入流的对象,并读取数据对象
    FileInputStream fis = new FileInputStream("D:\\IO\\1.png");

    //创建文件字节输出流对象,并写入数据对象
    FileOutputStream fos = new FileOutputStream("C:\\a\\1.png");
/*
    //使用read方法读取文件字节
    int len =0;
    while ((len=fis.read())!=-1){
        fos.write(len);
        // System.out.println(len);
    }
    */

    //可以使用byte数组缓存读取多个字节
    //这样传输速度更快
    byte[] bytes = new byte[1024];
    int len = 0;
    while((len=fis.read(bytes))!=-1){
        fos.write(bytes,0,len);
    }

    //资源释放
    fos.close();
    fis.close();
}

五、字符输入流、字符输出流
java.io.Reader; 是字符输入流的父类
java.io.FileReader: 文件字符输入流

java.io.Writer:是字符输出流的父类
java.io.FileWriter:文件字符输出流

FileReader extends InputStreamReader extends Reader

构造方法和使用方法与字节输入流、输出流大同小异
一个是byte
一个是char

字符流可以直接输入字符串

fw.write("你好!")//你好!

六、缓冲流
概念:
从家里拿着一袋东西到一个地方

*如果是走路,东西存放在手上,东西拿的少,速度慢(输出流)

*如果开车,东西存放在车里,东西拿的多,而且速度快(缓冲输出流)

字节缓冲输入流:BufferedInputStream
字节缓冲输出流:BufferedOutputStream

java.io.BufferedIntputStream extends InputStream
java.io.BufferedOutputStream extends OutputStream

使用方法
因为继承所以方法大致和字节流一致

构造方法
要将 文件字节流 的 对象
传递到 字节缓冲输入流 或者 输出流 中

public static void main(String[] args) throws IOException{
  //创建一个文件字节输出流的对象,到哪个地方
    FileOutputStream fos = new FileOutputStream("D:\\IO\\A.txt");

    //创建字节缓冲输出流对象,传递fos
   BufferedOutputStream bos =new BufferedOutputStream(fos);

   //bos调用write方法,写入数据到缓冲区
    byte [] b  = {97,98,99};
    bos.write(b);

   // bos.write("\r\n".getBytes());//换行

    byte []bytes = "字节缓冲输出流".getBytes();
    bos.write(bytes);

    bos.flush();

    bos.close();
}
public static void main(String[] args) throws IOException{
    FileInputStream fis = new FileInputStream("D:\\IO\\A.txt");

    BufferedInputStream bis = new BufferedInputStream(fis);

    /*
    int len =0;
    while ((len=bis.read())!=-1){
        System.out.println(len);
    }
    */

    byte [] bytes =new byte[1024];
    int len =0;
    while((len=bis.read(bytes))!=-1){//注意bytes要传递进去
        System.out.println(new String(bytes,0,len));//abc缓冲字节输出流
    }

    bis.close();
}

七、字符缓冲输入流、字符缓冲输出流
BufferedReader:字符缓冲输入流
继承了Reader

BufferedWriter:字符缓冲输出流
继承了Writer

也要先传递 字符流 的 对象 到 字符缓冲流中

void newLine() 写入一个行分隔符
字符缓冲输出流的对象名.newLine;//换行

String readLine() 读取一个文本行。读取一行数据
可以使用循环

String line;
	//逐行读取缓冲流对象br中的文本
        while((line = br.readLine())!=null){
            System.out.println(line);
        }

八、转换流
InputStreamReader
outputStreamWriter

九、序列化流和反序列化流
序列化流: ObjectOutputStream
也就自定义类,把对象内容写到内存,字节形式存储
writeObject();

反序列化流: ObjectInputStream
从内存中读取出来
readObject();

创建自定义类时,必须实现一个空接口
Serializable接口
这个就是查看有没有序列化流,没有就会出现异常

十、打印流
PrintStream

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值