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

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

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. Mybatis Dynamic Query 简单筛选

    在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...

  2. 【JAVASCRIPT】React学习- 杂七杂八

    摘要 记录 React 学习中的小细节 setState setState 有一定的时间延迟,如果需要保证 setState 之后执行某些动作,可以采用以下方法 this.setState({ vis ...

  3. JS浏览器对象:window对象、History、Location对象、Screen对象

    一.JS浏览器对象-window 1.window对象 window对象是BOM的核心,window对象指当前的浏览器窗口 所有JavaScript全局对象.函数以及变量均自动成为window对象的成 ...

  4. jsp 之 解决 Mysql net start mysql启动,提示发生系统错误 5 拒绝访问的问题

    在dos下运行net start mysql时 !!!提示发生系统错误 5:拒绝访问!只要切换到管理员模式就可以启动了. 所以我们要以管理员身份来运行cmd程序来启动mysql. 1.在开始菜单的搜索 ...

  5. Hibernate批量操作(一)

    在项目的开发过程之中,我们常会遇到数据的批量处理问题.在持久层采用Hibernate框架时,在进行批量操作时,需要考虑Hibernate实现机制带来的一些问题. 我们知道在每个Hibernate Se ...

  6. jquery.flexslider.js带左右箭头且带按钮可滚动的图片插件

    一.插件介绍 FlexSlider是一个非常出色的jQuery滑动切换插件,它支持所有主流浏览器,并有淡入淡出效果.FlexSlider对于网站开发者来说是一个不错测JQUERY特效,因为支持全浏览器 ...

  7. 【NO.9】jmeter - 一个完整的接口测试的脚本

    使用Jmeter对一个接口地址或者一个页面地址执行N次请求,下面来说说怎么建立一个测试脚本(也称为”测试计划”). 1.    运行Jmeter.bat 双击"Jmeter.bat"文件,稍等片刻后J ...

  8. .Net大局观(2).NET Core 2.0 特性介绍和使用指南

    .NET Core 2.0发布日期:2017年8月14日 前言 这一篇会比较长,系统地介绍了.NET Core 2.0及生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路径.提纲来用. ...

  9. k-means算法概述

    算法过程: 随机选取K个种子点 求所有点到种子点的距离,将点纳入距离最近的种子点群 所有点均被纳入群内后,将种子点移动到种子群中心 重复上述2.3过程,直至种子点没有移动 优缺点: 优点:容易实现 缺 ...

  10. python超简单的web服务器

    今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py   1 2 3 #!/usr/bin/python import Simp ...