Java IO流与文件(一)

Java IO流与文件(一)

基本概念

  1. 输入输出(I/O):指程序与外部设备或其他计算机交互的操作
    • 通过输入输出从外界接收信息或传递信息给外界
    • Java将其通过接口实现,使程序简单
    • 指在计算机输入输出操作中各部件间的数据流动,是一组有序的数据集合
      • 有方向
      • 代表数据输入源或数据输出目的
      • 屏蔽实际I/O数据处理细节,使输入输出独立于设备
      • 分类
        • 按传输方向分:输入流和输出流
        • 按数据处理单位分:字节流和字符流
        • 按流功能分:节点流、处理流
      • 其数据可为原始二进制数据或经处理的特定格式的数据
    • 输入输出流
      • 称为数据流
      • 是Java程序发送和接收数据的通道
      • 输入流是从存储介质或数据通道读数据,输出流是向存储介质或数据通道写数据
      • 特性
        • 数据获取与发送均沿数据序列顺序进行
        • 先进先出
        • 一个流只有一个功能,只读或只写,
      • 目的:使程序输入输出独立于相关设备
        • 对于输入输出设备,只需针对流做处理,无需关心和修改源程序细节,增强了程序可移植性
    • 缓冲流
      • 一个流配备一个缓冲区
        • 缓冲区:用于传送数据的内存块
      • 向一个缓冲流写入数据时,系统将数据转发到缓冲区
        • 缓冲区自动记录数据
        • 当缓冲区满时,系统数据全发送到外部设备
      • 缓冲流从缓冲区读数据
        • 缓冲区为空时,从外部设备自动读取数据并尽可能填满缓冲区
    • 节点流和处理流
      • 节点流:指从某个特定的数据源(节点)读/写数据的流
      • 处理流:必须套接在已存在的流之上,为已存在的流提供更丰富特性
        • 被套接的流可以是节点流也可以是处理流

I/O流类

概述

  1. Java提供了java.io包,其中每个类代表一种特定输入/出流
  2. 其输入输出流可按处理数据单位不同分两类:面向字节和面向字符
    • 面向字节流:数据处理以字节为基本单位
      • 每次读取8位二进制数,也称二进制字节流或位流
        • 即最小数据单元为字节
        • 能处理文本文件和二进制文件数据
      • 以Stream结尾
      • InputStream类和OutputStream类:是所有字节流的父类
        • InputStream:InputSt体系结构
          • 主要子类
            功能
            FileInputStream从文件中读取输入流
            PipedInputStream输入管道
            FilterInputStream过滤输入流
            ByteArrayInputStream从字节数组读取输入流
            SequenceInputStream两个或多个输入流的联合输入流,按顺序读取
            ObjectInputStream对象的输入流
            LineNumberInputStream为文本文件输入流附加行号
            DataInputStream包含读取Java标准数据类型方法的输入流
            BufferedInputStream缓冲输入流
            PushbackInputStream返回一个字节,并将该字节放回输入流
          • 常用方法
            方法说明
            void close()关闭输入流
            void mark()标记输入流当前位置
            void reset()将读取位置返回到标记处
            int read()从输入流中当前位置读入一个字节的二进制数据,以此数据为低位字节,补足16位的整型量(0~255)后返回,若输入流中当前位置没有数据,则返回-1
            int read(byte b[])从输入流中当前位置连续多个字节保持在数组中,并返回所读取的字节
            int read(byte b[],int off,int len)从输入流中当前位置连续len长的字符,从数组第off+1个元素位置开始存放,并返回所读取字节数
            int available()返回输入流中可读取的字节数
            long skip(long n)略过n个字节
            boolean markSupported()测试输入数据是否支持标记
      • OutputStream:OutputStream
        • 主要子类
          说明
          FileOutputStream写入文件的输出流
          PipedOutputStream输出管道
          FilterOutputStream过滤输出流
          ByteArrayOutputStream写入字节数组的输出流
          ObjectOutputStream对象的输出流
          DataOutputStream包含写Java标准数据类型方法的输出流
          BufferedOutputStream缓冲输出流
          PrintStream包含print()和println()的输出流
        • 常用方法
          方法说明
          void close()关闭输出流
          void flush()强制清空缓冲区并执行向外设输出数据
          void write(int b)将参数b的低位字节写入到输出流
          void write(byte b[])按顺序将数组b[]中全部字节写入到输出流
          void write(byte b[],int off,int len)按顺序将数组b[]中第off+1个元素开始的len个数据写入到输出流
        • 字节流写数据换行方式:
          • Windows系统为:\r\n
          • linux为:\n
          • mac为:\r
      • InputStream和OutputStream都是抽象类,故程序中创建的输入流对象一般是它们某个子类的对象,通过调用对象继承的read()和write()方法就可实现对相应外设的输入输出操作
    • 面向字符流:用于字符数据的处理
      • 一次读取16位二进制数,并作为字符而非二进制位处理
        • 即最小数据单元为字符
      • Java内部字符均使用Unicode编码,一个字符占两个字节
        • 字符流可将该内部格式按本地字符集自动转换
      • 输入流Reader和输出流Write
        • 输入流Reader
          • 主要子类
            方法说明
            CharArrayReader从字符数组读取输入流
            BufferedReader缓冲输入字符流
            PipedReader输入管道
            InputStreamReader将字节转换到字符的输入流
            FilterReader过滤输入流
            StringReader从字符串中读取的输入流
            LineNUmberReader为输入数据附加行号
            PushbackReader返回一个字符并将此字节放回输入流
            FileReader从文件读取的输入流
          • 常用方法
            方法说明
            int read()从输入流中读取下一个字符,以int型返回(0~65535).若读取前已到达流末尾,则返回-1
            int read(char buff[])从输入流读取若干个字符以填充字符数组buff,返回实际读取的字符数。若读取前已到达流末尾,则返回-1
            abstract int read(char buff[],int offset,int len)从输入流读取len个字符数组buff(读取的第一个字符存放于buff[offset],返回实际读取的字符数。若读取前已到达流末尾,则返回-1
            void mark(int readlimit)对输入流的当前位置做标记,以便之后回到该位置。readlimit指定了在可重新回的前提下允许读取的最大字符
            void reset()将输入流的当前位置重新定位到最后一次调用mark方法时的位置。调用此方法后,后续read方法将从当前位置读取
            boolean markSupported()判断输入流是否支持mark和reset
            long skip(long n)跳过n个字符,返回值为实际跳过的字符数
            abstract void close()关闭输入流并释放与之关联的所有系统资源
            boolean ready()测试流是否可读取
        • 输出流Writer
          • 主要子类
            方法说明
            CharArrayWriter写到字符数组的输出流
            BufferedWriter缓冲字符输出流
            PipedWriter输出管道
            OutputStreamWriter转换字符到字节的输出流
            FliterWriter过滤输出流
            StringWriter输出字符串到流
            PrintWriter包含print()和println()的输出流
            FileWriter输出到文件的输出流
          • 常用方法
            方法说明
            void write(int c )将c的低16位写到输出流,高16位被忽略
            void write(String str)将字符串str写到输出流
            void write(String str,int offset,int len)将字符串tr中从offset开始的len个字符写到输出流
            void write(char buff[])将字符数组写到输出流
            abstract void write(char buff[],int offset,int len)将字符数组bufff从offset开始的len个字符写到输出流
            abstract void flush()刷新输出流,并强制将所有缓冲输出流中的字符写到输入流
            abstract void close()关闭输出流并释放与之关联的所有系统资源
    • 使用字节流和字符流的步骤基本相同
      • 创建数据源相关流对象,利用流对象方法从流输入/出数据,最后执行close()方法关闭流
    • 使用场景
      • 若为纯文本文件,优先使用字符流
      • 若为图片、视频、音频等二进制文件,优先使用字节流
      • 若不确定文件类型,优先使用万能的字节流
  3. 体系结构
    IO包提携结构
  4. 3个预定的可直接使用的流对象
    • System.in:标准输入,通常代表键盘输入
    • System.out:标准输出,通常写往显示器
    • System.err:标准错误输出,通常写往显示器

过滤流

  1. FilterInputStream和FilterOutputStream:
    • 分别为InputStream和OutputStream的直接子类
    • 实现了对数据读/写及对数据做类型或格式转换
      • 即可实现对二进制字节数据的理解和编码的转换
  2. 常用的两个过滤流:数据输入流DataInputStream和数据输出流DataOutputStream
    • 分别实现了接口DataInput和接口DataOutput
    • 实现了对不同类型数据的读/写
    • 输入/输出流分别作为数据输入/输出流的构造方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值