Maison  >  Article  >  Java  >  Quelles sont les similitudes et les différences entre le flux d'octets JAVA et le flux de caractères lors de la lecture et de l'écriture ?

Quelles sont les similitudes et les différences entre le flux d'octets JAVA et le flux de caractères lors de la lecture et de l'écriture ?

php是最好的语言
php是最好的语言original
2018-08-08 09:52:351863parcourir

java处理文件的类里面,stream结尾都是采用字节流,reader和writer结尾都是采用字符流。两者的区别就是读写的时候一个是按字节读写,一个是按字符。

字符流的底层就是字节流。而字符流主要是读取文本文件内容的,可以一个字符一个字符的读取,也可以一行一行的读取文本文件内容。而字节流读取单位为byte.byte作为计算机存储最基本单位,可以用字节流来读取很多其他格式的文件,比如图片视频等等。基于B/S和C/S的文件传输都可以采用字节流的形式。在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。 (注:除了字符和字节流之外,java还有一种叫对象流。有兴趣可以去查API学习一下。)

字节流就是按照字节来进行传输,字符流是按照字符来传输.最基本的是字节流,字符流可以说是对字节流的一个包装流.比如你知道了一个字符是8个字节,那么你让字节流一次传输8个字节,那不就相当于一次传输一个字符,也就是字符流了。

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?
实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图

Quelles sont les similitudes et les différences entre le flux doctets JAVA et le flux de caractères lors de la lecture et de lécriture ?

下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。
范例:使用字节流不关闭执行

// 通过字节流 写文件
public static void ByteWrite() {
    File file = new File("d:\\test\\test.txt");
    try {
        OutputStream outputStream = new FileOutputStream(file);
        String textString = "Hello World!!!";
        byte[] data = textString.getBytes();
        outputStream.write(data);
        //outputStream.close();
    } catch (IOException e) {
        System.out.println("字节流写入文件出错。");
        e.printStackTrace();
    }
}

复制代码
程序运行结果:

Quelles sont les similitudes et les différences entre le flux doctets JAVA et le flux de caractères lors de la lecture et de lécriture ?

此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继续使用字符流完成,再观察效果。
范例:使用字符流不关闭执行

// 通过字符流 写文件
public static void StringWrite() {
    File file = new File("d:\\test\\test.txt");
    try {
        FileWriter writer = new FileWriter(file);
        String textString = "Hello World!!!";
        writer.write(textString);
        // writer.flush();
        // writer.close();
    } catch (IOException e) {
        System.out.println("字符流写入文件出错.");
        e.printStackTrace();
    }
}

复制代码
程序运行结果:
Quelles sont les similitudes et les différences entre le flux doctets JAVA et le flux de caractères lors de la lecture et de lécriture ?

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而   在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。
提问:什么叫缓冲区?
在很多地方都碰到缓冲区这个名词,那么到底什么是缓冲区?又有什么作用呢?
回答:缓冲区可以简单地理解为一段内存区域。
可以简单地把缓冲区理解为一段特殊的内存。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

提问:使用字节流好还是字符流好?
学习完字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是字符流好呢?
回答:使用字节流更好。
在回答之前,先为读者讲解这样的一个概念,所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
字节流与字符流主要的区别是他们的的处理方式
流分类: 1.Java的字节流    InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。 2.Java的字符流   Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。 InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new

Le flux d'octets est le plus basique, toutes les sous-classes de InputStream et OutputStream le sont, principalement utilisées pour traiter des données binaires, elles sont traitées par octets, mais en réalité beaucoup de données sont du texte, et des caractères sont également proposés. Le concept de flux est traité en fonction du codage de la machine virtuelle, c'est-à-dire que le jeu de caractères est converti. Les deux sont liés via InputStreamReader et OutputStreamWriter. En fait, ils sont liés via byte[] et String, qui apparaissent dans le développement réel. les problèmes de caractères sont en fait causés par l'incohérence dans la conversion entre le flux de caractères et le flux d'octets
Lors de la conversion du flux d'octets en flux de caractères, c'est en fait lorsque byte[] est converti en String, public String( byte bytes[], String charsetName) a un codage de jeu de caractères de paramètre clé. Habituellement, nous l'omettons, le système utilise alors la langue du système d'exploitation. Lorsque le flux de caractères est converti en flux d'octets, String est en fait converti en byte[ ], la même chose est vraie. for byte[] String.getBytes(String charsetName)
Comme de nombreux autres flux apparaissant dans java.io, ils visent principalement à améliorer les performances et la facilité d'utilisation, comme BufferedInputStream, PipedInputStream, etc.

Recommandations associées :

Explication du flux d'octets et du flux de caractères dans le flux Java IO

Flux de caractères et flux d'octets en Java Introduction détaillée aux différences

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn