数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。

    “流是磁盘或其它外围设备中存储的数据的源点或终点。” 

1) 数据流:
    一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
  2) 输入流(Input  Stream):
      程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
     3) 输出流:
    程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。
采用数据流的目的就是使得输出输入独立于设备。
 
1.输入流代码
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3.  
  4. //字节数组输入流
  5. public class MyByteInputStream extends InputStream {
  6.  
  7. private byte[] buf;// 存放数据流的数组
  8.  
  9. private int bufLength;// 记录buf数组长度
  10.  
  11. private int pos;// 已经存放数据的下标位置
  12.  
  13. private int readPos = 0;// 记录当前数据流读取到的位置
  14.  
  15. public MyByteInputStream(int i) {
  16. buf = new byte[32];
  17.  
  18. bufLength = 32;
  19. pos = 0;
  20. }
  21.  
  22. // 构建输入流(直接存入待输入的流数据)
  23. public MyByteInputStream(byte[] b) {
  24.  
  25. if (b != null && b.length > 0) {
  26. int copyLength = b.length;
  27. buf = new byte[copyLength];
  28.  
  29. System.arraycopy(b, 0, buf, 0, copyLength);// 复制数组内容
  30.  
  31. bufLength = copyLength;
  32. pos = copyLength;
  33. } else {
  34. buf = new byte[32];
  35.  
  36. bufLength = 32;
  37. pos = 0;
  38. }
  39. }
  40.  
  41. /*
  42. * 若有数据则返回对应buf[readPos],否则返回-1
  43. */
  44. public int read() throws IOException {
  45. if (pos > 0 && readPos <= (pos - 1)) {
  46. readPos = readPos + 1;
  47.  
  48. return buf[readPos - 1];
  49. }
  50.  
  51. return -1;
  52. }
  53.  
  54. }

2.输出流代码

  1. import java.io.OutputStream;
  2.  
  3. public class MyByteOutStream extends OutputStream {
  4. private byte[] buf;// 输出流
  5.  
  6. private int length;// 存放输出流的长度
  7.  
  8. private int pos;// 写到的位置
  9.  
  10. public MyByteOutStream() {
  11. buf = new byte[32];
  12.  
  13. length = 32;
  14. pos = 0;
  15. }
  16.  
  17. public MyByteOutStream(int size) {
  18. if (size > 0) {
  19. buf = new byte[size];
  20.  
  21. length = size;
  22. pos = 0;
  23. } else {
  24. buf = new byte[32];
  25.  
  26. length = 32;
  27. pos = 0;
  28. }
  29. }
  30.  
  31. /**
  32. * 将字符b写入到字节流中,若流空间不够则扩展
  33. *
  34. * @param b
  35. */
  36. public void write(int b) {
  37. if (pos < length) {
  38. buf[pos] = (byte) b;
  39. pos = pos + 1;
  40. } else {
  41. // TODO:扩展字节流buf[]大小
  42. }
  43. }
  44.  
  45. /**
  46. * 将输出流copy
  47. *
  48. * @return
  49. */
  50. public byte[] toByteArray() {
  51. if (pos > 0) {
  52. byte[] b = new byte[pos];
  53.  
  54. System.arraycopy(buf, 0, b, 0, pos);
  55.  
  56. return b;
  57. }
  58.  
  59. return null;
  60. }
  61. }

3.测试类

  1. import java.io.IOException;
  2.  
  3. public class MyTest {
  4.  
  5. public static void main(String[] args) {
  6. String inputStr = "Test input stream!";
  7. String outStr = "Test out strem!";
  8.  
  9. // 自定义输入流
  10. MyByteInputStream myByteInputStream = new MyByteInputStream(inputStr.getBytes());
  11.  
  12. try {
  13. for (int i; (i = myByteInputStream.read()) != -1;) {
  14. System.out.print(Character.toString((char) i));
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19.  
  20. System.out.println("");
  21.  
  22. // 自定义输出流
  23. MyByteOutStream myByteOutStream = new MyByteOutStream(100);
  24.  
  25. byte[] b = outStr.getBytes();
  26.  
  27. for (int i = 0; i < b.length; i++) {
  28. myByteOutStream.write(b[i]);
  29. }
  30.  
  31. byte[] outb = myByteOutStream.toByteArray();
  32. for (int i = 0; i < outb.length; i++) {
  33. System.out.print(Character.toString((char) outb[i]));
  34. }
  35. System.out.println("");
  36. }
  37.  
  38. }

ps:欢迎各位吐槽指点~

自己动手写java 字节流输入输出流的更多相关文章

  1. [JVM] - 一份<自己动手写Java虚拟机>的测试版

    go语言下载 配置GOROOT(一般是自动的),配置GOPATH(如果想自己改的话) 参照<自己动手写Java虚拟机> > 第一章 指令集和解释器 生成了ch01.exe文件 这里还 ...

  2. 自己动手写Java大整数《3》除法和十进制转换

    之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...

  3. java:利用java的输入/输出流将一个文件的每一行+行号复制到一个新文件中去

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  4. Java:输入输出流 java.io包的层次结构

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

  5. JAVA基础-输入输出流

    一,File类:文件的创建和删除 1.File(String pathname):pathname是指路径名称.用法 File file = new File("d:/1.txt " ...

  6. Java基础—输入输出流

    流的概念 在Java中,流是从源到目的地的字节的有序序列.Java中有两种基本的流——输入流(InputStream)和输出流(OutputStream). 根据流相对于程序的另一个端点的不同,分为节 ...

  7. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  8. 浅谈Java的输入输出流(转)

    Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象.在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输 ...

  9. java 对象输入输出流

    对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息.              ObjectInputStream   : 对象输入流            ...

随机推荐

  1. JStorm与Storm源码分析(四)--均衡调度器,EvenScheduler

    EvenScheduler同DefaultScheduler一样,同样实现了IScheduler接口, 由下面代码可以看出: (ns backtype.storm.scheduler.EvenSche ...

  2. 关于解决mysql数据库乱码的问题

    最近在开发的过程中频繁的使用到了mysql'这款数据库,mysql的中文乱码问题一直让人头疼.以前遇到过几次,但是都一不小心就解决了,这次终于明白到底是怎么回事了.可能我下面手的这种解决方案只适合于我 ...

  3. 快速搭建MySQL复制集

    快速搭建MySQL复制集 1 环境说明 MySQL版本 5.6 basedir :/u01/my3306 #MySQL软件目录 数据目录 :/u01/mysql/[实例名]/data 日志目录 :/u ...

  4. Hello ReactJS

    前言 React学习前先搭好环境,官网的例子看着比较分散.结合webpack就可以体验完整的es6开发流程了. 源码:https://github.com/Ryan-Miao/hello-react- ...

  5. ubuntu中ssh自启动

    打开/etc/rc.local文件,在exit 0语句前加入: /etc/init.d/ssh start(前提是本身的启动方法是这样的才可以) 或者/usr/local/sbin/sshd(我使用的 ...

  6. 谈谈渲染,玩玩nginx——前后端分离,转发请求到Tomcat的尝试

    一.谈谈"渲染" 相信好多人都挺听过"渲染"这个词,但不清楚它是什么意思?前端开发以为这是后端的活儿,后端开发以为是前端的事儿,推着推着就不了了之.其实渲染很简 ...

  7. Core 2.0 的dll实时更新、https、依赖包变更问题及解决

    今天所有开发环境已经迁移到mac OS下的Visual Studio Code + 命令行编译发布,而运行服务器是CentOS7,和windows没什么关联了. 只要你Relese编译并在本地有一个与 ...

  8. 【NO.14】jmeter-处理结果

    在1台测试机上面处理测试结果并没啥,比较麻烦的是合并2台测试机的测试结果. 首先说说,为什么我们需要使用2台(甚至3台.4台)测试机对服务器发送大量的请求呢?说白了就是测试机配置太弱了,服务器太牛逼. ...

  9. 【NO.3-2】Jmeter - 在Linux配置HOSTS的方法

    在Linux配置HOSTS 咱平时在Windows系统做web测试的时候需要修改HOSTS文件.Linux也一样. /*在Linux执行性能测试的时候,很容易忘记配置HOSTS,那么你发送的请求的响应 ...

  10. VMware Workstation-虚拟机的安装

    虚拟机的优势对于我来说也只是方便测试浏览器的兼容性: (1)避免重启本地物理机(多次安装/卸载不同版本的浏览器,每次需要重启电脑才能生效) (2)在虚拟机内创建不同的操作系统,比如WindowsXP内 ...