Java中的字节输出流和字节输入流

185 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

Java中的字节输出流和字节输入流

什么是流?

  • 流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道。
  • 输入流是相对程序而言的,外部传入数据给程序需要借助输入流。
  • 输出流是相对程序而言的,程序把数据传输到外部需要借助输出流。

需要

       (1)掌握字节输出流类FileOutputStream的特点及使用。

       (2)掌握字节输入流类FileInputStream的特点及使用。

       (3)掌握利用自己输入流和字节输出流进行文件内容拷贝的操作。

FileOutputStream类中相关方法的使用:

字节输出流操作步骤:

       A:创建字节输出流对象

       B:调用write()方法

       C:释放资源

       public void write(int b):写一个字节

       public void write(byte[] b):写一个字节数组

       public void write(byte[] b,int off,int len):写一个字节数组的一部分

    FileOutputStream fos=new FileOutputStream("fos2.txt");
    fos.write(97);
    byte[] bys={97,98,99,100,101};
    fos.write(bys);
    fos.write(bys, 2, 3);
    fos.close();

FileInputStream流类一次读入一个字节数据的方法:

字节输入流操作步骤:

       A:创建字节输入流对象

       B:调用read()方法读取数据,并把数据显示在控制台

       C:释放资源

读取数据的方式:

       A:int read():一次读取一个字节

       B:int read(byte[] b):一次读取一个字节数组

    FileInputStream fis=new FileInputStream("fis.txt");
    int b=0;
    while((b=fis.read())!=-1){
        System.out.print((char)b);
    }
    fis.close();

FileInputStream流类一次读入一个字节数组数据的方法:

       一次读取一个字节数组:int read(byte[] b)

       返回值其实是实际读取的字节个数。

    FileInputStream fis=new FileInputStream("fis.txt");
    byte[] bys=new byte[1024];
    int len=0;
    while((len=fis.read(bys))!=-1){
        System.out.print(new String(bys,0,len));
    }
    fis.close();

分析中英文字符的编码差异:

       计算机是如何识别什么时候该把两个字节转换为一个中文呢?

在计算机中中文的存储分两个字节:

       第一个字节肯定是负数。

       第二个字节应该也是负数

原因分析:

        Java 对字符采用Unicode编码,且兼容英文的Ascii码,Ascii码使用一个字节的低七位编码,最高位不用置为0,按数值输出则为正数;而一个中文字符用两个字节表示,为与英文字符区别,每个字节的最高位为1,按数值输出则为负数。

字节输入输出流以一次读写一个字节的方式实现文本文件及非文本文件拷贝的方法:

       复制文本文件。

数据源:从哪里来

       a.txt   --     读数据    --     FileInputStream    

目的地:到哪里去

       b.txt   --     写数据    --     FileOutputStream

    int b=0;
    while((b=fis.read())!=-1){
        fos.write(b);
    }

利用字节输入输出流以一次读写一个字节数组的方式实现文本文件及非文本文件拷贝的方法:

    byte[] bys=new byte[1024];
    int len=0;
    while((len=fis.read(bys))!=-1){
        fos.write(bys, 0, len);
    }

理解String类关于字符串的编解码:

       String str=new String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组

       byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组

编码:把字符串转换成二进制数据

       String -- byte[]

解码:把二进制数据转换成字符串

       byte[] -- String

理解转换流中的编解码:

       InputStreamReader(InputStream is):用默认的编码读取数据

       InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据

       OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流

       OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转

字符输出流将字符写出到文件的方法:

       由于我们常见的操作都是使用本地默认编码,所以,不用指定编码。而转换流的名称有点长,所以,Java就提供了其子类供我们使用。

       OutputStreamWriter = FileOutputStream + 编码表(GBK)

       FileWriter = FileOutputStream + 编码表(GBK)

OutputStreamWriter的方法:

       public void write(int c):写一个字符

       public void write(char[] cbuf):写一个字符数组

       public void write(char[] cbuf,int off,int len):写一个字符数组的一部分

       public void write(String str):写一个字符串

       public void write(String str,int off,int len):写一个字符串的一部分