zoukankan      html  css  js  c++  java
  • Java中输入输出流的理解

    IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。例如:键盘的输入,再比如显示器就是输出设备,输出图像。

    流的分类:

    IO流在java中从输入输出角度分类:

             1.输入流

             2.输出流

    IO流在java中从数据的角度来分类:

             1.字符流

                       文本,我们能读的懂的都可以认为是字符流。比如:文章,java文件等等

             2.字节流

                       二进制的数据,这种数据一般用文本打开我们读不懂。比如,图片文件,mp3文件,等等。

    字符流:

    文本,我们能读的懂的都可以认为是字符流。比如:文章,java文件等等

    字符流

    从API的文档我们可以看出:Write有使用abstract修饰。

     方法摘要:

     Writer append(char c)
              将指定字符添加到此 writer。
     Writer append(CharSequence csq)
              将指定字符序列添加到此 writer。
     Writer append(CharSequence csq, int start, int end)
              将指定字符序列的子序列添加到此 writer.Appendable
    abstract  void close()
              关闭此流,但要先刷新它。
    abstract  void flush()
              刷新该流的缓冲。
    void write(char[] cbuf)
              写入字符数组。
    abstract  void write(char[] cbuf, int off, int len)
              写入字符数组的某一部分。

    void

    write(int c)
              写入单个字符。

    void

    write(String str)
              写入字符串。

    void

    write(String str, int off, int len)
              写入字符串的某一部分。

    输入流:

    同样在Reader中我们可以看出也是有abstract修饰的。

     字符流的命名规则:

      如果是输出流则以Writer结尾

      如果是输入流则以Reader结尾

    Demo:

     1 package zh.stu;
     2 
     3 import java.io.File;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 import java.io.Writer;
     7 
     8 public class IOStu {
     9     
    10     public static void main(String[] args){
    11         // 新建一个文件,向文件中写入一句话
    12         File file=new File("test.txt");
    13         Writer writer = null;
    14         try {
    15             //IO流是需要关闭的,如果不这样设计就会不能关闭资源
    16             writer=new FileWriter(file);
    17             writer.write("hello");
    18             
    19         } catch (IOException e) {
    20             e.printStackTrace();
    21         }finally {
    22             //判断writer不是空防止空指针异常
    23             if(writer != null) {
    24                 try {
    25                     writer.close();
    26                 } catch (IOException e) {
    27                     e.printStackTrace();
    28                 }
    29             }
    30     
    31         }
    32     }
    33 }

    向原有的文件中在追加数据

     1 package zh.stu;
     2 
     3 import java.io.FileWriter;
     4 import java.io.IOException;
     5 import java.io.Writer;
     6 
     7 public class IOStuappend {
     8     
     9     public static void main(String[] args) {
    10         Writer writer=null;
    11         try {
    12             writer = new FileWriter("test.txt",true);
    13             
    14             writer.write("world");
    15         } catch (IOException e) {
    16             e.printStackTrace();
    17         }finally {
    18             //判断writer不是空防止空指针异常
    19             if(writer != null) {
    20                 try {
    21                     writer.close();
    22                 } catch (IOException e) {
    23                     e.printStackTrace();
    24                 }
    25             }
    26         }
    27     }
    28 }

    换行:

    输出换行

             把文本写入文件中 代表换行

             问题是不同的环境下换行的方式也不一样

             Windows:

             Linux:

             Mac:

     1 package zh.stu;
     2 
     3 import java.io.FileWriter;
     4 import java.io.IOException;
     5 import java.io.Writer;
     6 
     7 public class IOStuLine {
     8     
     9     public static void main(String[] args) {
    10         Writer writer=null;
    11         try {
    12             writer = new FileWriter("test.txt",true);
    13             for(int i=1;  i<100; i++){
    14                 writer.write("world
    ");
    15                 // 每次写入十个的时候都要做一次flush
    16                 if(i%10==0){writer.flush();}
    17             }
    18         } catch (IOException e) {
    19             e.printStackTrace();
    20         }finally {
    21             //判断writer不是空防止空指针异常
    22             if(writer != null) {
    23                 try {
    24                     writer.close();
    25                 } catch (IOException e) {
    26                     e.printStackTrace();
    27                 }
    28             }
    29         }
    30     }
    31 }

     BufferReader的使用:高效缓冲字符输入流

     1 package zh.stu.Buffered;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.FileNotFoundException;
     5 import java.io.FileReader;
     6 import java.io.IOException;
     7 
     8 public class bufferedReader {
     9     
    10     public static void main(String[] args) {
    11         BufferedReader buff=null;
    12         try {
    13             // 创建一个高效的缓冲输入流
    14             buff=new BufferedReader(new FileReader("test.txt"));
    15             String lineContent=null;
    16             // 读取没一行数据,直到全部读取
    17             while((lineContent = buff.readLine()) != null){
    18                 System.out.println(lineContent);
    19             }
    20         } catch (Exception e) {
    21             e.printStackTrace();
    22         }finally {
    23             if (buff != null){
    24                 try {
    25                     buff.close();
    26                 } catch (IOException e) {
    27                     e.printStackTrace();
    28                 }
    29             }
    30         }
    31     }
    32 }

    BufferedWriter的使用,高速缓冲字符输出流。新建一个文件,并向这个文件中写入数据。

     1 package zh.stu.Buffered;
     2 
     3 import java.io.BufferedWriter;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 
     7 public class bufferedWriter {
     8     
     9     public static void main(String[] args) throws IOException {
    10         BufferedWriter writer=null;
    11         try {
    12             writer=new BufferedWriter(new FileWriter("bffWriter.txt"));
    13             // 向文件中写入数据
    14             for(int i=0; i<10; i++){
    15                 writer.write("hello");
    16                 writer.newLine();
    17             }
    18         } catch (IOException e) {
    19             e.printStackTrace();
    20         }finally {
    21             if (writer != null){
    22                 writer.close();
    23             }
    24         }
    25     }
    26 }

    使用BufferedWriter和BufferedReader实现文件的拷贝

     1 package zh.stu.Buffered;
     2 
     3 import java.io.*;
     4 
     5 public class CopyByBuffered {
     6     
     7     public static void main(String[] args) {
     8         BufferedReader reader=null;
     9         BufferedWriter writer=null;
    10         try {
    11             String line=null;
    12             // 高速缓冲输入流
    13             reader=new BufferedReader(new FileReader("bffWriter.txt"));
    14             // 将读取到的数据使用writer写入另外一个文件中
    15             // 高速缓冲输出流
    16             writer=new BufferedWriter(new FileWriter("test.txt"));
    17             while ((line = reader.readLine()) != null){
    18                 writer.write(line);
    19                 writer.newLine();
    20                 writer.flush();
    21             }
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         }finally {
    25             try {
    26                 if (writer !=null){
    27                     writer.close();
    28                 }
    29                 if (reader != null){
    30                     reader.close();
    31                 }
    32             } catch (IOException e) {
    33                 e.printStackTrace();
    34             }
    35         }
    36     }
    37 }

     字节流

    字节输入流:InputStream:常用子类:FileInputStream

    字节输出流:OutputStream:常用的子类:FileOutputStream

    当使用OutputStream时候向一个文件中添加数据

     1 package zh.stu.ByteStream;
     2 
     3 import java.io.*;
     4 
     5 public class OutPutStreamTest {
     6     
     7     public static void main(String[] args) {
     8         OutputStream out=null;
     9         try {
    10             byte [] Num={97,99,55};
    11             out=new FileOutputStream(new File("output.txt"));
    12             out.write(Num);
    13         } catch (Exception e) {
    14             e.printStackTrace();
    15         } finally {
    16             if(out != null){
    17                 try {
    18                     out.close();
    19                 } catch (IOException e) {
    20                     e.printStackTrace();
    21                 }
    22             }
    23         }
    24     }
    25 }

    这个时候我们可以看出,输入到文件中的数据是经过编码之后的数据。

    ac7

    使用InputStream读取OutputStream存的数据

     1 package zh.stu.ByteStream;
     2 
     3 import java.io.*;
     4 
     5 public class InputStreamTest {
     6     
     7     public static void main(String[] args) {
     8         InputStream in=null;
     9     
    10         try {
    11             // 创建一个字节的数组
    12             byte[] bytes = new byte[1024];
    13             // 创建字符输入流的对象,如果有中文则可能出现乱码的情况
    14             in=new FileInputStream(new File("output.txt"));
    15             // 定义读取到的标识
    16             int len=-1;
    17             while ((len = in.read(bytes)) != -1){
    18                 String s = new String(bytes, 0, len);
    19                 System.out.println(s);
    20             }
    21             
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         } finally {
    25             if(in != null){
    26                 try {
    27                     in.close();
    28                 } catch (IOException e) {
    29                     e.printStackTrace();
    30                 }
    31             }
    32         }
    33     }
    34 }

     使用字符的高效缓冲复制一张图片到另外一个文件夹

     1 package cn.tx.buffer;
     2 
     3 import java.io.*;
     4 
     5 public class BufferCopy {
     6 
     7     public static void main(String[] args) {
     8         //定义一个高效缓存字节流
     9         BufferedInputStream in = null;
    10         BufferedOutputStream out = null;
    11         try {
    12             //创建一个高效缓存字节流对象
    13             in = new BufferedInputStream(new FileInputStream("D:/feiji.jpg"));
    14             out = new BufferedOutputStream(new FileOutputStream("plane.jpg"));
    15             //定义一个字节数组
    16             byte[] bs = new byte[1024];
    17             //定义一个标志
    18             int len = -1;
    19             while((len = in.read(bs)) != -1){
    20                 out.write(bs, 0, len);
    21             }
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         } finally {
    25             try {
    26                 if(out != null){
    27                     out.close();
    28                 }
    29                 if(in != null){
    30                     in.close();
    31                 }
    32             } catch (IOException e) {
    33                 e.printStackTrace();
    34             }
    35         }
    36     }
    37 }

    字符流和字节流的转换桥梁

    OutputStreamWriter是字符流通向字节流的桥梁

    字符流通向字节流桥梁InputStreamReader

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/LBJLAKERS/p/12409472.html
Copyright © 2011-2022 走看看