广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中字节流和字符流的理解(超精简!)
  • 277
分享到

Java中字节流和字符流的理解(超精简!)

2024-04-02 19:04:59 277人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录引言 字节流和字符流 字节流 字节输入流 字节输出流 字符流字符输入流 字符输出流 附:字节流和字符流的区别

引言 

在完完全全的完成本学期的学习任务之后,终于可以有时间继续更新Java相关的文章了。那么今天我们要学习的是的Java中的io流(I即为Input,O即为Output),也称为输入流,输出流,其主要的作用是为了能够对文件中的数据进行输入和输出(读和写),更加方便了今后我们在Java道路上的学习,好了,废话不多说,我们开始今天的学习吧!

字节流和字符流 

在上图中,橙色部分是抽象类,而蓝色部分则是实现类

字节流 

字节流,顾名思义就是将数据细分为字节对文件进行读和写的操作, 主要分为字节输入流和字节输出流。

字节输入流 

下面是字节输入流中经常会用到的构造器和方法:

构造器说明
public        FileInputStream(File file)创建字节输入流管道与源文件对象接通
public        FileInputStream(String pathname)创建字节输入流管道与源文件路径接通
方法名称说明
public int read()每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[ ] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

接下来通过代码更好的加深对这一部分知识点的理解吧!

File file = new File("File//data.txt");
        //第一种构造器,参数是File类
        InputStream inputStream = new FileInputStream(file);
        //第二种构造器,参数是文件的路径,可以是相对也可以是绝对的路径
        InputStream inputStream1 = new FileInputStream("File//data.txt");
        //通过字节读取文件中的数据
        int len;
        while ((len=inputStream.read()) != -1){
            System.out.print((char) len);
        }
        System.out.println();
        //通过字节数组读取文件中的数据
        byte [] buffer = new byte[3];
        while ((len=inputStream1.read(buffer))!=-1){
            String s = new String(buffer,0,len);
            System.out.print(s);
        }
//输出结果:
//ab1abab
//ab1abab

现在我们看到的输出结果和文件中的内容是一一对应的,那么它就一定是没有问题的了吗?其实并不是,只是还没有遇到问题而已,首先我们应该了解到的是,在utf-8中,字母和数字都是一个字节,而中文是由三个字节组成的,那么当我们的文件中出现汉字的时候,第一种方法就无法实现正常的读取了,因为每次都读取一个字节的原因会将汉字拆解,在输出的时候形成乱码的情况;而第二种则方法可以在特殊的情况下实现对汉字的输出,必须满足的条件是刚好中文的三个字节都在同一个字节数组中。

字节输入流并不适合所有的文件数据,由此而引出了字符输入流。

字节输出流 

下面是字节输出流常用到的方法:

方法说明
public void write (int a)写一个字节出去
public void write (byte [ ]buffer)写一个字节数组出去
public void write (byte [ ]buffer,int off, int len)将一个字节数组中的一部分写出去
file.close()流的关闭,不能再写数据
file.flush()流的更新,还可以继续写数据

 接下来通过代码更好的加深对这一部分知识点的理解吧!

OutputStream outputStream = new FileOutputStream("File//data.txt",true);
//true表示可以对文件进行追加内容,若没有true则会在关闭文件之后,进行写文件的时候会对之前的内容进行覆盖。
        outputStream.write('a');
        outputStream.write(13);
        outputStream.write('美');
        outputStream.flush();
        byte[] buffer = {'s','y','l','m',99};
        outputStream.write(buffer);
        outputStream.write(buffer,1,3);
        outputStream.close();

经过上面一系列操作以后,会将这些数据写进data.txt文件之中,但是仍然会出现问题,有时无法将中文正常的写进去,那么它也不是一个适合所有文件的,由此而引出了字符输出流。

字符流

字符流,顾名思义就是将数据细分为字符对文件进行读和写的操作, 主要分为字符输入流和字符输出流。 

字符输入流 

 下面是字符输入流中经常会用到的构造器和方法:

构造器说明
public FileReader (File file)创建字符输入流管道与源文件对象接通
public FileReader(String pathname)创建字符输入流管道与源文件路径接通
方法说明
public int read()每次读取一个字符返回,如果字符已经没有可读的返回-1
public int read(char [ ]buffer)每次读取一个字符数组返回,返回读取的字符个数,如果字符没有可读的返回-1

字符输入流的构造器和方法大致上和字节输入流的相同,不同的地方在于字符输入流是以字符为单位的读取,无论你是字母还是数字,都作为一个字符进行读取,这样便可以避免在读取中文的时候出现乱码的问题。

接下来通过一部分代码来加深对它的理解吧!

File file = new File("File//data.txt");
        //第一种构造器,参数是File类
        FileReader fileReader = new FileReader(file);
        //第二种构造器,参数是文件的绝对路径或者相对路径
        FileReader fileReader1 = new FileReader("File//data.txt");
        //第一种方法,一个一个字符读取
        int len;
        while ((len = fileReader.read())!=-1){
            System.out.print((char) len);
        }
        //第二种方法,以字符数组进行读取
        char []buffer = new char[3];
        while ((len = fileReader1.read(buffer))!=-1){
            String s = new String(buffer,0,len);
            System.out.println(s);
        }
//输出结果:
//110,119,120
//110
//,11
//9,1
//20

通过以字符为单位的读写,便可以避免在读取中文的时候出现乱码的问题了。

字符输出流 

 下面是字符输出流中经常会用到的构造器和方法:

构造器说明
public FileWriter(File file)创建字符输出流管道与源文件对象接通
public FileWriter(File file,boolean append)创建字符输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath)创建字符输出流管道与源文件路径接通
public FileWriter(String filepath,boolean append)创建字符输出流管道与源文件路径接通,可追加
方法说明
void writer(int c)写入一个字符
void writer (char [ ] buffer)写入一个字符数组
void writer (char[ ]buffer,int off,int len)写入字符数组的一部分
void writer(String str)        写入一个字符串
void writer(String str,int off,int len)写入字符串的一部分
close和flush输出流的关闭和刷新

接下来就通过代码来加深对它的理解吧!

FileWriter fileWriter = new FileWriter("File//data.txt");
        fileWriter.write('k');
        fileWriter.write('d');
        char []buffer = {'i','r','v','i','n','g'};
        fileWriter.write(buffer);
        fileWriter.flush();
        String s = "James";
        fileWriter.write(s);
        fileWriter.write(s,0,4);
        fileWriter.close();

字符输出流的使用便可以很好地解决了中文不能正常写入文件的问题了。 

附:字节流和字符流的区别

字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。

字节流默认不使用缓冲区;字符流使用缓冲区。

字节流在操作的时候本身是不会用到缓冲区的,是与文件本身直接操作的,所以字节流在操作文件时,即使不关闭资源,文件也能输出;字符流在操作的时候是使用到缓冲区的。如果字符流不调用close或flush方法,则不会输出任何内容。

字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

字节流和字符流的转换

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。在从字节流转化为字符流时,实际上就是byte[]转化为String时,而在字符流转化为字节流时,实际上是String转化为byte[]时。

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

字节流与字符流主要的区别是他们的的处理方式。

总结

到此这篇关于Java中字节流和字符流的文章就介绍到这了,更多相关Java字节流和字符流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中字节流和字符流的理解(超精简!)

本文链接: https://www.lsjlt.com/news/165264.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中字节流和字符流的理解(超精简!)
    目录引言 字节流和字符流 字节流 字节输入流 字节输出流 字符流字符输入流 字符输出流 附:字节流和字符流的区别...
    99+
    2022-11-13
  • Java中的字节,字符输出流与字节和字符输入流的简单理解
    目录字节输出流OutputStream字符输出流字节输入流InputStream字符输入流Reader字节流和字符流的区别总结我先解释一下什么叫IO流: I:指的是Inpu...
    99+
    2022-11-12
  • 【Java IO流】字节流和字符流的实例讲解
    字节流和字符流对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流。从对文件的操作来讲,有读和写的操作——也就是输入和输出。从流的流向来讲,有输入和输出之分。从流的内容来讲,有字节和字符之分。这篇文章先后讲解IO流中...
    99+
    2023-05-31
    字符流 字节流 java
  • Java超详细讲解IO操作字节流与字符流
    目录IO操作字节流FileInputStreamFileOutputStream字节流读写案例字符流FileReaderFileWriter字节流与字符流的区别IO操作 字节流 ...
    99+
    2022-11-13
  • java字符流和字节流的区别
    字符流:就是在字节流的基础上,加上编码,形成的数据流字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流。程序中所有的数据都是以流的方式进行传输或保存的,字节流主要操作type类型的数据,以type数...
    99+
    2022-01-19
    java基础 java
  • java字节流和字符流的区别
    java中什么是字节流?Java中的字节流有助于执行8位字节的输入和输出操作;它以stream结尾。换句话说,它逐字节处理数据,适用于处理二进制文件等原始数据。 (推荐...
    99+
    2015-08-27
    java教程 java
  • java中的字符流和字节流的区别
    字节流Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。InputStream类与Outp...
    99+
    2020-11-28
    java入门 java 字符流 字节流 区别
  • Java字节流和字符流及IO流的总结
    目录从接收输入值说起字节流读取字符流读取Scanner 读取什么是 IO 流字节流和字符流RandomAccessFile从接收输入值说起 在日常的开发应用中,有时候需要直接接收外部...
    99+
    2022-11-12
  • 详解Java中字符流与字节流的区别
    Java中字符流与字节流的区别1. 什么是流    Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列。和水流一样,Java中的流也具有一个“流动的方向”,...
    99+
    2023-05-31
    java 字符流 字节流
  • Java中的字节和字符输入流的简单介绍
    本篇内容介绍了“Java中的字节和字符输入流的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录字节输出流OutputStream字...
    99+
    2023-06-20
  • JAVA中IO操作的字节流和字符流实例分析
    这篇文章主要介绍了JAVA中IO操作的字节流和字符流实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JAVA中IO操作的字节流和字符流实例分析文章都会有所收获,下面我们一起来看看吧。IO操作字节流java...
    99+
    2023-06-29
  • 关于java中I/O流的字节流与字符流的详细介绍
    一、绪论如果要进行文件内容的操作那么必须依靠数据流完成,而数据流分为两种:字节流:InputStream(字节输入流)、OutputStream(字节输出流);字符流:Reader(字符输入流)、Writer(字符输出流);二、区别字节流是...
    99+
    2017-12-15
    java教程 java I/O 字节流 字符流
  • Java中IO操作字节流与字符流的示例分析
    这篇文章主要为大家展示了“Java中IO操作字节流与字符流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中IO操作字节流与字符流的示例分析”这篇文章吧。IO操作字节流java....
    99+
    2023-06-29
  • 图文详解Java中的字节输入与输出流
    目录字节输入流 字节输入流结构图FileInputStream类构造方法:常用读取方法:字节输出流 字节输出流结构图:FileOutputStream类构造方法:常用写入方法:总结字节输入流 java.io.InputStream抽象类是...
    99+
    2017-02-14
    java字节输入流和输出流 java文件输入输出字符流 java字节流
  • Java中字符串String的+和+=及循环操作String原理详解
    String对象是不可变的:意思就是无论是对String的新增或修改,出现一个全新的String内容时,都意味着诞生了一个新的对象。但是如果内容不变的话,增加的只是对象的引用而已。 ...
    99+
    2023-01-30
    java string字符串 java拼接字符串 java中的String
  • 关于JAVA中stream流的基础处理(获取对象字段和对象批量处理等)
    目录Stream流程处理情况1:按指定字段获取集合对象中的字段:2:按指定字段对集合对象进行排序:3: 按指定字段对集合对象去重处理4: 对集合对象批量处理5: 将集合对象中指定字段...
    99+
    2023-03-24
    java stream stream流 stream流基础
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作