欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java IO流的概念

程序员文章站 2022-06-08 22:05:56
...
一、 IO 流的三种分类方式
    1. 按流的方向分为:输入流和输出流
    2. 按流的数据单位不同分为:字节流和字符流
    3. 按流的功能不同分为:节点流和处理流
    二、 IO 流的四大抽象类:
    字符流: Reader Writer
    字节流: InputStream (读数据)
    OutputStream (写数据)
    三、 InputStream 的基本方法
    int read () throws IOException 读取一个字节以整数形式返回,如果返回 -1 已到输入流的末尾
    void close () throws IOException 关闭流释放内存资源
    long skip ( long n ) throws IOException 跳过 n 个字节不读
    四、 OutputStream 的基本方法
    void write ( int b ) throws IOException 向输出流写入一个字节数据
    void flush () throws IOException 将输出流中缓冲的数据全部写出到目的地
    五、 Writer 的基本方法
    void write ( int c ) throws IOException 向输出流写入一个字符数据
    void write ( String str ) throws IOException 将一个字符串中的字符写入到输出流
    void write ( String str , int offset , int length )
    将一个字符串从 offset 开始的 length 个字符写入到输出流
    void flush () throws IOException
    将输出流中缓冲的数据全部写出到目的地
    六、 Reader 的基本方法
    int read () throws IOException 读取一个字符以整数形式返回,如果返回 -1 已到输入流的末尾
    七、节点流类型

    八、访问文件之 FileInputStream 和 FileOutputStream 继承基类用于向文件中输入输出字节
    九、访问文件之 FileReader 和 FileWriter 继承基类用于向文件中输入输出字符
---- 输出流在构造函数第二个参数可以设置 true 意义为跟在已有文件后进行输入
---- 此类流会抛出 FileNotFoundException 需要对其进行显示捕捉
十、缓冲流:缓冲流要套接在相应的节点流之上,提高了读写的效率。
  此处理流的构造方法都得传相对应的基类类型
    BufferedReader :提供了 readLine 方法用于高效读取一行字符串
    BufferedWriter :提供了 newLine 用于写入一个行分隔符也就是换行
    BufferedInputStream 没多大用处
    BufferedOutputStream 没多大用处
    十一、转换流:主要作用将字节流转换成字符流。用处较大!
    转换流在构造时可以指定其编码集合
    InputStreamReader 需要和 InputStream 套接
    OutputStreamWriter 需要和 OutputStream 套接
    例: OutputStreamWriter osw = new OutputStreamWriter ( new FileOutputStream (文件路径);
    方法例: osw.getEncoding (); 获得流的编码方式
    十二、数据流与字节数组流:
    数据流主要为实现可以 存取 Java 原 始数据类型如 long , boolean
    数据流是字节流
    DataInputStream 需要和 InputStream 套接
    DataOutputStream 需要和 OutputStream 套接
    DataInputStream 方法: readBoolean () readInt () read…… () ……
    readUTF (): 网络传输 常用方法 读一个 Unicode 字符串
    DataOutputStream 方法与 DataInputStream 基本对应为写的方法        // 此构造函数等于已可以往一个字节数组里输入内容
    ByteArrayOutputStream baos = new ByteArrayOutputStream ();    // 此方法为获取一个字节数组方法返回字节数组
    baos.toByteArray ();    // 此方法获取字节数组占了多少字节
new ByteArrayInputStream (一个字节数组)。 available ()
ByteArrayOutputStream baos =new ByteArrayOutputStream();
       DataOutputStream dos = new DataOutputStream(baos);
      try  {
       dos.writeDouble(Math.random());
       dos.writeBoolean(true);
       ByteArrayInputStream bais =new ByteArrayInputStream(baos.toByteArray());
       System.out.println(bais.available());
       DataInputStream dis = new DataInputStream(bais);
       System.out.println(dis.readDouble());
       System.out.println(dis.readBoolean());
       dos.close();
       dis.close();
      } catch(IOException e){
       e.printStackTrace();
  }
十二、 Print 流
    Print 流只有输出流无输入流, PrintWriter 和 PrintStream 分别针对字符字节
    两个类提供了重载的 Print 和 Println 方法用于多种数据类型的输出
    PrintWriter 和 PrintStream 的输出操作不会抛出异常
    PrintWriter 和 PrintStream 有自动 flush 功能
    ----System.setOut( 接收 OutputStream 类 ): 用于设置系统默认输出流
    十二、 Object 流
    等同于 c# 序列化,用直接将 Object 写入或读出
    transient 关键字为不序列化此成员变量
    需要序列化的类必须实现 Serializable 接口
    主要方法: writeObject ( Object ); readObject ();
    读出为 Object 类型需要强转数据类型
import java.io.*;
  public class TestObjectIO {
     public static void main(String args[]) throws Exception {
         T t = new T();
         t.k = 8;
         FileOutputStream fos = new FileOutputStream("d:/share/java/io/testobjectio.dat");
         ObjectOutputStream oos = new ObjectOutputStream(fos);
         oos.writeObject(t);
         oos.flush();
         oos.close();

         FileInputStream fis = new FileInputStream("d:/share/java/io/testobjectio.dat");
         ObjectInputStream ois = new ObjectInputStream(fis);
         T tReaded = (T)ois.readObject();
         System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);

     }
  }

  class T implements Serializable
  {
     int i = 10;
     int j = 9;
     double d = 2.3;
     transient int k = 15;
  }