• 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

  • 相关阅读:
    error=Error Domain=NSURLErrorDomain Code=-1003
    修改mac host
    页面之间的跳转效果
    iOS开发200个tips总结(一)
    2020Python练习七——文件处理2
    2020python练习六——文件处理1
    【2020Python错题本】week1错误集
    【2020Python修炼记14】Python语法入门—文件处理
    【2020Python修炼记13】Python语法入门—字符编码
    2013年省赛I题 Thrall’s Dream
  • 原文地址:https://www.cnblogs.com/LBJLAKERS/p/12409472.html
Copyright © 2020-2023  润新知