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. 解析分布式应用框架Ray架构源码

    摘要:Ray的定位是分布式应用框架,主要目标是使能分布式应用的开发和运行. Ray是UC Berkeley大学 RISE lab(前AMP lab) 2017年12月 开源的新一代分布式应用框架(刚发 ...

  2. Vue3手册译稿 - 深入组件 - 自定义事件

    本章节需要掌握组件基础 emit我译成发射,觉得发射这个词比较形象的形容将子组件事件发射出来的一个动作. 事件名 像组件和props,事件名也会进行自动转换,如果你在子组件里发射一个驼峰命名的事件,你 ...

  3. python之对象与类

    1.类的定义 类是一个用户定义类型,类似与c语言中的结构体 class <ClassName>: "类的帮助信息"#类文档字符串 class_suite #类体 其中C ...

  4. Spring 声明式事务与编程式事务详解

    本文转载自IBM开发者论坛:https://developer.ibm.com/zh/articles/os-cn-spring-trans 根据自己的学习理解有所调整,用于学习备查. 事务管理对于企 ...

  5. sqli-labs系列——第四关

    less4 第四关的sql语句是这样的: select * from user where id=("$id"); ?id=1")–+回显正常 order by 4报错, ...

  6. Vulkan移植GpuImage(二)Harris角点检测与导向滤波

    Harris角点检测 UI还是用的上次扣像的,只有前后置可以用,别的没有效果,只看实现就好. 相应源码 在实现之前,我先重新整理编译glsl的生成工具,如Harris角点检测中间计算过程需要针对rgb ...

  7. 设计模式——从工厂方法模式到 IOC/DI思想

    回顾简单工厂 回顾:从接口的角度去理解简单工厂模式 前面说到了简单工厂的本质是选择实现,说白了是由一个专门的类去负责生产我们所需要的对象,从而将对象的创建从代码中剥离出来,实现松耦合.我们来看一个例子 ...

  8. Android Studio 之 RadioButton

    •任务 如何通过 RadioButton 实现如图所示的界面? •基本用法 RadioButton 单选按钮,就是只能够选中一个,所以我们需要把 RadioButton 放到 RadioGroup 按 ...

  9. Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序

    一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...

  10. 第6 章 : 应用编排与管理:Deployment

    应用编排与管理 本节课程要点 需求来源: 用例解读: 操作演示以及架构设计. 需求来源 背景问题 首先,我们来看一下背景问题.如下图所示:如果我们直接管理集群中所有的 Pod,应用 A.B.C 的 P ...