IO流——字节流

常见字符集

标准ASCII码字符集

  • ASCII(American Standard Code for Information Interchange):美国信息交换标准代码,包括英文、符号等
  • 标准ASCII码使用1个字节存储一个字符,首位是0,总共可表示128个字符
    在这里插入图片描述

而对于国内而言,汉字和字符多达几万个,很明显ASCII码是不够用的,所以便推出了我们的汉字编码字符集——GBK


GBK(汉字内码扩展规范,国标)

  • 汉字编码字符集,包含了两万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储
  • GBK规定,汉字的第一个字节的首位必须是1
  • GBK兼容了ASCII字符集,事实上,绝大多数字符集都兼容了ASCII


    Unicode字符集(万国码,也叫统一码)
  • Unicode是国际组织制定的,可以容纳世界上所有文字及符号的字符集,如UTF - 32、UTF - 16及UTF - 8,其中最常用的是UTF - 8
  • UTF - 8:Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节、2个字节、3个字节和4个字节。英文字符、数字等只占1个字节(兼容ASCII码),汉字字符占3个字节

字符集的编码、解码操作

  • Java对字符编码
String提供的方法说明
byte[] getBytes()使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName)使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  • Java对字符解码
String提供的方法说明
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的String
String(byte[] bytes, String charsetName)通过指定的字符集解码指定的字节数组来构造新的String

演示

public class charsetTest {
    public static void main(String[] args) throws UnsupportedEncodingException {
        /* 编码*/
        String data = "abc一蓑烟雨任平生bcd";
        // 默认按平台字符集进行编码,这里使用的是UTF-8,中文3个字节
        byte[] bytes = data.getBytes();
        System.out.println(Arrays.toString(bytes));
        // 27
        System.out.println(bytes.length);

        // 按照指定字符集进行编码,GBK中文2个字节
        byte[] bytesGBK = data.getBytes("GBK");
        // 20
        System.out.println(bytesGBK.length);

        /* 解码 */
        String s1 = new String(bytes);
        // 平台配置的是UTF-8,所以,在对UTF-8编码的bytes解码时不需要指定字符集
        System.out.println(s1);

        // bytesGBK指定的编码是GBK,在使用默认编码UTF-8对其解码时会出现乱码
        String s2 = new String(bytesGBK);
        // abcһ��������ƽ��bcd
        System.out.println(s2);

        // 指定GBK对bytesGBK解码即可正常显示
        String s3 = new String(bytesGBK,"GBK");
        System.out.println(s3);
    }
}

IO流

IO流概述

  • I:指Input,称为输入流,负责把数据读到内存中区
  • O:指Output,称为输出流,负责写数据出去

IO流分类

  • 按流的方向分为输入流输出流
  • 按流中数据的最小单位分为字节流字符流,其中字节流适合操作所有类型的文件,如音频、视频、图片等,而字符流知识和操作纯文本文件,如:读写txt、doc、java文件等

总结流的四大类(抽象类)

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流——> InputStream
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流——> OutputStream
  • 字符输入流:以内存为基准,来自碰盘文件/网络中的数据以字符的形式读入到内存中去的流——> Reader
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流——> Writer

FileInputStream(文件字节输入流)

  • 作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去
构造器说明
public FileInputStream​(File file)创建字节输入流管道与源文件接通
public FileInputStream​(String pathname)创建字节输入流管道与源文件接通
方法名说明
public int read()每次读取一个字节返回,如果发现没有数据可读会返回-1
public int read(byte[] buffer)每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1
public byte[] readAllBytes() throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回

案例1

public class FileInputStreamTest {
    public static void main(String[] args) throws Exception {
        // 创建文件字节输入流管道,与源文件接通
//        InputStream is = new FileInputStream(new File("oop3\\src\\com\\ligemanyin\\_IO\\EnTest.txt"));
        InputStream is2 = new FileInputStream("oop3\\src\\com\\ligemanyin\\_IO\\EnTest.txt");

        int b;
        // read()一次只能读取一个字节,导致其无法读取中文字符,因为中文字符是3个字节
        while ((b = is2.read()) != -1) {
            System.out.print((char) b);
        }
        // 关闭流,释放资源
        is2.close();
    }
}

案例2

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception{
        // 创建一个字节输入流对象代表字节输入流管道与源文件接通
        File file = new File("oop3\\src\\com\\ligemanyin\\_IO\\ChTest.txt");
        InputStream is = new FileInputStream(file);

        // 开始读取文件中的字节数据:每次读取多个字节
//        byte[] buffer = new byte[(int) file.length()];
//        int len = is.read(buffer);
//        String rs = new String(buffer);
//        System.out.println(rs);
//        System.out.println(len);

        // 或
        byte[] buffer2 = is.readAllBytes();
        System.out.println(new String(buffer2));
        // 关闭流,释放资源
        is.close();
    }
}

其中EnTest.txt中只写入了一句英文短句,而ChTest.txt中则写入张若虚的《春江花月夜》


FileOutputStream(文件字节输出流)

  • 作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去
构造器说明
public FileOutputStream(File file)创建字节输出流管道与源文件对象接通
public FileOutputStream(String filePath)创建字节输出管道与源文件路径接通
public FileOutputStream(File file, boolean append)创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream(String filePath, boolean append)创建字节输出流管道与源文件路径接通,可追加数据
方法名说明
public void write(int a)写一个字节出去
public void write(byte[] buffer)写一个字节数组出去
public void write(byte[] buffer, int pos, int len)写一个字节数组的一部分出去
public void close() throws IOException关闭流

演示1

public class FileOutputStreamTest1{
    public static void main(String[] args) throws Exception {
        // 创建一个字节输出流管道与目标文件接通
        OutputStream op = new FileOutputStream("oop3\\src\\com\\ligemanyin\\_IO\\_FileOutPutStream\\outTest1.txt");

        // 写字节数据出去
        // 97一个字节-->a
        // abc
        op.write(97);
        op.write('b');
        op.write(99);
        // abc万里悲秋常作客,百年多病独登台
        byte[] bytes = "万里悲秋常作客,百年多病独登台".getBytes();
        op.write(bytes);
        // UTF-8中七个字21个字节
        // // abc万里悲秋常作客,百年多病独登台万里悲秋常作客
        op.write(bytes, 0, 21);

        // 以上构造器是将txt文本清空后进行写出
        // 以下构造器可不用清空文本,在文本后添加数据
        // 首先进行换行,方便区分,ASCII码中,10表示LF(Line Feed),即换行
        // 亦或是"\r\n"进行换行,通过getBytes()方法转换
        op.write(10);
        // OR op.write("\r\n".getBytes())
        OutputStream op2 = new FileOutputStream("oop3\\src\\com\\ligemanyin\\_IO\\_FileOutPutStream\\outTest1.txt", true);
        byte[] bytes2 = "艰难苦恨繁霜鬓,潦倒新停浊酒杯".getBytes();

        /*abc万里悲秋常作客,百年多病独登台万里悲秋常作客
        艰难苦恨繁霜鬓,潦倒新停浊酒杯*/
        op2.write(bytes2);
        op2.close();
        op.close();
    }
}

演示2

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception{
        // 创建一个字节输入流对象代表字节输入流管道与源文件接通
        File file = new File("oop3\\src\\com\\ligemanyin\\_IO\\ChTest.txt");
        InputStream is = new FileInputStream(file);

        // 开始读取文件中的字节数据:每次读取多个字节
//        byte[] buffer = new byte[(int) file.length()];
//        int len = is.read(buffer);
//        String rs = new String(buffer);
//        System.out.println(rs);
//        System.out.println(len);

        // 或
        byte[] buffer2 = is.readAllBytes();
        System.out.println(new String(buffer2));
        // 关闭流,释放资源
        is.close();
    }
}

案例

public class CopyPictureTest {
    public static void main(String[] args) throws Exception{
        // 复制图片
        // 源文件
        InputStream is = new FileInputStream("F:\\Data\\picture\\图片1.jpg");
        // 目标文件
        OutputStream os = new FileOutputStream("F:\\Data\\picture\\picture.jpg");
        byte[] bytes = is.readAllBytes();
        os.write(bytes);

        // 先关后流,先流后关
        os.close();
        is.close();
        System.out.println("复制完成");
    }
}

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Closeable Closeable 是可以关闭的数据源或目标。 DataInput DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。 DataOutput DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。 Externalizable Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。 FileFilter 用于抽象路径名的过滤器。 FilenameFilter 实现此接口的类实例可用于过滤器文件名。 Flushable Flushable 是可刷新数据的目标地。 ObjectInput ObjectInput 扩展 DataInput 接口以包含对象的读操作。 ObjectInputValidation 允许验证图形中对象的回调接口。 ObjectOutput ObjectOutput 扩展 DataOutput 接口以包含对象的写入操作。 ObjectStreamConstants 写入 Object Serialization Stream 的常量。 Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。 类摘要 BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 BufferedOutputStream 该类实现缓冲的输出流。 BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 ByteArrayInputStream ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。 ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。 CharArrayReader 此类实现一个可用作字符输入流的字符缓冲区。 CharArrayWriter 此类实现一个可用作 Writer 的字符缓冲区。 Console 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。 DataInputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。 DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。 File 文件和目录路径名的抽象表示形式。 FileDescriptor 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。 FileInputStream FileInputStream 从文件系统中的某个文件中获得输入字节。 FileOutputStream 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。 FilePermission 此类表示对文件和目录的访问。 FileReader 用来读取字符文件的便捷类。 FileWriter 用来写入字符文件的便捷类。 FilterInputStream FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。 FilterOutputStream 此类是过滤输出流的所有类的超类。 FilterReader 用于读取已过滤的字符流的抽象类。 FilterWriter 用于写入已过滤的字符流的抽象类。 InputStream 此抽象类是表示字节输入流的所有类的超类。 InputStreamReader InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。 LineNumberInputStream 已过时。 此类错误假定字节能充分表示字符。 LineNumberReader 跟踪行号的缓冲字符输入流。 ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。 ObjectInputStream.GetField 提供对从输入流读取的持久字段的访问权限。 ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。 ObjectOutputStream.PutField 提供对要写入 ObjectOutput 的持久字段的编程访问。 ObjectStreamClass 类的序列化描述符。 ObjectStreamField Serializable 类中 Serializable 字段的描述。 OutputStream 此抽象类是表示输出字节流的所有类的超类。 OutputStreamWriter OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。 PipedInputStream 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。 PipedOutputStream 可以将管道输出流连接到管道输入流来创建通信管道。 PipedReader 传送的字符输入流。 PipedWriter 传送的字符输出流。 PrintStream PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 PrintWriter 向文本输出流打印对象的格式化表示形式。 PushbackInputStream PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。 PushbackReader 允许将字符推回到流的字符流 reader。 RandomAccessFile 此类的实例支持对随机访问文件的读取和写入。 Reader 用于读取字符流的抽象类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离歌慢饮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值