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 }

换行:

输出换行

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

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

         Windows: \r\n

         Linux:\n

         Mac:\r

 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\r\n");
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

 

posted @ 2020-03-04 19:04  白天黑天阴天  阅读(546)  评论(0编辑  收藏  举报