zoukankan      html  css  js  c++  java
  • IO

    IO

    流是一个抽象、动态的概念,是一连串连续动态的数据集合。
    Java中流的概念细分
    1. 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。
    2. 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)。

    按处理的数据单元分类:
    1. 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStream。
    2. 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如FileReader、FileWriter。


    Java中IO流类的体系


    很多流都是成对出现的,比如:FileInputStream/FileOutputStream

    1. InputStream/OutputStream:字节流的抽象类。

    2. Reader/Writer:字符流的抽象类。

    3. FileInputStream/FileOutputStream:节点流:以字节为单位直接操作“文件”。

    4. ByteArrayInputStream/ByteArrayOutputStream:节点流:以字节为单位直接操作“字节数组对象”。

    5. ObjectInputStream/ObjectOutputStream: 处理流:以字节为单位直接操作“对象”。

    6. DataInputStream/DataOutputStream: 处理流:以字节为单位直接操作“基本数据类型与字符串类型”。

    7. FileReader/FileWriter:节点流:以字符为单位直接操作“文本文件”(注意:只能读写文本文件)。

    8. BufferedReader/BufferedWriter:处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。

    9. BufferedInputStream/BufferedOutputStream:处理流:将InputStream/OutputStream对象进行包装,增加缓存功能,提高 读写效率。

    10. InputStreamReader/OutputStreamWriter: 处理流:将字节流对象转化成字符流对象。

    11. PrintStream:处理流:将OutputStream进行包装,可以方便地输出字符,更加灵活。
    四大IO抽象类
    InputStream/OutputStream和Reader/writer类是所有IO流类的抽象父类

    InputStream
    int read():读取一个字节的数据,并将字节的值作为int类型返回(0-255之间的一个值)。如果未读出字节则返回-1(返回值为-1表示读取结束)。
    void close():关闭输入流对象,释放相关系统资源。
    OutputStream
    void write(int n):向目的地中写入一个字节。
    void close():关闭输出流对象,释放相关系统资源。
    Reader
    int read(): 读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即Unicode值)。如果未读出字符则返回-1(返回值为-1表示读取结束)。
    void close() : 关闭流对象,释放相关系统资源。
    Reader
    Writer用于写入的字符流抽象类,数据单位为字符。
    void write(int n): 向输出流中写入一个字符。
    void close() : 关闭输出流对象,释放相关系统资源。

    理解IO操作步骤
    * 1、创建源
    * 2、选择流
    * 3、操作
    * 4、释放流

     1 package boom.io;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.FileNotFoundException;
     6 import java.io.IOException;
     7 import java.io.InputStream;
     8 
     9 /**
    10  * 理解IO操作步骤
    11  * 1、创建源
    12  * 2、选择流
    13  * 3、操作
    14  * 4、释放流
    15  * @author Administrator
    16  *
    17  */
    18 public class IOTest1 {
    19 
    20     public static void main(String[] args) {
    21         // 1、选择流
    22         File src = new File("abc.txt");
    23         // 2、选择流
    24         try {
    25             InputStream is = new FileInputStream(src);
    26             // 3、操作(读取)
    27             int data1 = is.read();// 第一个数据
    28             int data2 = is.read();// 第二个数据
    29             int data3 = is.read();// 第三个数据
    30             int data4 = is.read();// 第四个数据
    31             // 返回字节对应的ASCII吗
    32             System.out.println(data1);// 97
    33             System.out.println(data2);// 98
    34             System.out.println(data3);// 99
    35             System.out.println(data4);// 没有这个数据存在就返回-1
    36             
    37             System.out.println();
    38             
    39             // 强转成字符
    40             System.out.println((char)data1);// a
    41             System.out.println((char)data2);// b
    42             System.out.println((char)data3);// c
    43             System.out.println((char)data4);
    44             // 4、释放
    45             is.close();
    46             
    47         } catch (FileNotFoundException e) {
    48             e.printStackTrace();
    49         } catch (IOException e) {
    50             e.printStackTrace();
    51         }
    52     }
    53 
    54 }
    View Code

    IO标准的步骤

     1 package boom.io;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.FileNotFoundException;
     6 import java.io.IOException;
     7 import java.io.InputStream;
     8 
     9 /**
    10  * 标准的IO流操作步骤
    11  * 1、创建源
    12  * 2、选择流
    13  * 3、操作
    14  * 4、释放流
    15  * @author Administrator
    16  *
    17  */
    18 public class IOTest2 {
    19 
    20     public static void main(String[] args) {
    21         // 1、选择流
    22         File src = new File("abc_1.txt");
    23         // 2、选择流
    24         InputStream is = null;
    25         try {
    26             is = new FileInputStream(src);
    27             // 3、操作(读取)
    28             int temp;
    29             while ((temp = is.read()) != -1) {
    30                 System.out.print((char) temp);
    31             }
    32 
    33         } catch (FileNotFoundException e) {
    34             e.printStackTrace();
    35         } catch (IOException e) {
    36             e.printStackTrace();
    37         } finally {
    38             // 4、释放
    39             try {
    40                 if (is != null) {
    41                     is.close();
    42                 }
    43             } catch (IOException e) {
    44                 e.printStackTrace();
    45             }
    46         }
    47     }
    48 
    49 }
    View Code

    FileInputStream:文件字节输入节点流。通过字节的方式读取文件,适合读取所有类型的文件(图像、视频等),全字符一般用FileReader.

     1 package boom.io;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.FileNotFoundException;
     6 import java.io.IOException;
     7 import java.io.InputStream;
     8 
     9 /**
    10  * 文件字节输入流:FileInputStream,【分段读取】 1、创建源 2、选择流 3、操作 4、释放流
    11  * 
    12  * @author Administrator
    13  *
    14  */
    15 public class IOTest3 {
    16 
    17     public static void main(String[] args) {
    18     /*    // 1、创建源
    19         File src = new File("abc.txt");
    20         // 2、选择流
    21         InputStream fis = null;*/
    22         
    23         FileInputStream fis = null;
    24         try {
    25             fis = new FileInputStream("abc.txt");
    26             
    27             fis.skip(3);// 跳过n个字节开始读取
    28             // 3、操作流【分段读取】
    29             byte[] flush = new byte[1024*10];// 缓冲容器
    30             int len = -1;// 接收长度
    31             while ((len = fis.read(flush)) != -1) {
    32                 // 字节数组-->字符串(解码)
    33                 String str = new String(flush, 0, len);
    34                 System.out.println(str);
    35             }
    36 
    37         } catch (FileNotFoundException e) {
    38             e.printStackTrace();
    39         } catch (IOException e) {
    40             e.printStackTrace();
    41         } finally {
    42             try {
    43                 if (fis != null)
    44                     fis.close();
    45             } catch (IOException e) {
    46                 e.printStackTrace();
    47             }
    48         }
    49     }
    50 
    51 }
    FileInputStream Code

    FileInputStream:文件字节输出节点流。通过字节的方式写出或者追加数据到文件,适合读取所有类型的文件(图像、视频等),全字符一般用FileWrite.

     1 package boom.io;
     2 
     3 import java.io.File;
     4 import java.io.FileNotFoundException;
     5 import java.io.FileOutputStream;
     6 import java.io.IOException;
     7 import java.io.OutputStream;
     8 
     9 /**
    10  * 文件字节输出流:FileOutputStream,
    11  * 1、创建源 2、选择流 3、操作(写出内容) 4、释放流
    12  * @author Administrator
    13  *
    14  */
    15 public class IOTest4 {
    16 
    17     public static void main(String[] args) {
    18         /*// 1、创建源
    19         File dest = new File("dest.txt");
    20         // 2、选择流
    21         OutputStream os  = null;*/
    22         
    23         FileOutputStream fos = null;
    24         try {
    25             fos = new FileOutputStream("dest.txt",true);// 重复执行会在默认追加相同的内容。默认的为false
    26             // 操作(写出)
    27             String msg = "桃花坞里桃花庵,桃花庵下桃花仙;桃花仙人种桃树,又摘桃花卖酒钱。";// 需要写出的内容
    28             // 字符串-->字节数组(编码)
    29             byte[] datas = msg.getBytes();
    30             fos.write(datas, 0,datas.length);
    31             fos.flush();// 刷新
    32         } catch (FileNotFoundException e) {
    33             e.printStackTrace();
    34         } catch (IOException e) {
    35             e.printStackTrace();
    36         }finally{
    37                 try {
    38                     if(fos != null)
    39                     fos.close();
    40                 } catch (IOException e) {
    41                     e.printStackTrace();
    42                 }
    43         }
    44     }
    45 
    46 }
    FileOutputStream Code

    文件的拷贝

     1 package boom.io;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.FileOutputStream;
     6 import java.io.IOException;
     7 
     8 /**
     9  * 文件的拷贝:文件字节输入、输出流
    10  * 
    11  * @author Administrator
    12  *
    13  */
    14 public class CopyFile {
    15 
    16     public static void main(String[] args) {
    17         copyfile("src\boom\io\CopyFile.java","copy.txt");
    18 
    19     }
    20 
    21     private static void copyfile(String srcPath,String descPath) {
    22         // 1、选择两个流。先输出,在输出
    23         FileInputStream fis = null;
    24         FileOutputStream fos = null;
    25         try {
    26             // 2、具体操作 p.png 拷贝成 pcopy.png
    27             fis = new FileInputStream(srcPath);// 源头
    28             fos = new FileOutputStream(descPath);// 目的地
    29             // 3、分段读取内容
    30             byte[] flush = new byte[1024 * 10];
    31             int len = -1;
    32             while ((len = fis.read(flush)) != -1) {
    33                 fos.write(flush, 0, len);// 分段写出
    34             }
    35             fos.flush();
    36 
    37         } catch (FileNotFoundException e) {
    38             e.printStackTrace();
    39         } catch (IOException e) {
    40             e.printStackTrace();
    41         } finally {
    42             // 4、分别关闭:先打开的后关闭
    43             try {
    44                 if (fos != null)
    45                     fos.close();
    46             } catch (IOException e) {
    47                 e.printStackTrace();
    48             }
    49 
    50             try {
    51                 if (fis != null)
    52                     fis.close();
    53             } catch (IOException e) {
    54                 e.printStackTrace();
    55             }
    56 
    57         }
    58 
    59     }
    60 
    61 }
    View Code

    FileReader or FileWriter:文件字符输入、输出流

     1 package boom.io;
     2 
     3 import java.io.FileNotFoundException;
     4 import java.io.FileReader;
     5 import java.io.FileWriter;
     6 import java.io.FilterReader;
     7 import java.io.IOException;
     8 import java.io.Writer;
     9 
    10 /**
    11  * 文件字符输入、输出流
    12  * 
    13  * @author Administrator
    14  *
    15  */
    16 public class IOTest5 {
    17 
    18     public static void main(String[] args) {
    19         //TestFileReader();
    20         TestFileWrite();
    21     }
    22 
    23     private static void TestFileWrite() {
    24         FileWriter fw = null;
    25         try {
    26             fw = new FileWriter("abc.txt",true);// true不打开默认是false,删除原来内容重新写信的,true是追加
    27             // 写法一
    28             /**
    29             String msg = "桃花坞里桃花庵,桃花庵下桃花仙;桃花仙人种桃树,又摘桃花卖酒钱。";
    30             char[] datas = msg.toCharArray();
    31             fw.write(datas, 0, datas.length);
    32             */
    33             // 写法二
    34             /**
    35             String msg = "写法二,直接把要写出的字符扔进来";
    36             fw.write(msg);
    37             */
    38             
    39             // 写法三
    40             fw.append("
    开心!").append("就是笑");
    41             
    42             
    43             fw.flush();
    44         } catch (IOException e) {
    45             e.printStackTrace();
    46         }finally{
    47             try {
    48                 if(fw != null)
    49                 fw.close();
    50             } catch (IOException e) {
    51                 e.printStackTrace();
    52             }
    53         }
    54         
    55     }
    56 
    57     private static void TestFileReader() {
    58         // 选择流:文件字符输入流
    59         FileReader fr = null;
    60         try {
    61             fr = new FileReader("abc.txt");
    62             int len = -1;
    63             // 字符缓冲器
    64             char[] flush = new char[1024 * 10];
    65             while ((len = fr.read(flush)) != -1) {
    66                 String str = new String(flush, 0, len);
    67                 System.out.println(str);
    68             }
    69         } catch (FileNotFoundException e) {
    70             e.printStackTrace();
    71         } catch (IOException e) {
    72             e.printStackTrace();
    73         } finally {
    74             try {
    75                 if (fr != null)
    76                     fr.close();
    77             } catch (IOException e) {
    78                 e.printStackTrace();
    79             }
    80         }
    81     }
    82 }
    View Code

    字节数组:ByteArrayInputStream / ByteArrayOutputStream:节点流:以字节为单位直接操作“字节数组对象”。字节数组不要太大,释放资源可选处理。

  • 相关阅读:
    呀?这就是锁(二)?
    呀?这就是锁(一)?
    线程的建立
    Mybatis基础使用简介
    使用apache+tomcat+mod_jk.so实现集群
    HttpClient使用详解
    HttpClient基础用法
    Collection集合学习(二)———List接口与具体实现
    Docker学习总结(二)—— 镜像,容器
    Docker学习总结(一)—— namespace,cgroup机制
  • 原文地址:https://www.cnblogs.com/cao-yin/p/9651926.html
Copyright © 2011-2022 走看看