IO流之字节流与常见编码

本文详细介绍了Java中的IO流,重点讨论了字节流的抽象类、文件字节流及其缓冲流的使用,以及对象流的序列化与反序列化操作。此外,还探讨了常见的字符编码,如ASCII、Unicode和UTF-8,以及GBK编码的特点和应用。
摘要由CSDN通过智能技术生成

IO流

1.流的概念和分类

  • IO流核心组成
    • 核心组成:一个类(File)、一个接口(Serializable)、四个抽象类(InputStream/OutputStream、Reader/Writer)

思维

  • 什么是流

    • 流:内存与存储设备之间传输数据的通道
  • 流的分类

  • 按方向

    • 输入流:将<存储设备>中的内容读到<内存>中
    • 输出流:将<内存>中的内容写到<存储设备>中
  • 按单位

    • 字节流:以字节为单位,可以读写所有数据
    • 字符流:以字符为单位,只能读写文本数据
  • 按功能

    • 节点流:具有实际传输数据的读写功能
    • 过滤流:在节点流的基础之上增强功能

2.字节流

2.1字节流抽象类

  • InputStream

    • 此抽象类是表示字节输入流的所有类的父类。InputSteam是一个抽象类,它不可以实例化。数据的读取需要由它的子类来实现。根据节点的不同,它派生了不同的节点流子类。
    • 继承自InputSteam的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)
    • 常用方法:

      public int read(){}:读取一个字节的数据,并将字节的值作为int类型返回(0-255之间的一个值)。如果未读出字节则返回-1(返回值为-1表示读取结束)。while((data=fis.read())!=-1)来判断读取文件是否结束。
      public int read(byte[] b){} :从该输入流读取最多 b.length个字节的数据,并把读取的数据存放到b这个字符数组里面
      public int read(byte[] b, int off, int len){}
  • OutputStream

    • 此抽象类是表示字节输出流的所有类的父类。输出流接收输出字节并将这些字节发送到某个目的地
      public void write(int n):向目的地中写入一个字节
      public void write(byte[] b){} : 将 b.length个字节从指定的字节数组写入此文件输出流。
      public void write(byte[] b, int off, int len){}

2.2文件字节流

  • FileInputStream:

    • public int read(byte[] b) // 从流中读取多个字节,将读到内容存入 b 数组,返回实际读到的字节数;如果达到文件的尾部,则返回 -1
  • FileOutputStream:

    • public void write(byte[] b) // 一次写多个字节,将 b 数组中所有字节,写入输出流
2.21 文件字节输入流代码演示
package stream.demo01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/*
    FileInputStream 使用
    文件字节输入流

*/

public class FileInputStreamTest {
    public static void main(String[] args) throws IOException {
        // 1 创建FileInputStream 并指定文件路径
        FileInputStream fileInputStream = new FileInputStream("D:\\atext.txt");

        // 2 读取文件
        /*
         // 方式一:单字节读取
        int date=0;
        //int d1 = fileInputStream.read();  不可以在这里赋值给d1,不然就只是读了一个字节
        //必须加括号,不然不知道执行谁
        while ((date=fileInputStream.read())!=-1){
            System.out.print((char) date);
        }
        */
        // 方式二:一次读取多个字节(3)
        byte[] array=new byte[3];// 大小为3的缓存区
        /*
        int count = fileInputStream.read(array);
        //System.out.println((new String(array)));// 一次读3个
        String  s  = new String(array);
        System.out.println(s);

        int count2 = fileInputStream.read(array);
        System.out.println(new String(array));// 再读3个

        int count3=fileInputStream.read(array);
        System.out.println(new String(array));
*/

        // 上述优化后
        int count=0;
        //返回读取到了多少个元素,如果没有读取到返回-1
        while ((count=fileInputStream.read(array))!=-1){
            System.out.println(new String(array,0,count)); // new String(bytes, 0, count) 转换字符串从bytes的0下标开始,读count个字符串

        }
        // 3 关闭
        fileInputStream.close();
        System.out.println();
        System.out.println("执行完毕");

    }
}



运行结果
abc
def
gha
bcd
efg
hab
cde
fga
bcd
efg
hab
cde
fgh
abc
def
ghh
abc
def
gha
bcd
efg
h

执行完毕


2.22 文件字节输出流代码演示
package stream.demo01;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
   文件输出流的使用
    FileOutputStream

*/

public class FileOutputStreamTest {
    public static void main(String[] args) throws IOException {
        // 1 创建文件字节输出流
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\fff.txt",true);// true表示不覆盖 接着写
        /*
        // 2 写入文件
        fileOutputStream.write(97);
        fileOutputStream.write('b');
        fileOutputStream.write('c');
        fileOutputStream.write('d');
        fileOutputStream.write('e');
        */

        byte[] bytes = new byte[10];
        String st="hello world";
        fileOutputStream.write(st.getBytes());//getBytes():获取字节数据
        //getBytes(String charsetName):使用指定的字符集将字符串编码为byte序列,并将结果存储到一个新的byte数组中


        // 3 关闭
        fileOutputStream.close();
        System.out.println("复制完成");
    }
}



运行结果
复制完成

fff


2.23 文件字节流复制文件代码演示
package stream.demo01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

//使用字节流实现文件的复制
public class StreamCopyTest {
    public static void main(String[] args) throws IOException {
        // 1 创建流
        // 1.1 文件字节输入流
        FileInputStream fis = new FileInputStream("D:\\a50.jpg");
        // 1.2 文件字节输出流
        FileOutputStream fos = new FileOutputStream("D:\\b50.jpg");

        // 2 边读边写
        byte[] bytes = new byte[1024*5];
        int count=0;
        while ((count=fis.read(bytes))!=-1){
            fos.write(bytes,0,count);
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值