Java中常见流学习汇总

流的含义

流在Java中是指计算中流动的缓冲区。

从外部设备流向中央处理器的数据流成为“输入流”,反之成为“输出流”。

字符流和字节流的主要区别:

1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。

2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

常用流的总纲

字节流

字节输入流InputStream

FileInputStream、BufferedInputStream和DataInputStream

1.FileInputStream

  • FileInputStream(File file)链接一个文件来创建字节输入流,即读取File所链接的文件

  • FileInputStream(String name) 直接链接name(路径地址)所指定的文件

  • 常用方法void close(),关闭该输入流

2. BufferedInputStream缓冲输入

  • BufferedInputStream(InputStream in) 使用一个输入流作为参数创建缓冲输入流,例如

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:/Users/chang/Pictures/小火龙.jpg"));
  • BufferedInputStream(InputStream in,int size):创建一个具有指定缓冲区大小的缓冲输入流

  • 常用方法

    • void close();关闭此输入流
    • int read();从输入流中读取数据的下一个字节
    • int read(byte[] b,int off,int len):从此字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中。
    byte[] b= new byte[1024*8];
    int len;
    while((len=bis.read(b))!=-1){
    bos.write(b,0,len);
    }
    //读取数据示例

3. DataInputStream

  • DataInputStream(InputStream in)
  • 常用方法
    • int read(byte[] b):从包含的输入流中读取一定数量的字节并将它们存储到缓冲区数组b中
    • int read(byte[] b,int off,int len):从包含的输入流中将最多len个字节读入一个byte数组中

字节输出流OutputStream

FileOutputStream、BufferedOutputStream和DataOutputStream

1. FileOutputStream

  • FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。

  • FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。

  • 常用方法:

    • void close():关闭此文件输出流并释放与此流有关的所有系统资源。
    • void write(byte[] b):将b.length个字节从指定byte数组写入此文件输出流中。
    • void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。
    • void write(int b):将指定字节写入此文件输出流。

2.BufferedOutputStream缓冲

  • BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流
  • BufferedOutputStream(OutputStream out,int size):创建一个新的缓冲输出流,来将具有指定缓冲区大小的数据写入指定的底层输出流。
  • 常用方法
    • void flush():刷新此缓冲的输出流
    • void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此缓冲的输出流。
    • void write(int b):将指定的字节写入此缓冲的输出流。
public class BufferedDemo {
public static void main(String[] args) throws FileNotFoundException {
// 记录开始时间
long start = System.currentTimeMillis();
// 创建流对象
try (
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));
){
// 读写数据
int len;
byte[] bytes = new byte[8*1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0 , len);
}
} catch (IOException e) {
e.printStackTrace();
}
// 记录结束时间
long end = System.currentTimeMillis();
System.out.println("缓冲流使用数组复制时间:"+(end - start)+" 毫秒");
}
}

3.DataOutputStream

  • DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流。
  • 常用方法
    • void flush():清空此数据输出流
    • void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入基础输出流。

字符流

字符输入流Reader

1.FileReader

  • FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。
public class FileReaderConstructor throws IOException{
public static void main(String[] args) {
// 使用File对象创建流对象
File file = new File("a.txt");
FileReader fr = new FileReader(file); // 使用文件名称创建流对象
FileReader fr = new FileReader("b.txt");
}
}
  • 常用方法

    • int read()每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1

    • int read(char[] cbuf)每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1

    • public class FRRead {
      public static void main(String[] args) throws IOException {
      // 使用文件名称创建流对象
      FileReader fr = new FileReader("read.txt");
      // 定义变量,保存数据
      int b ;
      // 循环读取
      while ((b = fr.read())!=-1) {
      System.out.println((char)b);
      }
      // 关闭资源
      fr.close();
      }
      }
    • public class FISRead {
      public static void main(String[] args) throws IOException {
      // 使用文件名称创建流对象
      FileReader fr = new FileReader("read.txt");
      // 定义变量,保存有效字符个数
      int len ;
      // 定义字符数组,作为装字符数据的容器
      char[] cbuf = new char[2];
      // 循环读取
      while ((len = fr.read(cbuf))!=-1) {
      System.out.println(new String(cbuf,0,len));
      }
      // 关闭资源
      fr.close();
      }
      }

2.BufferedReader缓冲

  • BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。

  • BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。

  • 常用方法

    • void close():关闭该流并释放与之关联的所有资源。
    • void mark(int readAheadLimit):标记流中的当前为止。
    • boolean markSupported():判断此流是否支持mark()操作。
    • int read():读取单个字符。
    • int read(char[] cbuf,int off,int len):将字符读入数组的某一部分。
    • String readLine():读取一个文本行。

字符输出流Writer

FileWriter

  • FileWriter(File file):根据给定的File对象构造一个FileWriter对象

  • FileWriter(String filename):根据给定的文件名构造一个FileWriter对象

  • 常用方法

    • void writer(int c)写入单个字符
    • void write(char[] cbuf) 写入字符数组
    • abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数
    • void write(String str) 写入字符串。
    • void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    • void flush() 刷新该流的缓冲。
    • void close() 关闭此流,但要先刷新它。
  • public class FWWrite {
    public static void main(String[] args) throws IOException {
    // 使用文件名称创建流对象
    FileWriter fw = new FileWriter("fw.txt");
    // 写出数据
    fw.write(97); // 写出第1个字符
    fw.write('b'); // 写出第2个字符
    fw.write('C'); // 写出第3个字符
    fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。 /*
    【注意】关闭资源时,与FileOutputStream不同。
    如果不关闭,数据只是保存到缓冲区,并未保存到文件。
    */
    // fw.close();
    }
    }

2.BufferedWriter缓冲

  • public BufferedReader(Reader in) :创建一个 新的缓冲输入流。

  • public BufferedWriter(Writer out): 创建一个新的缓冲输出流。

  • // 创建字符缓冲输入流
    BufferedReader br = new BufferedReader(new FileReader("br.txt"));
    // 创建字符缓冲输出流
    BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
  • 特有方法

    • public void newLine(): 写一行行分隔符,由系统属性定义符号。
  public class BufferedWriterDemo throws IOException {
public static void main(String[] args) throws IOException {
// 创建流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
// 写出数据
bw.write("黑马");
// 写出换行
bw.newLine();
bw.write("程序");
bw.newLine();
bw.write("员");
bw.newLine();
// 释放资源
bw.close();
}
}

Java输入/输出流常用流分类

摘抄自<<Java疯狂讲义>>

注:下表中带斜体的是抽象类,不能创建对象。粗体部分是节点流,其他就是常用的处理流。

流分类 使用分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
节点流 访问文件 FileInputStream FileOutStream FileReader FileWriter
访问数值 ByteArrayInputStream ByteArrayOutStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutStream PipedReader PipedWriter
访问字符串 StringReader StringWriter
处理流 缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
转换流 InputStreamReader OutputStreamWriter
对象流 ObjectInputStream ObjectOutputStream
抽象基类(过滤) FilterInputStream FilterOutputStream FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回输入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DataOutputStream

参考链接:https://www.cnblogs.com/lca1826/p/6427177.html

参考链接:https://www.cnblogs.com/moonpool/p/5488463.html

参考链接:https://www.cnblogs.com/xiohao/p/8997401.html

参考资料:《Java疯狂讲义》、黑马程序员课程讲义

JavaI/O流汇总的更多相关文章

  1. java--I/O流总结

    java中的I/O流从所操作的数据单元上分为两类:字节流和字符流. 1.字节流 字节流主要有两个抽象基类:InputStream和OutputStream:其中InputStream是输入字节流,Ou ...

  2. day10(IO流汇总)

    字节流 (Reader,Writer) 输入流  FileReader public class Demo { public static void main(String[] args) throw ...

  3. java流汇总以及使用实例

    流一.基本概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络) 读入到内存中,形成了流,然后将这些流还可以写到另外的目的地 ...

  4. c#文件流汇总

    操作文件比较常见,项目中经常出现这样的需求:按每个月自动创建文件,并且向文件里面插入一些数据,那么我们将要分析,文件是否存在的情况:如果存在则直接打开文件流向文件中插入数据,如果不存在,则创建文件再插 ...

  5. JAVA-I/O流任务

    作业地址 5. Scanner基本概念组装对象 编写public static List readStudents(String fileName)从fileName指定的文本文件中读取所有学生,并将 ...

  6. 再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  7. Java学习从菜鸟变大鸟之二 输入输出流(IO)

    在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者来说都是很重要的,今天就来总结一下JavaI/O. 流 流是一个很形象的概念,当程序需要读取数据的 ...

  8. SecureCRT 命令行备注

    > 查出某个域名绑定的IP nslookup api.kaixin001.com Non-authoritative answer: Name:    a.kaixin001.com Addre ...

  9. java8(2)--- Stream API

    1.简述 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一 个就是 Stream API. Stream 是处理集合的抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复 ...

随机推荐

  1. python graphviz的使用(画图工具)

    参考文章1 参考文章2 一.graphviz安装及配置 graphviz实际上是一个绘图工具,可以根据dot脚本画出树形图等. 1.windows安装 安装graphviz软件:https://gra ...

  2. python-@函数装饰器

    例如@classmethod,@staticmethod的本质就是函数装饰器,其中,classmethod和staticmethod都是python的内置函数 使用@引用已有的函数后,可用于修饰其他函 ...

  3. go-echarts 入门安装和使用

    在 Golang 这门语言中,目前数据可视化的第三方库还是特别少,go-echarts的开发就是为了填补这部分的空隙.Echarts是百度开源的非常优秀的可视化图表库,凭借着良好的交互性,精巧的图表设 ...

  4. hdu 4622 (hash+“map”)

    题目链接:https://vjudge.net/problem/HDU-4622 题意:给定t组字符串每组m条询问--求问每条询问区间内有多少不同的子串. 题解:把每个询问区间的字符串hash一下存图 ...

  5. springboot集成swagger实战(基础版)

    1. 前言说明 本文主要介绍springboot整合swagger的全过程,从开始的swagger到Knife4j的进阶之路:Knife4j是swagger-bootstarp-ui的升级版,包括一些 ...

  6. 配置docker的pdflatex环境

    技术背景 Latex在文档撰写方面是不可或缺的工具,尤其是在写文章方面,是必须要用到的文字排版工具.但是latex的环境部署并不是一个特别人性化的操作,尤其是在各种不同的平台上操作是完全不一样的,还经 ...

  7. java例题_28 冒泡排序

    1 /*28 [程序 28 排序算法] 2 题目:对 10 个数进行排序 3 程序分析:可以利用选择法,即从后 9 个比较过程中,选择一个最小的与第一个元素交换, 下次类推, 4 即用第二个元素与后 ...

  8. Android Studio 上传本地项目到 GitHub 上

    •准备工作 注册 GitHub 账号 [GitHub官网] [视频教程] 安装 Git [官方链接] [极速下载链接] 创建本地代码仓库 在桌面上,鼠标右击,选择  Git Bash Here : 接 ...

  9. 前端 | JS Promise:axios 请求结果后面的 .then() 是什么意思?

    Promise 是JS中一种处理异步操作的机制,在现在的前端代码中使用频率很高.Promise 这个词可能有点眼生,但你肯定见过 axios.get(...).then(res => {...} ...

  10. OAuth2.0理解和用法

    现在网络的资料到处都是,很容易搜索到自己想要的答案.但答案通常只能解决自己一部分的问题.如果自己想要有一套自己的解决方案,还得重新撸一遍靠谱. 我需要学下OAuth2.0吗? 没看之前以为OAuth2 ...