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

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

1) 数据流:
    一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
  2) 输入流(Input  Stream):
      程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
     3) 输出流:
    程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。
采用数据流的目的就是使得输出输入独立于设备。
 
1.输入流代码
import java.io.IOException;
import java.io.InputStream; //字节数组输入流
public class MyByteInputStream extends InputStream { private byte[] buf;// 存放数据流的数组 private int bufLength;// 记录buf数组长度 private int pos;// 已经存放数据的下标位置 private int readPos = 0;// 记录当前数据流读取到的位置 public MyByteInputStream(int i) {
buf = new byte[32]; bufLength = 32;
pos = 0;
} // 构建输入流(直接存入待输入的流数据)
public MyByteInputStream(byte[] b) { if (b != null && b.length > 0) {
int copyLength = b.length;
buf = new byte[copyLength]; System.arraycopy(b, 0, buf, 0, copyLength);// 复制数组内容 bufLength = copyLength;
pos = copyLength;
} else {
buf = new byte[32]; bufLength = 32;
pos = 0;
}
} /*
* 若有数据则返回对应buf[readPos],否则返回-1
*/
public int read() throws IOException {
if (pos > 0 && readPos <= (pos - 1)) {
readPos = readPos + 1; return buf[readPos - 1];
} return -1;
} }

2.输出流代码

import java.io.OutputStream;

public class MyByteOutStream extends OutputStream {
private byte[] buf;// 输出流 private int length;// 存放输出流的长度 private int pos;// 写到的位置 public MyByteOutStream() {
buf = new byte[32]; length = 32;
pos = 0;
} public MyByteOutStream(int size) {
if (size > 0) {
buf = new byte[size]; length = size;
pos = 0;
} else {
buf = new byte[32]; length = 32;
pos = 0;
}
} /**
* 将字符b写入到字节流中,若流空间不够则扩展
*
* @param b
*/
public void write(int b) {
if (pos < length) {
buf[pos] = (byte) b;
pos = pos + 1;
} else {
// TODO:扩展字节流buf[]大小
}
} /**
* 将输出流copy
*
* @return
*/
public byte[] toByteArray() {
if (pos > 0) {
byte[] b = new byte[pos]; System.arraycopy(buf, 0, b, 0, pos); return b;
} return null;
}
}

3.测试类

import java.io.IOException;

public class MyTest {

    public static void main(String[] args) {
String inputStr = "Test input stream!";
String outStr = "Test out strem!"; // 自定义输入流
MyByteInputStream myByteInputStream = new MyByteInputStream(inputStr.getBytes()); try {
for (int i; (i = myByteInputStream.read()) != -1;) {
System.out.print(Character.toString((char) i));
}
} catch (IOException e) {
e.printStackTrace();
} System.out.println(""); // 自定义输出流
MyByteOutStream myByteOutStream = new MyByteOutStream(100); byte[] b = outStr.getBytes(); for (int i = 0; i < b.length; i++) {
myByteOutStream.write(b[i]);
} byte[] outb = myByteOutStream.toByteArray();
for (int i = 0; i < outb.length; i++) {
System.out.print(Character.toString((char) outb[i]));
}
System.out.println("");
} }

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. 【JAVASCRIPT】React + Redux

    摘要 Redux 数据流图 View 层由React 控制, 根据state 变化 刷新渲染组件,作用是根据更新的数据重新渲染组件 Stroe 层其实就是state存储器,作用是更新数据 Dispat ...

  2. 初学Python(五)——元组

    初学Python(五)——元组 初学Python,主要整理一些学习到的知识点,这次是元组. #-*- coding:utf-8 -*- #定义元素 t = (1,2,3) #添加元素 #删除元素 #更 ...

  3. 利用AD采集获取外部温度传感器的值

    #include "led.h" #include "delay.h" #include "key.h" #include "sy ...

  4. /etc/shadow,/etc/passwd,/etc/shadow,/etc/passwd文件的内容解释

    1.1 /etc/passwd文件内容格式           该目录存储的是操作系统用户信息,该文件为所有用户可见 用户名: 密码 : uid  : gid :用户描述:主目录:登陆shell 举个 ...

  5. Mapreduce——视频播放数据分类统计

    很多视频网站都有电视剧热度排名,一般是依据用户在自己站的行为数据所体现出的受欢迎程度来排名.这里有一份来自优酷.爱奇艺.搜索视频等五大视频网站的一份视频播放数据,我们利用这份数据做些有意义的事情. 金 ...

  6. 9. Palindrome Number 回文 my second leetcode 20170807

    Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. S ...

  7. 强密码和弱密码并没有什么区别?NIST密码安全标准更新:不再建议密码要求混合大写字母、字符和数字

    作为一名认真负责的小编,每次注册账号设置密码的时候都是最痛苦的,太简单的怕被破解,太难的又记不住. 等你好不容易记住密码,三个月后IT同学过来拍拍你的肩膀,"你的密码到期了,记得改啊--&q ...

  8. animate.css的使用

    前面的话 animate.css是一个使用CSS3的animation制作的动画效果的CSS集合,里面预设了很多种常用的动画,且使用非常简单.本文将详细介绍animate.css的使用 引入 anim ...

  9. MATLAB实现聚类

    %% Cluster x = data; % 传入数据 [h, w] = size(x); num_cluster = 12; % 聚类数 T = clusterdata(x, num_cluster ...

  10. 关于浏览器解析html全过程详解

    本人web前端菜鸟一枚,第一次在这里发博客梳理知识,知识都是从各地方查阅引用以及自己的理解得来,有什么错误的地方欢迎指正. DOM文档通常加载的步骤: 1.解析HTML结构. 2.加载外部脚本和样式表 ...