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. IDEA中通过正则表达式批量替换空白行

    快捷键Ctrl+r 填入^\s*\n,勾选Regex,Replace all

  2. 小白的第一次sql实战

    去年发的有一篇sql注入忘记粘贴过来了,今天想起了就fuzz过来一下 有id尝试sql注入 找这种sql注入的站用sql检索就行了,但是最好挂代理用谷歌搜索,百度的话搜sql注入的很多被别人打过了,导 ...

  3. webgoat白盒审计+漏洞测试

    前言 小白,记录,有问题可以交流 乖乖放上参考链接: https://www.freebuf.com/column/221947.html https://www.sec-un.org/java代码审 ...

  4. java例题_46 两个字符串拼接问题!

    1 /*46 [程序 46 字符串连接] 2 题目:两个字符串连接程序,将两个字符串拼接在一起 3 */ 4 5 /*分析 6 * 两个字符串的拼接方法 7 * concat方式 8 * 当两个量都为 ...

  5. 2021精选 Java面试题附答案(一)

    1.什么是Java Java是一门面向对象的高级编程语言,不仅吸收了C++语言的各种优点,比如继承了C++语言面向对象的技术核心.还摒弃了C++里难以理解的多继承.指针等概念,,同时也增加了垃圾回收机 ...

  6. 围绕 Kubernetes 的 8 大 DevOps 生产关键实践

    本文主要介绍 DevOps 的 8 大关键实践在 Kubernetes 平台下如何落地,结合我们目前基于 Kubernetes 平台的 DevOps 实践谈谈是如何贯彻相关理念的,这里不会对其具体实现 ...

  7. 关于一次配合开发工作而产生的服务器内核参数问题(Android 网络问题)

    关于一次配合开发工作而产生的服务器内核参数问题(Android 网络问题) 问题转载(本人与作者遇到了同样的问题) 问题描述 问题描述:在这几年的Android开发中,遇到了一个困扰我好久的问题,有时 ...

  8. 【oracle学习笔记02】Oracle Architecture —— Process Structure

    Oracle中有三类进程: 1 User Process 2 Server Process Server Process is a program that directly interacts wi ...

  9. 【学习底层原理系列】重读spring源码3-加载beanDefinition的方法obtainFreshBeanFactory

    obtainFreshBeanFactory()方法概述 定义BeanFactory,并加载以下两种bean的定义,装配到BeanFactory: 1.配置文件中定义的bean 2.通过<con ...

  10. 翻译:《实用的Python编程》InstructorNotes

    实用的 Python 编程--讲师说明 作者:戴维·比兹利(David Beazley) 概述 对于如何使用我的课程"实用的 Python 编程"进行教学的问题,本文档提供一些通用 ...