博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO流
阅读量:7048 次
发布时间:2019-06-28

本文共 8389 字,大约阅读时间需要 27 分钟。

1. I/O   输入/输出

流(stream):根据方向分为:输入流和输出流。方向是基于我们的程序的,以先进先出的方式发送到信息通道中。流向我们程序的流叫做:输入流;从程序向外流的叫做:输出流。

2. 输入流是用于获取(读取write())数据的,输出流是用于向外输出(写出 write())数据的。

  InputStream:该接口定义了输入流的特征。

  OutputStream:该接口定义了输出流的特征。

  FileInputStream: 文件输入流,专门用于从文件中读取字节到程序内存中。

  FileOutputStream: 文件输出流,专门用于冲内存中写入字节到文件中。

1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5  6 public class Test1 { 7     public static void main(String[] args) { 8         // 读取文件中的字节 9         File file = new File("D:" + File.separator + "javatest"10                 + File.separator + "c.txt");11         // (1)创建管道12         FileInputStream in = null;13         try {14 15             // (2)循环读取字节16             in = new FileInputStream(file);17             int t;18             StringBuilder b = new StringBuilder();19             while ((t = in.read()) != -1) {20                 b.append((char) t);21             }22             System.out.println(b.toString());23 24         } catch (FileNotFoundException e) {25             e.printStackTrace();26         } catch (IOException e) {27             e.printStackTrace();28         }29 30         // (3)关闭管道31         try {32             in.close();33         } catch (IOException e) {34             e.printStackTrace();35         }36     }37 }

注意: FileInputStream 会抛出: 异常- 如果该文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取。

           close会抛出: - 如果发生 I/O 错误。

 

 一次读取多个字节:

1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5  6 public class Test2 { 7     public static void main(String[] args) throws FileNotFoundException, IOException { 8         File file = new File("D:" + File.separator + "javatest" + File.separator + "t.txt"); 9 //        (1)创建读取通道10         FileInputStream in = new FileInputStream(file);11 12         byte[] buf = new byte[5];13 //        (2)管道中读取多个字节到缓冲区14         int len;15         // len = in.read();//从管道中读取超过len之后返回-1;16         StringBuilder b = new StringBuilder();17         while ((len = in.read(buf)) != -1) {18             String str = new String(buf, 0, len);19             b.append(str);20         }21         System.out.println(b.toString());22 //        (3)关闭通道23         in.close();24     }25 26 }

一次写入多个字节:

1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5  6 public class Test1 { 7     public static void main(String[] args) throws FileNotFoundException, IOException { 8         File file = new File("D:"+File.separator+"javatest"+File.separator+"x.txt"); 9 //        (1)创建输出流管道10         FileOutputStream out = new FileOutputStream(file);11 //        (2)写入数据到到管道中,12         13         /*一次写入一个字节14          * out.write(97);15          * out.write(98);16          * out.write(99);17         */18         19         //一次写入多个字节20         String str = "hello 广州";//根据不同系统,默认的编码不同,本平台是Windows简体中文,所以默认GBK编码21         byte[] buf = str.getBytes();22         out.write(buf);23         24         /*byte[] buf = str.getBytes("UTF-8");25         out.write(buf);*/ // 自定义编码导入;26         27         System.out.println("写入完成");28         29 //        (3)关闭流30         out.close();31         32     }33 34 }

 InputStream/OutputStream 用于字节的读写。主要用于读取二进制文件(图片、音频、视频),也可以读取文件性文件。

 

3. 转换流

InputStreamReader 继承于Reader,是字节流通向字符流的桥梁,可以把字节流按照指定编码 解码 成字符流。

OutputStreamWriter 继承于Writer,是字符流通向字节流的桥梁,可以把字符流按照指定的编码 编码 成字节流。

1)OutputStreamWriter 创建一个字符集的输出流

1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.OutputStreamWriter; 6  7 public class Test2 { 8     public static void main(String[] args) throws IOException, FileNotFoundException { 9         //程序输出,写入文档10         String str = "Hello广州";11         File file = new File("D:"+File.separator+"javatest"+File.separator+"z.txt");12         //创建管道13         14         FileOutputStream out = new FileOutputStream(file);15         OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");16         17         //写入管道18         writer.write(str);19         20         //刷新缓冲区21         writer.flush();22         23         //关闭管道24         out.close();25         writer.close();26         27         System.out.println("完成写入");28         29     30     }31 32 }

 

2)InputStreamReader 创建一个字符集的输入流

1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.UnsupportedEncodingException; 7  8 public class Test3 { 9     public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException, IOException  {10         File file = new File("D:" + File.separator + "javatest"11                 + File.separator + "d.txt");12 13         // 建立管道14         FileInputStream in = new FileInputStream(file);15         InputStreamReader reader = new InputStreamReader(in, "UTF-8");16 17         // 读写文件18         char[] cbuf = new char[2];19         int len;20 21         StringBuilder sb = new StringBuilder();22         while ((len = reader.read(cbuf)) != -1) {23             sb.append(cbuf, 0, len);24         }25         System.out.println(sb.toString());26     }27 28 }

 读取一个默认GBK编码的文件

1 import java.io.File; 2 import java.io.FileReader; 3 import java.io.IOException; 4  5 public class Test4 { 6     public static void main(String[] args) throws IOException { 7         // 读取一个本地的GBK编码文件 (本平台是Windows简体中文) 8  9         File file = new File("D:" + File.separator + "javatest"10                 + File.separator + "a.rar");11         // 1创建管道12         /*13          * 可以不写这种方式 FileInputStream in = new FileInputStream(file);14          * InputStreamReader reader = new InputStreamReader(in, "GBK");15          */16 17         FileReader reader = new FileReader(file);18         char[] cbuf = new char[2];19         int len;20         // 2读取21         StringBuilder sb = new StringBuilder();22         while ((len = reader.read(cbuf)) != -1) {23             sb.append(cbuf, 0, len);24 25         }26 27         // 3关闭管道28         reader.close();29         cbuf.clone();30 31         System.out.println(sb.toString());32 33     }34 35 }

 4.缓冲字符高级流 BufferedWriter 和 BufferedReader

 1)BufferedWriter是缓冲字符输入流,以 作为单位写入字符

 2)BufferedReader是缓冲字符输出流,以 作为单位读取字符

5月初的广州不出太阳不升温,反而一连下了一个多星期的雨,返春寒了。

来个需求利用BufferedWriter写个一首诗到文本里 如:

惊闻昨夜大雨,

今晨河流湍急。
偶遇柱上蜗牛,
一步一步寻梦。
你我怎可知?

1 import java.io.BufferedWriter; 2 import java.io.File; 3 import java.io.FileWriter; 4 import java.io.IOException; 5  6 public class Test1 { 7     public static void main(String[] args) throws IOException { 8         File file = new File("D:" + File.separator + "javatest" 9                 + File.separator + "c.txt");10         // 创建通道,以默认编码写入诗11         FileWriter writer = new FileWriter(file);12         BufferedWriter bWriter = new BufferedWriter(writer);13 14         // 写入一行15         bWriter.write("惊闻昨夜大雨,");16         bWriter.newLine();// 回车换行17         /*18          * bWriter.writer("\r\n"); 不建议这样写(因为windows平台可以这样写,如果是Linux或Mac则是"\n")19          */20         bWriter.write("今晨河流湍急。");21         bWriter.newLine();22         bWriter.write("偶遇柱上蜗牛,");23         bWriter.newLine();24         bWriter.write("一步一步寻梦。");25         bWriter.newLine();26         bWriter.write("你我怎么可知?");27         bWriter.newLine();28         29         bWriter.flush();//刷新缓冲区30         31         //关闭管道32         bWriter.close();33         writer.close();34         35         System.out.println("写入成功");36     }37 }

 利用BufferedReader输出以上文件里的诗。

1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.IOException; 6  7 public class Test3 { 8     public static void main(String[] args) throws IOException, FileNotFoundException{ 9         File file = new File("D:"+File.separator+"javatest"+File.separator+"c.txt");10         //1创建通道11         FileReader reader = new FileReader(file);12         BufferedReader bReader = new BufferedReader(reader);13         14         //读取行15         String line;16         while ((line=bReader.readLine()) != null) {17             System.out.println(line);18             19         }20         21         bReader.close();22     }23 24 }

 

转载于:https://www.cnblogs.com/abcdjava/p/10822291.html

你可能感兴趣的文章
DB2 V9性能调整之数据库连接数
查看>>
IOS在Xcode 4.x以上如何 创建 和 添加 静态库
查看>>
WebSphere was 7.0修改端口号为80,修改上下文根
查看>>
Repeater控件数据导出Excel
查看>>
下载Android源码出现的问题
查看>>
远程桌面如何复制本地文件 远程桌面拷贝电脑上的文件方法
查看>>
[转]解决JS浮点数(小数)计算加减乘除的BUG
查看>>
ASP.NET MVC应用程序的安全性介绍总括(高级编程)
查看>>
Java模拟Delegate
查看>>
记录下,我们平时开发当中不得不知道的HTTP状态码
查看>>
HDU-1045 Fire NetFire Net 最大团
查看>>
VC++6.0 按F1无法打开 MSDN 的解决办法
查看>>
Eclipse自动部署项目到Tomcat的webapps下的有效方法
查看>>
Extjs4快速上手三——实现主界面
查看>>
如何替代Flex?
查看>>
控制属性修改时间,控制时间,联合主键
查看>>
android-包签名
查看>>
Android开发和调试必备工具-SDK Tools
查看>>
JSON.parse()和JSON.stringify()
查看>>
Ehcache 使用
查看>>