目录

  • 内存流
    • 1. 字节数组流
    • 2. 字符数组流
    • 3. 字符串流
      • a. 综合应用

内存流

  • 常用的内存流包括字节数组流 ByteArrayInputStream、字符数组流 CharArrayReader、字符串流 BufferedReader;

1. 字节数组流

  • 如果程序在运行的过程中要产生一些 临时文件,可以采用虚拟文件方式实现,JDK 中提供了 ByteArrayInputStream 和 ByteArrayOutputStream 两个类,可以实现类似于内存虚拟文件的功能;
  • 其中 ByteArrayInputStream 是输入流的一种实现,而 ByteArrayOutputStream 是输出流的一种实现;
  • java.io.ByteArrayInputStream,详见:Class ByteArrayInputStream;java.io.ByteArrayOutputStream,详见:Class ByteArrayOutputStream;
  • ByteArrayInputStream 类的使用:
import java.io.InputStream;
import java.io.OutputStream;public class Test {public static void main(String[] args) throws Exception {String tmp = "abc";byte[] src = tmp.getBytes();    // src为转换前的内存块ByteArrayInputStream input = new ByteArrayInputStream(src);ByteArrayOutputStream output = new ByteArrayOutputStream();new Test().transform(input, output);byte[] result = output.toByteArray();    //result为转换后的内存块System.out.println(new String(result));}public void transform(InputStream in, OutputStream out) {int c = 0;try {while ((c = in.read()) != -1) {   //read在读到流的结尾处返回-1int C = (int) Character.toUpperCase((char) c);out.write(C);}} catch (Exception e) {e.printStackTrace();}}
}
/*
输出
ABC*/

2. 字符数组流

  • 字符数组流包括字符数组输入流 CharArrayReader 和字符数组输出流 CharArrayWriter,操作的数据都以字符为单位;
  • CharArrayReader 继承自 Reader 类,用于读取字符数组;而 CharArrayWriter 继承自 Writer 类,用于输出字符数组;
  • java.io.CharArrayReader,详见:Class CharArrayReader;java.io.CharArrayWriter,详见:Class CharArrayWriter;
  • 字符数组的应用:
import java.io.CharArrayReader;
import java.io.IOException;public class Test {private static final int LEN = 5;// 对应英文字母“abcdefghijklmnopqrstuvwxyz”private static final char[] ArrayLetters = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};public static void main(String[] args) {tesCharArrayReader();}/*** CharArrayReader的API测试函数*/private static void tesCharArrayReader() {try {// 创建CharArrayReader字符流,内容是ArrayLetters数组CharArrayReader car = new CharArrayReader(ArrayLetters);// 从字符数组流中读取5个字符for (int i = 0; i < LEN; i++) {// 若能继续读取下一个字符,则读取下一个字符if (car.ready() == true) {// 读取“字符流的下一个字符”char tmp = (char) car.read();System.out.printf("%d : %c\n", i, tmp);}}// 若“该字符流”不支持标记功能,则直接退出if (!car.markSupported()) {System.out.println("mark not supported!");return;}// 标记“字符流中下一个被读取的位置”。即--标记“f”,因为因为前面已经读取了5个字符,所以下一个被读取的位置是第6个字符”// (01), CharArrayReader类的mark(0)函数中的“参数0”是没有实际意义的。// (02), mark()与reset()是配套的,reset()会将“字符流中下一个被读取的位置”重置为“mark()中所保存的位置”car.mark(0);// 跳过5个字符。跳过5个字符后,字符流中下一个被读取的值应该是“k”。car.skip(5);// 从字符流中读取5个数据。即读取“klmno”char[] buf = new char[LEN];car.read(buf, 0, LEN);System.out.printf("buf=%s\n", String.valueOf(buf));// 重置“字符流”:即,将“字符流中下一个被读取的位置”重置到“mark()所标记的位置”,即f。car.reset();// 从“重置后的字符流”中读取5个字符到buf中。即读取“fghij”car.read(buf, 0, LEN);System.out.printf("buf=%s\n", String.valueOf(buf));} catch (IOException e) {e.printStackTrace();}}
}
/*
输出
0 : a
1 : b
2 : c
3 : d
4 : e
buf=klmno
buf=fghij*/

3. 字符串流

  • 字符串流包括字符串输入流 BufferedReader 和字符串输出流 BufferedWriter;
  • BufferedReader 类是 Reader 类的子类,使用该类可以以 为单位读取数据;
  • java.io.BufferedReader,Class BufferedReader;
  • BufferedReader 类提供了 Reader 类没有的 ReaderLine() 方法,该方法可以读取文本行,使用如下:
import java.io.BufferedReader;
import java.io.FileReader;public class Test {public static void main(String[] args) {FileReader fr;try{fr=new FileReader("C:\\Users\\80626\\Desktop\\1.txt");BufferedReader br = new BufferedReader(fr);String aline;while((aline=br.readLine())!=null){String s= new String(aline);System.out.println(s);}fr.close();br.close();}catch(Exception e){e.printStackTrace();}}
}
/*
输出
wqeqw
dsfad*/
  • BufferedWriter 类是 Writer 类的子类,使用该类可以以 为单位写出数据;
  • java.io.BufferedWriter,详见:Class BufferedWriter;
  • BufferedWriter 类提供了 Writer 类没有的 newLine() 方法,该方法是换行标记,使用如下:
import java.io.BufferedWriter;
import java.io.FileWriter;public class Test {public static void main(String[] args) {FileWriter fw;try {fw = new FileWriter("C:\\Users\\80626\\Desktop\\1.txt");BufferedWriter bw = new BufferedWriter(fw);bw.write("line 1");bw.newLine();bw.write("line 2");bw.close();} catch (Exception e) {e.printStackTrace();}}
}
/*
输出文件
line 1
line 2*/

a. 综合应用

  • 创建两个 File 类对象;
  • 判断两个文件是否存在,不存在就新建该文件;
  • 将从一个文件中读取的数据复制到另一个文件中,最终使得两个文件内容相同;
import java.io.*;public class Test {public static void main(String[] args) {try {FileReader fr;fr = new FileReader("C:\\Users\\80626\\Desktop\\1.txt");File file = new File("C:\\Users\\80626\\Desktop\\2.txt");//1.FileWriter读取文件FileWriter fos = new FileWriter(file);//2.BufferedReader初始化BufferedReader br = new BufferedReader(fr);//3.FileWriter赋值给BufferedWriterBufferedWriter bw = new BufferedWriter(fos);String str = null;while ((str = br.readLine()) != null) {bw.write(str);bw.newLine();//或直接在上面加"+\n"也可以}br.close();bw.close();} catch (Exception e) {e.printStackTrace();}}
}
/*
输出文件1
line 1
line 2文件2
line 1
line 2*/

Java memory stream 内存流相关推荐

  1. jpeg2000(j2k)图像编码解码:c++实现openjpeg内存流接口(memory stream)

    前阵子用libjpeg-turbo实现jpeg图像在内存中编码与解码 参见<libjpeg:实现jpeg内存解压缩塈转换色彩空间/压缩分辨率>,<libjpeg:实现jpeg内存压缩 ...

  2. java 8 Stream中操作类型和peek的使用

    文章目录 简介 中间操作和终止操作 peek 结论 java 8 Stream中操作类型和peek的使用 简介 java 8 stream作为流式操作有两种操作类型,中间操作和终止操作.这两种有什么区 ...

  3. java stream 内存占用_JavaSE-内存流ByteArrOutputStream的简单说明

    如果你想多次使用同一个流中的数据,你可能就需要到我们的内存流ByteArrInputStream/ByteArrOutputStream. 下面对ByteArrOutputStream做简单说明: 此 ...

  4. Java——I/O(字符编码、内存流、打印流、System、输入流、序列化)

    目录 1.常见的编码 2.乱码产生原因 3.内存流 3.1 分类 3.2应用 4.打印流 4.1 自定义打印流 4.2 系统提供的打印流 4.3 格式化输出 5.System对I/O的支持 6.两种输 ...

  5. java stream 内存占用_使用Stream

    Java从8开始,不但引入了Lambda表达式,还引入了一个全新的流式API:Stream API.它位于java.util.stream包中. 划重点:这个Stream不同于java.io的Inpu ...

  6. Java学习总结:46(内存流)

    内存流 在Java中,针对内存操作提供了以下两组类: 字节内存流:ByteArrayInputStream(内存字节输入流).ByteArrayOutputStream(内存字节输出流): 字符内存流 ...

  7. Java内存模型(Java Memory Model,JMM)

    导读 本文通过对JSR133规范的解读,详细的介绍JMM的核心理论,并将开发中常用的关键字的实现原来做了详细的介绍.通过本文读者可以了解到并发的一些基本理论,并对一些同步原语有了更深层次的理解.希望读 ...

  8. Java核心类库-IO-字节数组流/内存流

    内存流(数组流): 把数据先临时存在数组中,待会再从数组中获取出来. 1. 字节内存流:ByteArrayInputStream/ByteArrayOutputStream 2. 字符内存流:Char ...

  9. Java 8 - Stream流骚操作解读2_归约操作

    文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...

最新文章

  1. Kotlin 数组的使用
  2. spring的jar各包作用
  3. html body onunload,html页面的onunload、onbeforeunload
  4. RuntimeException: Package manager has died
  5. 02-Unity深入浅出(二)
  6. Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 #原因...
  7. JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码)
  8. AUTOSAR从入门到精通100讲(六)-AUTOSAR中的PostBuild Data Set Generation Phase
  9. 邓总的vim配置,需要的自己拿走~
  10. linux 大数字 进制转换,Linux下用bc快速进行数字进制转换
  11. latex中空一整行,新的一行顶格写
  12. Web前端初学者,需用了解的7大HTML知识点
  13. 开源知识管理系统_Zboot权限后台管理系统开源啦
  14. 高德地图---行政区划分
  15. 解题报告:HDU_4093 Xavier is Learning to Count FFT
  16. 人工智能的十大应用方向是哪些?
  17. 终于搞清楚了:happen-before原则是干什么的
  18. QQ跳转浏览器php代码,QQ微信域名预防封禁强制跳转至浏览器打开PHP源代码下载...
  19. java-php-python-ssm基于移动端的选课系统的设计与实现服务器端计算机毕业设计
  20. HTML 信息隐藏与提取

热门文章

  1. python 自动发微博 (微博H5接口)
  2. 55 个 Linux 练手项目合集,打通你的 Linux 任督二脉 !
  3. 织梦 帝国 php,PHPCMS、织梦DEDECMS、帝国CMS的抉择与比较
  4. 泥巴与互联网里长大的小孩
  5. 代理服务器介绍及种类划分
  6. echarts 清除上一次的实例
  7. 图像处理中 光场(Light Field)简介及理解
  8. python二维散点图绘画详解
  9. tcpdump的使用方法
  10. 关于Ember的一些小技巧总结