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

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

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. 教学小例子:简易的webSevrer

    HttpListener 流利简单的API static void Main() { using (var server = new SimpleWebServer("http://loca ...

  2. 37. leetcode 108. Convert Sorted Array to Binary Search Tree

    108. Convert Sorted Array to Binary Search Tree 思路:利用一个有序数组构建一个平衡二叉排序树.直接递归构建,取中间的元素为根节点,然后分别构建左子树和右 ...

  3. 四、什么是vuex

    一.关于vuex刚开始学习的时候对于里面的很多名词有很陌生.很难接受这个定义,下面这个链接很好很简单通俗的解释了什么是vuex 我喜欢的vuex网址:https://zhuanlan.zhihu.co ...

  4. Hello BlogsPark

    2017年8月4日, 今天是使用博客园的第一天, 签个到. NSLog(@"Hello BlogsPark");

  5. 安徽省2016“京胜杯”程序设计大赛_D_梯田AGAIN

    梯田AGAIN Time Limit: 5000 MS Memory Limit: 65536 KB Total Submissions: 95 Accepted: 21 Description 大家 ...

  6. setTimeout 与 Event Loop 浅析

    先从一个小题目开始: 以下代码的输出结果是? function test1 () { console.log(1) }; setTimeout(test1, 1000); // T1-1setTime ...

  7. Jmeter关联,正则表达式提取器使用

     一.Jmeter关联的方式: Jmeter中关联可以在需要获取数据的请求上 右键-->后置处理器 选择需要的关联方式,如下图有很多种方法可以提取动态变化数据: 二.正则表达式提取器: 1.比如 ...

  8. Aleta病毒

    文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份 ...

  9. 计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和

    题目链接:https://nanti.jisuanke.com/t/16446 题意: 给你一棵有n个节点的树以及每条边的长度,输出树上节点之间的最短距离和.然后进行m次操作,每次操作更改一条边的长度 ...

  10. webdriver

    导入模块: from selenium import webdriver from selenium.common.exceptions import NoSuchElementException 选 ...