• java基础---缓冲流、数据流、打印流


    缓冲流

    缓冲流是套接在响应的节点流之上,对续写的数据提供缓冲的功能,提高读写的效率,同时增加了一些新方法
    以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬盘。 如果读写的频率比较高的时候,其性能表现不佳。为了解决以上弊端,采用缓存流。
    缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。
    1. package com.yan3;
    2. import java.io.BufferedReader;
    3. import java.io.FileReader;
    4. import java.io.Reader;
    5. /*
    6. * ### 缓冲流
    7. * 缓冲流是套接在响应的节点流之上,对续写的数据提供缓冲的功能,提高读写的
    8. * 效率,同时增加了一些新方法
    9. *
    10. * 以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬
    11. * 盘。 如果读写的频率比较高的时候,其性能表现不佳。为了解决以上弊端,采用
    12. * 缓存流。
    13. *
    14. * 缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都
    15. * 是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。
    16. */
    17. public class Test5 {
    18. public static void main(String[] args) {
    19. long start = System.currentTimeMillis();
    20. // useReader(); //207ms
    21. useReader2(); // 152ms
    22. long end = System.currentTimeMillis();
    23. System.out.println(end - start + "ms");
    24. }
    25. public static void useReader() {
    26. try (Reader r = new FileReader("data/calcCharNum.txt")) {
    27. while (true) {
    28. int kk = r.read();
    29. if (kk == -1) {
    30. break;
    31. }
    32. System.out.print((char) kk);
    33. }
    34. } catch (Exception e) {
    35. e.printStackTrace();
    36. }
    37. }
    38. public static void useReader2() {
    39. try (Reader r = new BufferedReader(new FileReader("data/calcCharNum.txt"))) {
    40. while (true) {
    41. int kk = r.read();
    42. if (kk == -1) {
    43. break;
    44. }
    45. System.out.print((char) kk);
    46. }
    47. } catch (Exception e) {
    48. e.printStackTrace();
    49. }
    50. }
    51. }

    构造方法

    • BufferedReader(Reader)不定义缓存大小,默认8192
    • BufferedReader(Reader in, int size)size为自定义缓冲区的大小
    • BufferedWriter(Writer)
    • BufferedWriter(Writer out, int size)size为自定义缓冲区的大小
    • BufferedInputStream(InputStream)
    • BufferedInputStream(InputStream in, int size)size为自定义缓冲区的大小
    • BufferedOutputStream(OutputStream)
    • BufferedOutputStream(OuputStream out, int size)size为自定义缓冲区的大小

    缓冲输入流的方法

    BuffedReader 提供了一个方法 readLine():String ,但是 BufferedInputStream 中并没有这个
    • BufferedReader提供了readLine方法用于读取一行字符串,以\r\n分割(换行符)
                    如果读取内容为null,则表示读取到了流的末尾
                    readLine方法会自动剔除本行内容末尾的换行符
    • BufferedWriter提供了newLine方法用于写入一个行分隔符
    对于输出的缓冲流,写入的数据会先在内存中缓存,使用 flush 方法会使内存中的数据立即写出

    键盘录入

    System.in:InputStream 用于指代系统默认的输入设备 键盘
    方法 read():int 可以实现代码执行到这里则会阻塞等待,只要输入数据为止
    1. package com.yan3;
    2. import java.io.BufferedReader;
    3. import java.io.InputStreamReader;
    4. /*
    5. * 缓冲输入流的方法
    6. *
    7. * BuffedReader提供了一个方法readLine():String,但是BufferedInputStream中并
    8. * 没有这个
    9. *
    10. * - BufferedReader提供了readLine方法用于读取一行字符串,以\r或\n分割(换行符)
    11. - 如果读取内容为null,则表示读取到了流的末尾
    12. - readLine方法会自动剔除本行内容末尾的换行符
    13. - BufferedWriter提供了newLine方法用于写入一个行分隔符
    14. 对于输出的缓冲流,写入的数据会先在内存中缓存,使用flush方法会使内存中的
    15. 数据立即写出
    16. */
    17. public class Test7 {
    18. public static void main(String[] args) throws Exception {
    19. // 要求用户输入一个合法的整型数
    20. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    21. int age = 0;
    22. while (true) {
    23. String ss = br.readLine();// BufferedReader提供的特殊方法,用于实现整行读取
    24. try {
    25. age = Integer.parseInt(ss.trim());
    26. if (age >= 18 && age <= 65) {
    27. break;
    28. } else {
    29. System.out.println("年龄范围不合法!!!");
    30. }
    31. } catch (Exception e) {
    32. System.out.println("格式错误!");
    33. }
    34. }
    35. System.out.println("合法的年龄输入为 " + age);
    36. }
    37. }
    使用缓存流并没有添加什么额外方法,只是它能够在执行过程中自动引入缓存,从而提高执行效率
    过滤流使用必须有对应的节点流,因为过滤流是装饰节点流,不是有具体的操作目标
    new BufferedReader(new FileReader(..)) new BufferedWriter(new FileWriter()) 实际上使用的还是Reader/Writer那些方法,这里从编码的角度上说,没有任何区别,但是从执行性能上说,比FileReader/Writer效率高,可以减少磁盘的读写次数
    执行 close 方法会自动关闭被装饰的对象,所以不需要再关闭 FileReader FileWriter
    执行 flush 会自动刷新数据到节点流上,但是并没有执行关闭流。针对输出流关闭时会自动先 flush 缓存再执行关闭
    使用java的输入/输出流技术将一个文本文件的内容按行读出,每读出一行就顺序添加行号,并写入到另一个文件中。
    1. package com.yan4;
    2. import java.io.BufferedReader;
    3. import java.io.BufferedWriter;
    4. import java.io.FileReader;
    5. import java.io.FileWriter;
    6. /*
    7. * 使用java的输入/输出流技术将一个文本文件的内容按行读出,每
    8. * 读出一行就顺序添加行号,并写入到另一个文件中。
    9. */
    10. public class Exec01 {
    11. public static void main(String[] args) throws Exception {
    12. try (BufferedReader br = new BufferedReader(new FileReader("src/com/yan1/Test1.java"));
    13. BufferedWriter bw = new BufferedWriter(new FileWriter("data/out1.txt"))) {
    14. int cc = 0;
    15. while (true) {
    16. String ss = br.readLine();
    17. if (ss == null)
    18. break;
    19. bw.write(++cc + "\t");
    20. bw.write(ss);
    21. bw.newLine();
    22. }
    23. }
    24. }
    25. }

    数据流

    DataInputStream DataOutputStream 两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流,它们允许程序按与机器无关的风格读写Java 数据。所以比较适合于网络上的数据传输。这两个流也是过滤器流,常以其它流如InputStream OutputStream 作为它们的输入或输出
    DataInputStram和 DataOutputStream 分别继承自 InputStream OuputStream ,属于过滤流,需要分别套接在InputStream OutputStream 类型的节点流上
    • 只有字节流,没有对应的字符流
    DataInputStream和DataOutputStream 提供了可以存取与机器无关的 Java 原始类型数据的方法
    DataInputSteram DataOutputStream 构造方法为
    • DataInputStream(InputStream)
    • DataOutputStream(OutputStream)

    用数据输出流将斐波那契级数的前二十项存放在fei.dat文件中。

    1. package com.yan3;
    2. import java.io.DataInputStream;
    3. import java.io.DataOutputStream;
    4. import java.io.EOFException;
    5. import java.io.FileInputStream;
    6. import java.io.FileOutputStream;
    7. /*
    8. * 用数据输出流将斐波那契级数的前二十项存放在fei.dat文件中
    9. */
    10. public class Test81 {
    11. public static void main(String[] args) throws Exception {
    12. DataOutputStream dos = new DataOutputStream(new FileOutputStream("data/fei.dat"));
    13. for (int i = 0; i < 20; i++) {
    14. int num = fei(i);
    15. dos.writeInt(num);
    16. }
    17. dos.close();
    18. DataInputStream dis = new DataInputStream(new FileInputStream("data/fei.dat"));
    19. try {
    20. while (true) {
    21. int kk = dis.readInt();
    22. System.out.print(kk + "\t");
    23. }
    24. } catch (EOFException e) {
    25. System.out.println("文件读取完毕");
    26. }
    27. dis.close();
    28. }
    29. public static int fei(int pos) {
    30. if (pos == 0) {
    31. return 0;
    32. }
    33. if (pos == 1) {
    34. return 1;
    35. }
    36. return fei(pos - 1) + fei(pos - 2);
    37. }
    38. }

    从fei.dat文件中读出数列,显示输出,并计算累加和

    1. package com.yan3;
    2. import java.io.ByteArrayInputStream;
    3. import java.io.ByteArrayOutputStream;
    4. import java.io.DataInputStream;
    5. import java.io.DataOutputStream;
    6. import java.io.EOFException;
    7. /*
    8. * 1、用数据输出流将菲波那契级数列的前二十项存放内存中。
    9. * 2、从内存中读出数列,显示输出,并计算累加和。
    10. */
    11. public class Test82 {
    12. public static void main(String[] args) throws Exception {
    13. ByteArrayOutputStream baos = new ByteArrayOutputStream();
    14. DataOutputStream dos = new DataOutputStream(baos);
    15. for (int i = 0; i < 20; i++) {
    16. int num = fei(i);
    17. dos.writeInt(num);
    18. }
    19. byte[] data = baos.toByteArray();
    20. DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
    21. int sum = 0;
    22. while (true) {
    23. try {
    24. int kk = dis.readInt();
    25. sum += kk;
    26. System.out.println(kk);
    27. } catch (EOFException e) {
    28. System.out.println("读取完毕!");
    29. break;
    30. }
    31. }
    32. System.out.println("累加和为 " + sum);
    33. }
    34. public static int fei(int n) {
    35. if (n < 0)
    36. throw new IllegalArgumentException();
    37. if (n == 0)
    38. return 0;
    39. if (n == 1)
    40. return 1;
    41. return fei(n - 1) + fei(n - 2);
    42. }
    43. }

    产生5000个1~9999之间的随机整数,将其存入二进制数据文件a.data中

    1. package com.yan4;
    2. import java.io.DataInputStream;
    3. import java.io.DataOutputStream;
    4. import java.io.FileInputStream;
    5. import java.io.FileOutputStream;
    6. import java.util.Random;
    7. /*
    8. * 作业题:
    9. * 练习:编写一个程序实现以下功能:
    10. * (1)产生5000个1~9999之间的随机整数,将其存入二进制数据文件a.data中。
    11. * (2)从文件中读取所有整数(文件中都是整数,但是个数未知),并计算其最大值、最小值和平均值并输出结果。
    12. */
    13. public class Exec02 {
    14. public static void main(String[] args) throws Exception {
    15. DataOutputStream dos = new DataOutputStream(new FileOutputStream("data/a.data"));
    16. Random r = new Random();
    17. for (int i = 0; i < 5000; i++) {
    18. dos.writeInt(r.nextInt(9999));
    19. }
    20. DataInputStream dis = new DataInputStream(new FileInputStream("data/a.data"));
    21. for (int i = 0; i < 5000; i++) {
    22. int kk = dis.readInt();
    23. System.out.print(kk + "\t");
    24. }
    25. dis.close();
    26. }
    27. }

    打印流

    PrintStream PrintWriter 都属于输出流,分别针对字节和字符
    PrintWriter PrintStream 都提供了重载的 print println 方法用于输出多种类型数据
    print(Object):void
    • 输出引用类型,实际上是调用对象的toString方法转换为String进行输出

    println 表示输出后自动换行
    • PrintWriterPrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
    • PrintWriterPrintStream有自动的flush功能 textOut.flushBuffer();
    PrintWriter(Writer)
    PrintWriter(Writer out, boolean autoFlush) 自动刷新 ----println
    1. package com.yan3;
    2. import java.io.FileWriter;
    3. import java.io.PrintWriter;
    4. /*
    5. * 打印流 println和print
    6. *
    7. * PrintStream和PrintWriter都属于输出流,分别针对字节和字符
    8. *
    9. * PrintWriter和PrintStream都提供了重载的print和println方法
    10. * 用于输出多种类型数据
    11. *
    12. * print(Object):void
    13. - 输出引用类型,实际上是调用对象的toString方法转换为String进行输出
    14. ```java
    15. public void println(Object x) {
    16. String s = String.valueOf(x); //调用String类中的静态方法将object类型的数据转换为字符串
    17. synchronized (this) {
    18. print(s);
    19. newLine(); //print('\n')
    20. }
    21. }
    22. //String中的valueOf方法的定义
    23. public static String valueOf(Object obj) {
    24. return (obj == null) ? "null" : obj.toString(); //如果输出对象非空,则调用对象的toString方法
    25. }
    26. ```
    27. println表示输出后自动换行
    28. - PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
    29. - PrintWriter和PrintStream有自动的flush功能`textOut.flushBuffer();`
    30. PrintWriter(Writer)
    31. PrintWriter(Writer out, boolean autoFlush)自动刷新----println
    32. */
    33. public class Test9 {
    34. public static void main(String[] args) throws Exception {
    35. // 注意实际上允许直接new PrintWriter(System.out)
    36. PrintWriter pw = new PrintWriter(new FileWriter("data/out4.dat"));
    37. for (int i = 0; i < 10; i++) {
    38. pw.println(i);
    39. // pw.print(i);
    40. }
    41. pw.close();
    42. }
    43. }
  • 相关阅读:
    MySQL运维5-Mycat配置
    【数据结构C/C++】根据前序中序和中序后续遍历结果生成二叉树
    人工神经网络用什么软件,神经网络能用来做什么
    java-net-php-python-net本科生毕业设计选导师系统演示录像2019计算机毕业设计程序
    RabbitMq 高级特性及整合SpringBoot学习总结
    vue使用elementUI的upload上传文件封装
    图的遍历应用之拯救007,python版本详细解析
    Python文件存读取
    RK3399平台开发系列讲解(I/O篇)Linux最大文件数的限制机制
    kafka日志文件详解及生产常见问题总结
  • 原文地址:https://blog.csdn.net/tiger_root/article/details/126191485