IO流

Posted shewuxuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。

java中的流都位于java.io包中

字节流

      计算机中所有文件都是以二进制字节形式存在。  JDK提供抽象类InputStream和OutputStream,它们是字节流的顶级父类。

       输入流 InputStream常用方法:

  • int read();//读取一个字节并转换为0-255之间的整数返回

  • int read(byte[] b);//读取若干字节保存到数组b中返回读取到的字节数

  • int read(byte[] b,int off,inr len);//读取若干字节保存到数组,off指定数组开始保存数据的起始下标,len表示读取的字节数目

  • void close(); //关闭该流并释放所有关联的系统资源       

        输出流OutputStream常用方法:

  • void write();//向输出流写入一个字节

  • void write(byte[] b);//把b中的所有字节写入输出流

  • void write(byte[] b,int off,inr len);//将数组off开始的len个字节写入输出流

  • void flush();//刷新此流并强制写出所有缓冲的输出字节

  • void close(); //关闭该流并释放所有关联的系统资源 

        字节流读写文件:

  • FileInputStream

  • FileOutputStream

    文件拷贝:

         字节流缓冲区:

         装饰设计模式:

         字节流缓冲://在IO包中提供了两个带缓冲的字节流,分别如下,这两个流都使用了装饰设计模式,它们的构造方法中分别接收InputStream和OutputStream类型的参数作为被包装对象。

  • BufferedInputStream

  • BufferedOutputStream

字符流

        JDK提供字符流,主要用于文本文件操作。同字节流一样字符流也有两个顶级父类分别是Reader和Writer。

       字符流操作文件:

    FileReader和FileWriter用于读写文件,BufferedReader和BufferedWriter是具有缓冲功能的流,可以有效的提高读写效率。

   public static void main(String[] args) throws Exception 
             FileReader reader = new FileReader("reader.txt");
             int ch;
             while((ch = reader.read() != -1)
                System.out.println((char) ch);
            
            reader.close();
       

BufferedReader中有一个重要的方法readLiner(),用于一次读取一行文本

       LineNumberReader:

        这是jdk提供的一个可以跟踪行号的输入流,是BufferedReader的直接子类。

public static void main(String[] args) throws Exception
  FileReader fr = new FileReader("A.java");
  FileWriter fw = new FileWriter("B,java");
  LineNumberReader lr = new LineNumberReader("fr");
  lr.setLineNumber(0);
  String line = null;
  while((line = lr.readLine()) != null)
    fw.writer(lr.getLineNumber()+":"+line);
    fw.writer("\r\n");
  
  lr.close();

   转换流:

        JDK中提供了InputStreamReader和OutputStreamWriter两个类可以将字节流转换为字符流。转换流也是一种包装流,其中的OutputStreamWriter是Writer的子类,可以将字节流包装成字符流输出流;InputStreamReader是Reader的子类,可以将字节输入流包装成字符输入流。

public static void main(String[] args)
  FileInputStream in = new FileInputStram("src.txt");
  InputStreamReader isr = new InputStramReader(in);//将字节输入转换为字符流输入
  BufferedReader br = new BufferedReder(isr);//对字节流对象进行包装
  FileOutputStream out = new FileOutputStream("des.txt");//将字节输出流转换为字符输出流
  OutputStreamWriter osw = new OutputStreamWriter(out);
  BufferedWriter bw = new BufferedStreamWriter(osw);//对字符输出流对象进行包装
  String line;
  while((line = br.readLine()) != null)//判断是否读到文件末尾
    bw.write(line;//输出读取到的文件
  
  br.close();
  bw.close();
    

其他IO流

    ObjectInputStream 和ObjectOutputStream

将对象转为字节数据写入到硬盘上的过程称为对象序列化。对象序列化必须实现Serializable接口。

ObejctOutputStream--序列化(对象转化为二进制):

  FileOutputStream fos = new FileOutputStream("text.txt");
          ObjectOutputStream oos = new ObjectOutputStream(fos);
          oos.writeObject(obj);
          fos.close();
          oos.close();

ObjectInputStream--反序列化(二进制转为序列化之前的对象):

    FileInputStream fis = new FileInputStream("test.txt");
          ObjectInputStream ois = new ObjectInputStream(fis);
          Map map2 = (Map)ois.readObject();
          fis.close();
          ois.close();

DataInputStream和DataOutputStream

操作基本类型对象时IO包提供,不必使用Object相关的流。并且还提供了readUTF()和writeUTF()方法读取和输出UTF-8编码的字符串。

  FileOutputStream fos = new FileOutputStream("test.txt");
          BufferedOutputStream bos = new BufferedOutputStream(fos);
          DataOutputStream dos = new DataOutputStream(bos);
          dos.writeByte(1);//写入一个字节
          dos.writeChar(‘a‘);//写入一个字符
          dos.writeBoolean(true);//写入一个布尔值
          dos.writeUTF("世界你好");//写入UTF8编码的字符串
          dos.close();
?
          FileInputStream fis = new FileInputStream("test.txt");
          BufferedInputStream bis = new BufferedInputStream(fis);
          DataInputStream dis = new DataInputStream(bis);
          System.out.println(  dis.readByte());//读取一个字节
          System.out.println(  dis.readChar());//读取一个字符
          System.out.println(  dis.readBoolean());//读取一个布尔值
          System.out.println(  dis.readByte());//读取一个UTF8编码的字符串
          dis.close(); 

printStream  

        之前的字节流和字符流只能write字节或字符,想要输出基本类型或对象类型就必须转为字符,为此IO包中提供printStream将基本类型或引用类型的对象格式化为字符串后输出

 PrintStream ps = new PrintStream(new FileOutputStream("test.txt"));
          ps.print(true);
          ps.println(map);//会自动调用对象的toString()
          ps.close();

标准输入输出流

    System中定义了三个常量:in\out\err分别是标准输入流、标准输出流、标准错误流。

 StringBuffer sb = new StringBuffer();
          int ch;
          while((ch=System.in.read()) != -1)
              if(ch==‘\r‘ || ch==‘\n‘)
                  break;
              
              sb.append((char)ch);
          
          System.out.println(sb); 

重定向流:

       void setIn(InputStream in)

       void setOut(PrintStream out);

       void setErr(PrintStream out);

管道流 PipedInputStream和PipedOutputStream

    是一种比较特殊的流,必须先建立连接才能彼此通信。通过connect方法建立管道连接。在字符流中也有一对PipedReader和PipedWriter用于管道通信。

File类

字节编码

 

以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章

IO流之IO流综述

IO异常--缓冲流--转换流--序列化流( IO流2 )

IO流(序列流)

java中的io流都有哪些

java IO流 IO流概述

IO流