一、流的概念:流是一组有顺序的有起点和终点字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。I/O就即用于处理设备之间的数据传输。

  1、流的分类:

    a)、按操作数据单位分类:字节流字符流

    b)、按流向分类:输入流输出流

    c)、按照功能分类:节点流、处理流。

  

    字节流的抽象基类:InputStream、OutputStream
    字符流的抽象基类:Reader、Writer

二、字符流:Reader、Writer

  1、FileWriter:

  1. public class IOTest {
  2.  
  3. /**
  4. * 需求:往一个文本文件里写入一些字符、字符串
  5. * 1、创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖。
  6. * 2、调用write方法,将字符串写入到流(内存)中
  7. * 3、调用flush方法刷新缓冲中的数据,将数据刷到目的地中
  8. * 4、close方法:关闭流资源,但是关闭之前会刷新一次内存中的缓冲数据,将数据刷新到目的地中
  9. *
  10. * 注意:close和flush的区别:flush刷新后流可以继续使用;close刷新后会关闭流
  11. */
  12. public static void main(String[] args) {
  13. Writer writer = null;
  14. try{
  15. /* true:代表打开已存在的文件。如果指定的文件不存在,就会创建新的文件
  16. * 如果指定的文件已存在,不会创建新的文件,会在原有数据的基础上追加新的数据*/
  17. writer = new FileWriter("E:\\qqq.txt", true);
  18. writer.append('a'); //将指定字符添加到此 writer
  19. writer.append("123qwerewqr");//将指定字符序列添加到此 writer。
  20. writer.append("--abcdesafd", 0, 4);// 包含头,不包含尾 将指定字符序列的子序列添加到此 writer.Appendable 即将"--abcdesafd"的第0-3位上的字符添加到write上
  21. char[] ch = new char[]{'A', 'Q', 'W', 'T'};
  22. writer.write(ch);//写入数组
  23. writer.write(ch, 1, 2);//写入数组的一部分
  24. writer.write("adsfkwe\r\n字符流写入示例");// 记事本里要换行使用\r\n
  25.  
  26. writer.flush();// 调用flush方法刷新缓冲中的数据,将数据刷到目的地中
  27.  
  28. }catch(Exception e){
  29. e.printStackTrace();
  30. }finally{
  31. try {
  32. if(writer != null){
  33. writer.close();// 在关闭流资源之前,会先调用flush方法,然后再关闭
  34. }
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. }
  41.  
  42. 运行后可在相应的txt文件中看到下面的类容:
  43.  
  44. a123qwerewqr--abAQWTQWadsfkwe
  45. 字符流写入示例

  2、FileRead:

    a)、一个一个的读:

  1. public class IOTest {
  2. /**
  3. * 1、创建一个fileReader对象,和指定的文件想关联,要保证文件已经存在,如果不存在会报FileNotFoundException错误
  4. * 2、调用读取流的read方法,一次读一个字节,并且会自动往下读。
  5. * 3、调用close方法关闭资源
  6. */
  7.  
  8. public static void main(String[] args) {
  9. try {
  10. FileReader fr = new FileReader("E://qqq.txt");
  11. System.out.println((char)fr.read()); //这个地方一定要加强转,否则显示的将是ASCLL码的值
  12. //读取文件中所有的字符
  13. while(fr.ready()){ //如果保证下一个 read() 不阻塞输入
  14. System.out.print((char)fr.read());
  15. }
  16. fr.close();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }

    b)、用数组来一次性提取文件中的类容:

  1. public class IOTest {
  2. /**
  3. * 1、创建一个fileReader对象,和指定的文件想关联,要保证文件已经存在,如果不存在会报FileNotFoundException错误
  4. * 2、调用读取流的read方法,一次读一个字节,并且会自动往下读。
  5. * 3、调用close方法关闭资源
  6. */
  7.  
  8. public static void main(String[] args) {
  9. try {
  10. FileReader fr = new FileReader("E://qqq.txt");
  11. char[] buff = new char[4];
  12. int num1 = fr.read(buff);// 将字符读入至buff数组里,返回的是读取的字符数
  13. System.out.println(num1 + "\t" + String.valueOf(buff));
  14.  
  15. int num2 = fr.read(buff);
  16. System.out.println(num2 + "\t" + String.valueOf(buff));
  17. fr.close();
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }
  23.  
  24. /*
  25. 显示结果为:
  26. 4 a123
  27. 4 qwer
  28. */

三、字符流的缓冲区:缓冲区提高了流的操作效率。但必须注意在创建缓冲区之前必须要先有流的对象。

  1、BufferedWriter

  1. public class IOTest {
  2. public static void main(String[] args) {
  3. FileWriter fw = null;
  4. BufferedWriter bw = null;
  5. try {
  6. fw = new FileWriter("E:\\qqq.txt");// 创建一个字符流的输出对象
  7. bw = new BufferedWriter(fw);// 创建一个缓冲区字符流,将字符流对象作为参数传递给构造方法
  8. bw.write("asdflkj;l123123");// 通过 write方法将内容写入缓冲区里
  9. bw.write("asdflkj;l123123");
  10. bw.newLine();//写入一个行分隔符。
  11. bw.write("asflkj;l123123");
  12. bw.newLine();
  13. bw.write("asdflkj;l123123");
  14. bw.flush();// 通过flush方法将缓冲区里的内容写入至目标文件里
  15.  
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. } finally{
  19. try{
  20. if(bw != null){
  21. bw.close();// 会关闭与之相关的字符流对象
  22. }
  23. }catch(Exception e){
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. /*
  29. 在qqq.txt文件中输出结果为:
  30. asdflkj;l123123asdflkj;l123123
  31. asflkj;l123123
  32. asdflkj;l123123
  33. * */
  34. }

  2、BufferedReader

  1. public class IOTest {
  2. public static void main(String[] args) {
  3. FileReader fr = null;
  4. BufferedReader br = null;
  5. try {
  6. // 创建一个字符输入流对象
  7. fr = new FileReader("E:\\qqq.txt");
  8. // 创建一个缓冲字符输入流,将字符输入流对象作为参数传递给构造方法
  9. br = new BufferedReader(fr);
  10. String str = "";
  11. while((str = br.readLine()) != null){ //readLine():读取一个文本行
  12. System.out.println(str);
  13. }
  14. }catch (Exception e) {
  15. e.printStackTrace();
  16. } finally{
  17. try{
  18. if(br != null){
  19. br.close();// 关闭与之相关的字符流
  20. }
  21. }catch(Exception e){
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26. }

四、字节流:InputStream、OutputStream

  1、FileInputStream

  1. public class IOTest {
  2. /**
  3. * 读取a.jpg这幅图片中的数据在后台显示
  4. */
  5. public static void main(String[] args) {
  6. FileInputStream fis = null;
  7. try{
  8. fis = new FileInputStream("E:\\a.jpg");
  9. byte[] buff = new byte[1024];
  10. int len = 0;
  11. while((len = fis.read(buff)) != -1){
  12. for(int i = 0; i < len; i++){
  13. System.out.print(buff[i]);
  14. }
  15. System.out.println();
  16. }
  17.  
  18. }catch(Exception e){
  19. e.printStackTrace();
  20. }finally{
  21. try{
  22. if(fis != null){
  23. fis.close();
  24. }
  25. }catch(Exception e){
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. }

  2、FileOutputStream

  1. public class IOTest {
  2. /*
  3. * 向qqq.txt文件中写入一个一组数据
  4. */
  5. public static void main(String[] args) {
  6. FileOutputStream fos = null;
  7. try{
  8. fos = new FileOutputStream("E:\\qqq.txt");
  9. byte[] b1 = new byte[]{122, 97, 99, 65, 90};
  10. fos.write(b1);// 通过write方法写入一个字节数组
  11. }catch(Exception e){
  12. e.printStackTrace();
  13. }finally{
  14. try{
  15. if(fos != null){
  16. fos.close();
  17. }
  18. }catch(Exception e){
  19. e.printStackTrace();
  20. }
  21. }
  22. }
  23. }

  3、通过字节流及字节流缓冲区复制一个图片

  1. public class IOTest {
  2. /*将E盘中的a.jpg图片复制为b.jpg
  3. *
  4. */
  5. public static void main(String[] args) {
  6. FileInputStream fis = null;
  7. FileOutputStream fos = null;
  8. try{
  9. fis = new FileInputStream("E:\\b.jpg");
  10. fos = new FileOutputStream("E:\\c.jpg");
  11. byte[] buff = new byte[1024];
  12. int len = 0;
  13. while((len = fis.read(buff)) != -1){
  14. for(int i = 0; i < len; i++){
  15. fos.write(buff[i]);
  16. }
  17. }
  18. }catch(Exception e){
  19. e.printStackTrace();
  20. }finally{
  21. try{
  22. if(fis != null)fis.close();
  23. }catch(Exception e){e.printStackTrace();}
  24. try{
  25. if(fos != null)fos.close();
  26. }catch(Exception e){e.printStackTrace();}
  27. }
  28. }
  29. }

五、读取键盘录入:

  1. public class IOTest {
  2. /*
  3. * 读取键盘值
  4. */
  5. public static void main(String[] args) throws IOException {
  6. //获取到读取键盘录入的流对象。类型是InputStream
  7. InputStream is = System.in;
  8. while(true){
  9. int num1 = is.read();// 返回的是一个ASCLL码的值
  10. System.out.println((char)num1);
  11. }
  12.  
  13. }
  14. }

六、File:将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。separator:与系统有关的默认名称分隔符。

  1、对文件的一些常见操作的举例:

  1. public class IOTest {
  2.  
  3. public static void main(String[] args) throws IOException {
  4. /*
  5. * 实验的空目录或者说是起始目录为E:\\99
  6. */
  7. File file = new File("E:\\99\\a.txt");
  8. File file1 = new File("E:\\99\\aa");
  9. File file2 = new File("E:\\99\\bb\\cc");
  10. File file3 = new File("E:\\99\\qqq.txt");
  11. /*
  12. * 创建文件或这是一个文件夹
  13. */
  14. //创建一个"a.txt"文件,创建成功则返回true
  15. System.out.println("createNewFile():" + file.createNewFile());
  16. //创建一个名字为"aa"的文件夹
  17. System.out.println("createNewFile():" + file1.mkdir());
  18. // 创建多级目录即在E:\\99目录下先创建一个bb文件夹,再在bb文件夹下新建一个cc文件夹
  19. System.out.println("mkdirs():" + file2.mkdirs());
  20.  
  21. /*
  22. * 删除一个文件或者删除一个文件夹
  23. */
  24. System.out.println("delete():" + file.delete());
  25. System.out.println("delete():" + file1.delete());
  26. System.out.println("delete():" + file2.delete());
  27. /*
  28. * 判断
  29. */
  30. //测试此抽象路径名表示的文件或目录是否存在
  31. System.out.println("exists():" + file.exists());
  32. //测试此抽象路径名表示的文件是否是一个目录。
  33. System.out.println("isDirectory():" + file.isDirectory());
  34. //测试此抽象路径名表示的文件是否是一个标准文件。
  35. System.out.println("isFile():" + file.isFile());
  36. // 测试此抽象路径名指定的文件是否是一个隐藏文件。
  37. System.out.println("isHidden():" + file.isHidden());
  38. /*
  39. * 获取信息
  40. */
  41. //返回由此抽象路径名表示的文件或目录的名称。
  42. System.out.println("getName():" + file3.getName());
  43. //返回此抽象路径名父目录的路径名字符串,如果此路径名没有指定父目录,则返回 null。
  44. System.out.println("getParent():" + file3.getParent());
  45. //将此抽象路径名转换为一个路径名字符串。
  46. System.out.println("getPath():" + file3.getPath());
  47. //返回此抽象路径名的绝对路径名字符串。
  48. System.out.println("getAbsolutePath():" + file3.getAbsolutePath());
  49. }
  50. }

7、I/O流的更多相关文章

  1. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  4. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  5. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  6. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  7. java I/O流

    输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...

  8. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  9. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

  10. C#开源实现MJPEG流传输

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...

随机推荐

  1. Unix哲学

    01. 模块原则:使用简洁的接口拼合简单的部件. 02. 清晰原则:清晰胜于机巧. 03. 组合原则:设计时考虑拼接组合. 04. 分离原则:策略同机制分离,接口同引擎分离. 05. 简洁原则:设计要 ...

  2. XML介绍

    XML [TOC] 1.XML简介 XML是Extend Markup Langue可扩展标签语言,标签由开发着自己定义 作用是: 1.描述带关系的数据(作为软件的配置文件):包含与被包含的关系 2. ...

  3. 使用JS实现前端缓存

    在前端浏览器中,有些数据(比如数据字典中的数据),可以在第一次请求的时候全部拿过来保存在js对象中,以后需要的时候就不用每次都去请求服务器了.对于那些大量使用数据字典来填充下拉框的页面,这种方法可以极 ...

  4. python文件调用

    如果列表T是a.py中是全局的,则直接调用即可,例如 #a.py T = [1,2,3,4]   #b.py import a def test():     for i in a.T:        ...

  5. How to create a launcher for a manually extracted program in Ubuntu

    Say we have a latest Blender extracted from the download package. We want to create a launcher for B ...

  6. C#进阶系列——AOP?AOP!

    前言:今天大阅兵,可是苦逼的博主还得坐在电脑前写博客,为了弄清楚AOP,博主也是拼了.这篇打算写写AOP,说起AOP,其实博主接触这个概念也才几个月,了解后才知道,原来之前自己写的好多代码原理就是基于 ...

  7. C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  8. react 和 ractive的区别

    前面进项目的时候同事说项目在用react. 我没有深究,实际中发现是ractive.js.后来发现其实另有一个react.js.和ractive.js是有区别的.不过也有相似的地方. react项目的 ...

  9. Android开发自学笔记(Android Studio)—4.2TextView及其子类

    一.引言 TextView是我们最常用的一个控件了,它类似于C# Winform程序中的Lable,Java Swing编程中的JLable,不过相对功能更强大些,但从功能上看,它其实就是个文字编辑器 ...

  10. matlab 将多个盒图放在一张图上

    1.boxplot 将多个盒图放在一张图上 x1 = normrnd(5,1,100,1)';x2 = normrnd(6,1,200,1)';X = [x1 x2];G = [zeros(size( ...