📜  Java中的字符流与字节流 Character Stream对比Byte Stream

📅  最后修改于: 2020-03-24 11:14:45             🧑  作者: Mango

I / O流

流是一种顺序访问文件的方法。I/O流是表示不同类型的源(例如磁盘文件)的输入源或输出目标。java.io包提供了允许您在Unicode字符流和非Unicode文本的字节流之间进行转换的类。
:数据序列。
输入流:从源读取数据。
输出流:将数据写入目标。

角色流

在Java中,字符是使用Unicode约定存储的。字符流自动允许​​我们逐字符读取/写入数据。例如,FileReader和FileWriter是用于从源读取和写入目标的字符流。

// Java使用FileReader,读取人类可读的文件格式
import java.io.*;   // 获取 FileReader, FileWriter, IOException
public class GfG
{
    public static void main(String[] args) throws IOException
    {
        FileReader sourceStream = null;
        try
        {
            sourceStream = new FileReader("test.txt");
            // 读取文件,然后逐个字符,写入内容
            int temp;
            while ((temp = sourceStream.read()) != -1)
                 System.out.println((char)temp);
        }
        finally
        {
            // 关闭流
            if (sourceStream != null)
                sourceStream.close();
        }
    }
}

输出:

Shows contents of file test.txt

字节流

字节流逐字节(8位)处理数据。例如,FileInputStream用于读取源,FileOutputStream用于写入目标。

// Java展示使用字节流
import java.io.*;
public class BStream
{
    public static void main(String[] args) throws IOException
    {
        FileInputStream sourceStream = null;
        FileOutputStream targetStream = null;
        try
        {
            sourceStream = new FileInputStream("sorcefile.txt");
            targetStream = new FileOutputStream ("targetfile.txt");
            // 读取源文件,然后逐字节,写入目标文件
            int temp;
            while ((temp = sourceStream.read()) != -1)
                targetStream.write((byte)temp);
        }
        finally
        {
            if (sourceStream != null)
                sourceStream.close();
            if (targetStream != null)
                targetStream.close();
        }
    }
}

何时使用字符流而不是字节流? 

  • 在Java中,字符是使用Unicode约定存储的。当我们要处理文本文件时,字符流很有用。可以逐个字符地处理这些文本文件。字符大小通常为16位。

何时在字符流上使用字节流? 

  • 面向字节读取字节。字节流适用于处理原始数据,例如二进制文件。

笔记:

  • 字符流的名称通常以Reader / Writer结尾,字节流的名称以InputStream / OutputStream结尾
  • 示例代码中使用的流是非缓冲流,效率较低。我们通常将它们与缓冲的读取器/写入器一起使用,以提高效率。我们将很快讨论使用BufferedReader / BufferedWriter(用于字符流)和BufferedInputStream / BufferedOutputStream(用于字节流)类。
  • 如果不再使用流,则始终建议将其关闭。这样可以确保在发生任何错误时流都不会受到影响。
  • 上面的代码可能无法在在线编译器中运行,因为文件可能不存在。