IO流(应用广泛)

1.概念与三要素

本质是一套用于数据传输的机制
分类:
根据传输的方向(参照物–内存)
输入流:往内存传输数据
输出流:从内存往外传输数据

根据数据传输方式:
字符流:底层以字符形式进行传输
字节流:底层以字节形式进行传输

根据数据存放/获取的位置:硬盘、内存、网络、外设设备

四大基本流(对于的四个类都是抽象类)

2.硬盘

字符流

往硬盘.txt文件写入数据 字符输出流 文件—FileWriter(文件字符输出流)

package
cn.tedu.io.file;import
java.io.FileWriter;
import
java.io.IOException;public class FileWriterDemo1 {public static void main(String[] args) throws IOException {//创建文件字符输出流对象//创建对象过程中会检测路径信息是否存在如果不存在就新建空文件//如果指定路径信息存在则创建新的空文件进行覆盖//为了保证输出流能往文件写入数据(之前已经有的数据不会影响新的写入数据)FileWriter writer=new FileWriter("E:\\1.txt");//写出数据//底层为了提高和保证传输数据效率//提供缓冲区来传输数据并且要求存满了才进行传输//此时数据没有存满缓冲区就滞留在缓冲区数据丢失了writer.write("七夕快乐");//冲刷缓冲区//即使数据没有存满也会进行传输//防止数据滞留在缓冲区writer.flush();//关流//含有自动冲刷的过程writer.close();//把流对象置为null(无用对象)writer=null;}
}

从硬盘.txt文件读取内容 字符输入流 文件—FileReader(文件字符输入流)

读取文件方式一:逐个字符来读取文本文件

package cn.tedu.text;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class FileReaderDemo {public static void main(String[] args) throws IOException {//创建文件字符输入流对象//底层没有自带的缓冲区FileReader reader=new FileReader("F:\\a.txt");//返回单个字符的编码值/*System.out.println(reader.read());System.out.println(reader.read());System.out.println(reader.read());//读取完毕的标志---返回-1System.out.println(reader.read());*///通过循环实现int i=-1;//把方法返回值(读取到的字符编码值)赋值给新变量,再让新变量和-1进行比较while ((i=reader.read())!=-1){//输出新变量的值(方法读取到的字符编码值)System.out.println(i);}}
}

读取文件方式二:使用数组来读取文本文件

package cn.tedu.text;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class FileReaderDemo1 {public static void main(String[] args) throws IOException {//创建字符输入流对象FileReader reader=new FileReader("F:\\1.txt");//自建缓冲区//新数组char[] cs=new char[5];//方法返回值就是读取字符的个数,返回-1读取结束int len=-1;while ((len=reader.read(cs))!=-1){//把每次读取到的数据放到数组中//展示数组内容System.out.println(new String(cs,0, len));}//关流reader.close();}
}

字节流:

往硬盘.txt文件写入内容 字节输出流 文件—FileOutputStream(文件字节输出流)

package cn.tedu.text;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamDemo {public static void main(String[] args) throws IOException {//创建文件字节输出流对象//底层没有自带的缓冲区//如果不指定append那么默认为false就是每次新建一个空文件覆盖之前的内容//如果指定append为true那么每次就是追加数据FileOutputStream fos=new FileOutputStream("F:\\2.txt");//调用方法来写出数据fos.write("你好".getBytes());//关流fos.close();}
}

从硬盘.txt文件读取内容 字节输入流 文件—FileInputStream(文件字节输入流)

package cn.tedu.text;import java.io.FileInputStream;
import java.io.IOException;public class FileInputStreamDemo {public static void main(String[] args) throws IOException {//创建文件字节输入流对象FileInputStream fis=new FileInputStream("F:\\3.txt");//返回一个字节对应的编码值System.out.println(fis.read());System.out.println(fis.read());System.out.println(fis.read());//返回-1时说明读取完成System.out.println(fis.read());//自建缓冲区byte[] bs=new byte[10];int len=-1;//返回的是读取到的字节数、遇到-1说明读取完毕while ((len=fis.read(bs))!=-1){System.out.println(new String(bs,0,len));}//关流fis.close();}
}
3.缓冲流(给别的流提供缓冲区)

BufferedReader—给字符输入流提供缓冲区
新的方法:readLine()–读取一行

package cn.tedu.buffer;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferReaderDemo {public static void main(String[] args) throws IOException {//创建缓冲对象BufferedReader br=new BufferedReader(new FileReader("F:\\4.txt"));//读取数据(一行)/*System.out.println(br.readLine());System.out.println(br.readLine());System.out.println(br.readLine());System.out.println(br.readLine());*///用循环实现String str="";while ((str=br.readLine())!=null){System.out.println(str);}//关流br.close();}
}

BufferWriter–提供一个更大的缓冲区
新的方法:newLine()–换行

package cn.tedu.buffer;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferWriterDemo {public static void main(String[] args) throws IOException {//创建缓冲流对象//BufferedReader和FileReader都是Reader的子类---同类//同类对象给本类对象增强了功能---装饰者设计模式BufferedWriter bw=new BufferedWriter(new FileWriter("F:\\1.txt"));//写出数据bw.write("abc");//换行//windows换行符:/r、/n//Linux换行符:/nbw.newLine();bw.write("123");//关流bw.close();}
}

解释一下装饰者模式:
模式:遇到统一问题时给出统一的解决方式
设计模式:在软件开发中,遇到同一问题给出统一的解决方案
装饰者模式:同类对象给本类对象增强(完善)功能

4.转换流

OutputStreamWriter—把字符流转成字节流

package cn.tedu.buffer;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;public class OutputStreamWriterDemo {public static void main(String[] args) throws IOException {//创建转换流对象//转换流对象是由文件字节输出流对象来构建//底层真正来进行传输数据的是文件字节输出流对象//接收准备数据时用的是字符流,但是底层真正往外写出数据用的是字节流//转换流---字符流转成字节流OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("F:\\1.txt"));//写出数据//往外写出数据需要先准备数据//事先需要准备数据都是字符形式的数据---需要提供一个字符流来操作数据osw.write("你好");//关流osw.close();}
}

InputStreamReader—把字节流转成字符流

package cn.tedu.buffer;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class InputStreamReaderDemo {public static void main(String[] args) throws IOException {//创建转换流对象//转换流的对象是由文件字节输入流对象来构建//底层真正来读取数据的是文件字节输入流//先根据文件字节输入流来读取数据//再根据字符流来提供展示的数据//转换流---字节流转成字符流InputStreamReader isr=new InputStreamReader(new FileInputStream("F:\\1.txt"));//读取数据char[] cs=new char[10];//自建缓冲区int len=-1;//展示数据---字符形式数据//展示的数据由字符流来接收while ((len=isr.read(cs))!=-1){System.out.println(new String(cs,0,len));}//关流isr.close();}
}
5.系统流:

out、err、in(都是字节流)
系统流都是静态的流对象,使用完毕之后不能关流

package cn.tedu.buffer;import java.util.Scanner;public class SystemDemo {public static void main(String[] args) {/* //输出正确结果(黑色)//out---字节输出流对象System.out.println(1);//输出错误结果(红色)//err---字节输出流对象System.err.println(1);//in---字节输入流对象new Scanner(System.in);*/Scanner sc1=new Scanner(System.in);int num1=sc1.nextInt();System.out.println(num1);//关流//in是静态流对象,如果关闭了其他地方都不能使用sc1.close();Scanner sc2=new Scanner(System.in);int num2=sc2.nextInt();System.out.println(num2);}
}
6.打印流:

print方法以及println方法都是定义在打印流里

package cn.tedu.buffer;import java.io.IOException;
import java.io.PrintStream;public class PrintStreamDemo {public static void main(String[] args) throws IOException {//创建打印流对象PrintStream ps=new PrintStream("F:\\3.txt");//写出数据ps.print(22);ps.println("abc");ps.write("466".getBytes());//关流ps.close();}
}
7.IO流中的异常捕获

1.在try块外声明流对象赋值为null,在try块里进行真正的初始化
2.保证流对象初始化成功之后才能进行关流
3.无论关流成功与否,流对象都要置为null让系统进行回收
4.如果关流操作失败发生在自动冲刷之前那么需要添加冲刷过程,保证数据不会滞留在缓冲区。

代码演示:

package
cn.tedu.io.file;import
java.io.FileWriter;
import
java.io.IOException;public class FileWriteDemo2 {public static void main(String[] args) {//声明IO流对象并且赋值为nullFileWriter writer=null;try {//流对象进行真正的初始化writer =new FileWriter("D:2.txt");//写出数据writer.write("anc");//4.手动冲刷writer.flush();} catch (IOException e) {e.printStackTrace();}finally {//2.判断流对象是否初始化成功if (writer!=null)try {writer.close();} catch (IOException e) {e.printStackTrace();}finally {//无论关流是否成功都要把流对象置为null}}}
}

练习:判断有多少个.java和class文件:

package cn.tedu.text;import java.io.File;public class FileText {//计数变量private static int countJava = 0;private static int countClass = 0;public static void main(String[] args) {//创建代表文件类的对象File file = new File("C:" + "\\Users\\Administrator.TEDU-20181205MG" + "\\IdeaProjects\\JAVASE2007");//调用方法统计文件countFiles(file);System.out.println(".java文件:" + countJava + ".class文件:" + countClass);}//定义方法来统计文件个数public static void countFiles(File file) {//判断是否是文件夹if (file.isDirectory()) {//把当前文件夹下所有的信息展示File[] fs = file.listFiles();//遍历数组for (File f : fs) {//递归调用countFiles(f);}} else if (file.getName().endsWith(".java")) {countJava++;} else if (file.getName().endsWith(".class")) {countClass++;}}
}

Java基础(十五)IO流---字符流(Reader、Writer)、字节流(InputStream、OutputStream)相关推荐

  1. Java学习笔记之 IO包 字符流

    字符流:Writer/Reader(字符流) 通过子类FileWriter和FileReader实现父类实例化 package iotest; import java.io.File; import ...

  2. 弱引用使用场景桌面_吃透Java基础十五:强引用、软引用、弱引用、虚引用

    本文首发CSDN博客地址:https://blog.csdn.net/u013277209?viewmode=contents 前言 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就 ...

  3. 第十五章 IO流(转换流 字符流 字符缓冲流 打印流)

    Java基础15 第十五章 IO流(转换流 字符流 字符缓冲流 打印流) 15.1 字符编码和字符集 15.1.1 字符编码 15.1.2 字符集 15.1.3 String类getBytes()方法 ...

  4. 重拾Java基础知识:IO流

    I0流 前言 字节流 InputStream OutputStream 字符流 Reader Writer 缓存流 转换流 序列化流 数据流 字节数组流 打印流 校验流 数据压缩 ZIP压缩和解压 G ...

  5. Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)

    1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...

  6. Java字节缓冲流/字符流/IO流小结

    文章目录 字节缓冲流 字节缓冲流构造方法 字符流 为什么会出现字符流 编码表 字符串中的编码解码问题 字符流中的编码解码问题 字符流写数据的5种方式 字符流读数据的2种方式 字符缓冲流 字符缓冲流特有 ...

  7. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  8. Java IO: 其他字符流(下)

    转载自   Java IO: 其他字符流(下) 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackRe ...

  9. 【JAVA基础篇】IO流

    一.流的概念 "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务." ――<Think in Java> 无论是系统.还是语言的设计中IO的设计都是异常复 ...

  10. java io字符流_Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

最新文章

  1. 同步两个数据库的结构或者数据
  2. [LeetCode] Valid Anagram - 字符串排序比较系列
  3. 为什么选择微服务架构?如何取舍?
  4. gitmaven命令
  5. 服务器连接工具mat_将个人笔记本改造成Linux简易服务器
  6. ajax php 错误提示,php – jQuery AJAX错误处理
  7. JS:1.5,日期(Date)对象
  8. python可以下载百度文库的文档_Python 文档
  9. Linux程序设计(常用Linux命令)
  10. 奥塔哥大学计算机科学怎样,2019QS世界大学学科排名出炉,新西兰最强专业看过来!...
  11. 机器人操作系统ROS 1.0 和 2.0 发展规划2018-2025(Open Robotics)译
  12. js练习:筋斗云案例练习
  13. CUDA学习:Windows下的CUDA环境配置
  14. 学术规范与论文写作 答案
  15. 面试题总结 —— JAVA高级工程师
  16. 3ds max材质编辑器加载不了、不显示vray
  17. 诺禾-NFS 效劳器
  18. 云服务器挂机装什么系统,哪个云服务器挂机器人系统比较便宜
  19. 普通女大学生,不走捷径,如何能快速在广州买房买车?
  20. OpenPLC--可编程控制器的发展趋势

热门文章

  1. 数码摄影色彩管理ABC
  2. 威联通 532x qts5.0 篇八 :docker 安装mysql
  3. 由建站学linux第2课 --- 阿里云的使用
  4. 计算机的主要性能指标
  5. NREC Max-Pac 8.72 中文版 高级教程 初级教程 nrec教程 nrec8.72
  6. 线性代数学习笔记——第二十讲——矩阵秩的定义
  7. 物联网竞赛LoRa模块采集温湿度
  8. UQLab——其他概率分布随机变量转换标准Gaussian分布
  9. BigBrother的大数据之旅 Day 5 负载均衡
  10. 【编译原理】复习总结