JavaWeb—IO(1)

本文介绍了Java中的IO流,包括流的概念、输入输出流、字节流和字符流的区别,以及字节缓冲流和字符缓冲流的作用。详细讲解了FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream、FileReader、FileWriter以及它们的缓冲流。还讨论了为何需要使用缓冲流以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 流的概念

:在 Java中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

1.按照流向分:输入流;输出流
2.按照处理数据的单位分:字节流(8位的字节);字符流(16位的字节)
3.按流的来源分:文件流;网络流

1.2 输入输出流

在这里插入图片描述

1.3字节流和字符流

在java.io包中,流分为两种:字节流与字符流

字节流:数据流中最小的数据单元是字节 。处理字节型二进制数据,InputStreamOutputStream
字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。处理字符型文本数据,ReaderWriter
在这里插入图片描述
      在这里插入图片描述

1.4 字节流

FileInputStream和FileOutStream

1 public class FileInputStream extends InputStream{ }

  • FileInputStream 从文件系统中的某个文件中获得输入字节。
  • FileInputStream 用于读取诸如图像数据之类的原始字节流。
方法解释
FileInputStream(File file)通过打开与实际文件的连接创建一个FileInputStream,该文件由文件系统中的File对象file命名
FileInputStream(String name)通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name 命名

2 public class FileOutputStream extends OutputStream{ }

  • 文件输出流是用于将数据写入到输出流 File 或一个 FileDescriptor 。文件是否可用或可能被创建取决于底层平台。
  • 特别是某些平台允许一次只能打开一个文件来写入一个 FileOutputStream (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
方法解释
FileOutputStream(File file)创建文件输出流以写入由指定的 File 对象表示的文件
FileOutputStream(String name )创建文件输出流以指定的名称写入文件

字节缓冲流BufferedInputStream和BufferedOutputStream

1public class BufferedInputStream extends FilterInputStream{ }

  • ufferedInputStream 为另一个输入流添加了功能,即缓冲输入和支持 markreset 方法的功能。 当创建 BufferedInputStream 时,将创建一个内部缓冲区数组。
  • 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节。 mark 操作会记住输入流中的一点,并且 reset 操作会导致从最近的 mark 操作之后读取的所有字节在从包含的输入流中取出新的字节之前重新读取。
方法解释
BufferedInputStream(InputStream in)创建一个 BufferedInputStream 并保存其参数,输入流 in ,供以后使用
BufferedInputStream(InputStream in,int size)创建一个 BufferedInputStream 指定缓冲区大小,输入流 in ,供以后使用

1public class BufferedOutputStream extends FilterOutputStream{ }

  • 该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
方法解释
BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流
BufferedOutputStream(OutputStream out, int size )创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流
为什么需要有缓冲流?

答:当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低 。文件过大时,操作起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高

1.5 字符流

FileReader 和 FileWriter

1 public class FileReader extends InputStreamReader{ }

  • 如果要从文件中读取内容,可以直接使用 FileReader 子类。
  • FileReader 是用于读取字符流。 要读取原始字节流,请考虑使用 FileInputStream.
方法解释
FileReader(File file)创建一个新的 FileReader ,给出 File 读取
FileReader(String fileName)创建一个新的 FileReader ,给定要读取的文件名称

2 public class FileWriter extends OutputStreamWriter{ }

  • 如果是向文件中写入内容,应该使用 FileWriter 子类
  • FileWriter 是用于写入字符流。 要编写原始字节流,请考虑使用 FileOutputStrea

字符缓冲流 BufferedReader 和 BufferedWriter

1 public class BufferedReader extends Reader{ }

  • 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
方法解释
BufferedReader(Reader in)创建使用默认大小的输入缓冲区的缓冲字符输入流
BufferedReader(Reader in, int size)创建使用指定大小的输入缓冲区的缓冲字符输入流

2 public class BufferedWriter extends Writer{ }

  • 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
为什么需要字符缓冲流

为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader 用于加快读取字符的速度, BufferedWriter 用于加快写入的速度

1.6字节流VS字符流

  1. 字节流操作的基本单元是字节;字符流操作的基本单元为Unicode码元。
  2. 字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;而字符流在操作的时候使
    用到缓冲区的。
  3. 所有文件的存储都是字节(byte)的存储,在磁盘上保留的是字节。
  4. 在使用字节流操作中,即使没有关闭资源(close方法),也能输出;而字符流不使用close方法的话,不会输出任何内容。

1.7 字符字节转换流

1 InputStreamReader是Reader的子类,将输入的字节流转换成字符流。
2 OutputStreamWriter是Writer的子类,将输出的字符流转换成字节流。

程序测试

import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {

        File file = new File("测试目录\\测试文件.txt");
        //file.createNewFile();
        OutputStream os = new FileOutputStream(file);//字节流

        //源是文件内容
        os.write("我是中国人".getBytes("UTF-8"));
        InputStream is = new FileInputStream(file);
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(len);
        String s = new String(buf, 0, len, "UTF-8");
        System.out.println(s);

        /*
        System.out.println(is.available());// 估算值,平时不要用
        int b;
        // 正确的方式 r
        while ((b = is.read()) != -1) {
            System.out.println(b);
        }
        */


        //源是内存中的一段byte[]
        /*
        String ss = "我是中国人";
        byte[] bytes = ss.getBytes();
        InputStream in = new ByteArrayInputStream(bytes);
        int b;
        while((b =in.read())!=-1){
            System.out.println(b);
        }
        */
    }
}
  1. FileInputStream 读文件
  2. FileOutputStream 写文件
  3. read()!=-1,就可以继续读
  4. 字符集String(buf,off,len,“UTF-8”);
  5. 不同的源
    FileInputStream 源是文件的内容
    ByteArrayInputStream 源是内存中的一段byte[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值