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疯狂讲义》、黑马程序员课程讲义

最新文章

  1. 【PCB】【AD使用】多图纸设计
  2. 读取nutch爬取内容方法
  3. 每天一个linux命令(4):mkdir命令
  4. ubuntu 12.04亮度无法调节和无法保存屏幕亮度解决办法(echo_brightness)
  5. c3p0配置详解
  6. 学习笔记:js、css、html判断浏览器的各种版本
  7. 准备学一学go-lang啦 ~~ 学习Go应该用什么姿势? !
  8. Request/Server模式
  9. MON166 FAQ
  10. UIWebView与JS的深度交互-b
  11. 专题二、ArrayList序列化技术细节详解
  12. SPSS19.0实战之聚类分析
  13. [iOS]C语言技术视频-14-指针变量高级用法(函数指针)
  14. 在centos6上实现LAMP的FPM模式
  15. 项目总结2——mybatis配置的理解
  16. Day 23 面向对象(二)
  17. 使用C#+PowerShell进行Windows系统间文件传输
  18. ELK部署详解--kibana
  19. delphi 大文件的读写 使用 MapviewOffile
  20. ABP框架源码中的Linq扩展方法

热门文章

  1. 从RocketMQ的Broker源码层面验证一下这两个点
  2. Srping源码之BeanFactory.getBean
  3. Android Studio配置colors.xml
  4. docker部署skywalking
  5. 如何快速创建odoo模块,使用脚手架快速创建自己的odoo应用app
  6. EFCore3.1+编写自定义的EF.Functions扩展方法
  7. BBR拥塞算法的简单解释
  8. Fastbin attack 总结
  9. Java与Python中的‘%’运算符意义一样么?
  10. 1.设置和验证MySQL数据库的隔离级别