11、J2SE基础-IO流

来源:互联网 发布:淘客代理系统源码 编辑:程序博客网 时间:2024/05/17 22:54

节点流

理解流的概念
流是字节序列的抽象概念;
文件时数据的静态存储形式,而流是指数据传输时的形态;
流类分为两个大类:节点流类和过滤流类(也叫处理流类);


InputStream与OutputStream类

程序可以从中连续读取字节的对象叫输入流,在java中,用InputStream类来描述所有输入流的抽象概念;
方法:
int read():从输入流中读取一个字节的内容,以int返回;
int read(byte[] b):
int read(byte[] , int off, int len)
long skip(long n)
int available();
void mark(int readlimit);
void reset();
boolean markSupported();
void close();
有了垃圾回收器为什么还要调用close方法:
java会在内存中产生类对象和操作系统产生的资源,垃圾回收器只回收类对象,close方法回收系统产生的资源;

程序可以向其中连续写入字节的对象叫输出流,在java中,用OutputStream类来描述所有输出流的抽象概念;
方法:
void write(int b);
void write(byte[] b)
void write(byte[] , int off, int len)
void flush():在内存缓冲区还没有填满的时候,将缓冲区中的内容强制写入IO设备;
void close():当调用此方法是,缓冲区的内容也会写入IO设备;

应用程序《——》内存缓冲区《——》IO设备

FileInputStream与FileOutputStream类

  • FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名;
  • 创建FileInputStream实例对象时,指定的文件应该是存在和可读的。创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中原来内容将被覆盖清除;
  • 对同一磁盘文件创建FileInputStream对象的两种方式:
    1. FileInputStream inOne = new FileInputStream("hello.test");
    2. File f = new File("hello.test");
  FileInputStream inTwo = new FileInputStream(f);
  • 创建FileOutputStream实例对象时,可以指定还不存在的文件名,不能指定一个已经被其他程序打开了的文件
  • 思考:要将A文件的内容写入B文件,在程序代码中,是用输出类对象,还是用输入类对象来连接A文件并完成对A文件的操作呢?
  • 答案:输入类对象
  • 编程举例:用FileOutputStream类想文件中写入一个字符串,然后用FileInputStream读出写入的内容;

Reader与Writer类

  • Reader和Writer是所有字符流类的抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据;
  • 二进制文件和文本文件的区别;
  • 编程举例:用FileWriter类向文件中写入一个字符串,然后用FileReader读出写入的内容;

PipedInputStream与PipedOutputStream类

  • PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信;
  • 编程实例:Sender,Reveiver,PipedStreamThread;
  • PipedWriter和PipedReader类:用于面向字符串的方向;
  • 使用管道流类,可以实现各个程序模块之间的松耦合通信;


ByteArrayInputStream与ByteArrayOutputStream类

  • 这两个类用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能;
  • ByteArrayInputStream的两个构造函数:
    • ByteArrayInputStream(byte[] buf);
    • ByteArrayInputStream(byte[] buf, int offset, int length);
  • ByteArrayOutputStream的两个构造函数:
    • ByteArrayOutputStream();
    • ByteArrayOutputStream(int);
  • 编程举例:编写一个把输入流中所有英文字母变成大写字母,然后将结果写入到一个输出流对象;
  • StringReader类和StringWriter类来一字符IO流的方式处理字符串;


重视程序代码的复用性

  • System.in连接到键盘,是InputStream类型的实例对象,System.out连接到显示器,是PrintStream类的实例对象;
  • 不管各种底层物理设备用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表示输入流的结束;
  • 在Windows下,按下Ctril+Z组合键可以产生键盘输入流的结束标志,在Linux下,则是按下Ctrl+D组合键来产生键盘输入流的结束标志;
  • 编程举例:借助上一页编写的函数,将键盘上输入的内容转变成大写字母后打印在屏幕上;
  • 建议:要编程从键盘上连续读取一大段数据时,应尽量将读取数据的过程放在函数中完成,使用-1来作为键盘输入的结束点。在该函数中编写的程序代码不应直接使用System.in读取数据,而是用一个Inputstream类型的形式参数对象来读取数据,然后将System.in作为实参传递给形式参数;