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