一、字节数组流

  字节数组流类能够操作内存中的字节数组,它的数据是一个字节数组。字节数组流类本身适配器设计模式,它把字节数组类型转为流类型使得程序能够对字节数组进行读写操作。

1.ByteArrayInputStream类

  ByteArrayInputStream类从内存中的字节数组读入数据,它的数据是一个字节数组。ByteArrayInputStream流类本身适配器设计模式,它把字节数组类型转换为输入流类型使得程序能够对字节数组进行读操作。

下面是示例代码:

public class ByteArrayInputStreamDemo {

    public static void main(String args[]) throws IOException{

        readByteArrayStream();
} /***
* ByteArrayInputStream读取字节数组的方法
* @throws IOException
*/
public static void readByteArrayStream() throws IOException{ String str="zhisytoitheima";
byte[] strBuf=str.getBytes();
ByteArrayInputStream baiS=new ByteArrayInputStream(strBuf);
int data=baiS.read();
while(data!=-1){
char upper=Character.toUpperCase((char)data);
System.out.print(upper+" ");
data=baiS.read();
}
baiS.close();
}
  }

运行结果如下:

2.ByteArrayOutputStream类

  ByteArrayOutputStream类向内存中的字节数组写入数据,它的数据是一个字节数组。ByteArrayOutputStream流类本身适配器设计模式,它把字节数组类型转换为输出流类型使得程序能够对字节数组进行写操作。

  ByteArrayOutputStream类的构造方法如下:

ByteArrayOutputStream():创建一个新的字节数组输出流,缓冲区的初始是32个字节,如有必要可增加大小。

ByteArrayOutputStream(int size):创建一个新的字节数组输出流,它具有指定大小的缓冲区容量,容量以字节为单位。

代码示例:

 /**
* 把字符串转换为字节数组再写到字节数组输出流中
* @author 支胜勇
*
*/
public class ByteArrayOutputStreamDemo { public static void main(String args[]) throws IOException{ writeByteArrayStream();
} /***
* ByteArrayInputStream读取字节数组的方法
* @throws IOException
*/
public static void writeByteArrayStream() throws IOException{ String str="zhisytoitheimatestByteArrayInputStream";
byte[] strBuf=str.getBytes();
ByteArrayOutputStream baoS=new ByteArrayOutputStream(512); baoS.write(strBuf);//将指定的字节数组中的字节写入baoS字节数组输出流中
System.out.println(baoS.toString().toUpperCase());//通过解码字节将缓冲区内容转换为字符串输出 //创建一个行新分配的字节数组,并将字节数组输出流中的内容复制到该数组中
byte[] newStrBuf=baoS.toByteArray();
for(int i=0;i<newStrBuf.length;i++){
System.out.print((char)newStrBuf[i]);
} }
  }

二、管道流

  一个PipedInputStream对象必须和一个PipedOutputStream对象进行连接从而产生一个通信管道。PipedOutputStream可以向管道中写入数据,通常一个线程向管道输出流写入数据,另一个线程从管道输入流中读取数据,PipedInputStream可以从管道中读取PipedOutputStream写入的数据。这两个类主要用来完成线程之间的通信。当线程A执行管道输入流的read()方法时,如果暂时还没有数据,则这个线程就会被阻塞,只有当线程B向管道输出流谢了新的数据后,线程A才会被回复运行。

示例代码:

   /**
* 向管道输输出流写入数据的线程
*/
class MyWriter extends Thread{ private PipedOutputStream out=new PipedOutputStream();
private String content=""; public MyWriter(String content){ this.content=content;
} public PipedOutputStream getOut() {
return out;
} @Override
public void run() {
// TODO Auto-generated method stub
super.run();
try{
System.out.println("--------我开始向管道写入数据------");
out.write(content.getBytes());
out.close();
System.out.println("--------向管道写入数据结束------");
}catch(Exception e){ throw new RuntimeException(e);
}
} } /***
* 向管道输入流中读取数据
*/
public class PipedStreamDemo extends Thread{ private PipedInputStream in; public PipedStreamDemo(MyWriter out) throws IOException{ this.in=new PipedInputStream();
in.connect(out.getOut());//连接管道输出流和管道输入流
} @Override
public void run() {
// TODO Auto-generated method stub
super.run(); try{
byte[] buf=new byte[1024];
int len=0;
String readStr="";
System.out.println("-------我在等待向管道写入数据!--------");
while((len=in.read(buf))!=-1){ readStr+=new String(buf,0,len);
}
System.out.println(readStr);
in.close();
System.out.println("-------我从管道读取数据结束!--------");
}catch(Exception e){ throw new RuntimeException(e);
}
} public static void main(String args[]) throws IOException{ MyWriter myW=new MyWriter("我很想到黑马去!"); PipedStreamDemo myR=new PipedStreamDemo(myW);
myW.start();
myR.start();
}    }

三、随机访问文件类

  在Java中,RandomAccessFile类的一个对象提供了对随机读/写文件的支持,它没有继承InputStream和OutputStream,而是直接继承了Object,并且实现了接口DataInput和DataOutput。在生成一个RandomAccessFile对象时,除了要指明文件对象或文件名外,还需要指明读/写模式。例如下面的语句:

RandomAccessFile raf=new RandomAccessFile(“E:\\yy.dat”,”r”);表示对文件E:\\yy.dat进行随机读操作

RandomAccessFile raf=new RandomAccessFile(“E:\\yy1.dat”,”rw”);表示对文件E:\\yy1.dat进行随机读/写操作

  可讲Java随机读/写的字节文件看成是一个很大的字节数组,随机读/写操作可看成是对这个“虚拟的字节数组”进行的,这个“数组”的下标就是所谓的文件指针,因此随机读/写文件的首要操作就是移动文件的指针,其操作有以下三个:

long getFilePointer():当前文件的指针位置。

void seek(long pos):移动文件指针到指定的位置,从0开始计算位置。

int skipBytes(int n):将文件指针向文件末尾移动指定的n个字节,返回实际移动的字节数,若n<0则不发生移动。

示例代码:

 /**
* 向e:\\yy.txt文件写入10个double型的实数,然后运用RandomAccessFile随机修改其中的数据
* @author 支胜勇
*
*/
public class RandomRWDemo { public static void main(String[] args) throws IOException{ randomWrite("E:\\yy.dat"); randomModify("E:\\yy.dat");
} /***
* 向文件写入数据
* @param fileName
* @throws IOException
*/
public static void randomWrite(String fileName) throws IOException{ File file=new File(fileName);
if(!file.exists()){ file.createNewFile();
} if(!file.isFile()){//如果不是文件则返回 System.out.print("不是文件");
return;
} RandomAccessFile aWFile=new RandomAccessFile(file,"rw");
int i=1;
while(i<=10){
aWFile.writeDouble(i);//写入doubl值
System.out.print(" "+(double)i);
i++;
}
aWFile.close();
} public static void randomModify(String fileName) throws IOException{ final int DOUBLE_SIZE=8;//double类型占8个字节
File file=new File(fileName);
if(!file.exists()){
System.out.println("要修改的文件不存在");
return;
} if(!file.isFile()){
System.out.println("不是文件");
return;
} RandomAccessFile aMFile=new RandomAccessFile(file,"rw"); aMFile.seek(2*DOUBLE_SIZE);//修改第2个double值
aMFile.writeDouble(100); aMFile.seek(7*DOUBLE_SIZE);//修改第7个double值
aMFile.writeDouble(200); aMFile.close(); //查看是否已修改 RandomAccessFile aRFile=new RandomAccessFile(file,"r");
System.out.println();
for(int i=0;i<10;i++){
System.out.print(" "+aRFile.readDouble());
}
aRFile.close();
}   }

运行结果:

JAVA输入/输出系统中的其他流学习笔记的更多相关文章

  1. Java 输入/输出——处理流(RandomAccessFile)

    RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据.与普通的输入/输出流不同的是,Ra ...

  2. Java 输入/输出 反射

    Java  输入/输出   反射 输入输出和反射 一.数据流的基本概念 流一般分为 ( Input Stream ) 和输出流 ( Output Stream ) 两类,但这种划分并不是绝对的.比如一 ...

  3. Java输入/输出教程

    Java输入/输出(I/O)处理从源读取数据并将数据写入目标.通常,读取存储在文件中的数据或使用I/O将数据写入到文件中. java.io和java.nio包中包含处理输入/输出的Java类.java ...

  4. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  5. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  6. 浏览器中js执行机制学习笔记

    浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...

  7. Java 输入/输出——处理流(BufferedStream、PrintStream、转换流、推回输入流)

    关于使用处理流的优势,归纳起来就是两点:(1)对于开发人员来说,使用处理流进行输入/输出操作更简单:(2)使用处理流执行效率更高. 1.BufferedInputStream/BufferedOutp ...

  8. 输入/输出系统的四种不同工作方式对CPU利用率比较

    程序控制工作方式:输入/输出完全由CPU控制,整个I/O过程中CPU必须等待其完成,因此对CPU的能力限制很大,利用率较低 程序中断工作方式:CPU不再定期查询I/O系统状态,而是当需要I/O处理时再 ...

  9. java - 输入的字符串中是否包含中文

    今天和同事在讨论一个问题,需要检查“输入的字符串中是否包含中文”,刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英 ...

随机推荐

  1. nginx缓存优先级(缓存问题者必看)

    接触nginx的兄弟或多或少都有遇到缓存问题,要么是nginx为什么不缓存,要么就是nginx缓存很快就失效等等问题,在网上找了一遍nginx缓存优先级的文章,大家可以参考下. 架构图client端  ...

  2. 详解Oracle创建用户权限全过程

    本文将介绍的是通过创建一张表,进而实现Oracle创建用户权限的过程.以下这些代码主要也就是为实现Oracle创建用户权限而编写,希望能对大家有所帮助. 注意:每条语语分开执行,结尾必须用分号; // ...

  3. 教你50招提升ASP.NET性能(二十三):StringBuilder不适用于所有字符串连接的场景;String.Join可能是

    (41)StringBuilder is NOT the answer for all string concatenation scenarios; String.Join could be 招数4 ...

  4. contiki-main.c 中的process系列函数学习笔记 <contiki学习笔记之六>

    说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ---------------------------------------------- ...

  5. java中需要关注的3大方面内容/Java中创建对象的几种方法:

    1)垃圾回收 2)内存管理 3)性能优化 Java中创建对象的几种方法: 1)使用new关键字,创建相应的对象 2)通过Class下面的new Instance创建相应的对象 3)使用I/O流读取相应 ...

  6. SqlServer教程:经典SQL语句集锦

    SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRAN ...

  7. Codeforces Gym 100733J Summer Wars 线段树,区间更新,区间求最大值,离散化,区间求并

    Summer WarsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

  8. cocos2d-x 3.0环境搭建

    原文来自于:http://blog.csdn.net/linzhengqun/article/details/21663341 安装工具 1. 配置JDK JDK下载地址:http://www.ora ...

  9. C++ CheckMenuItem

    菜单单选 关键点 CMenu::GetMenuState UINT GetMenuState( UINT nID, UINT nFlags ) const; MF_CHECKED MF_DISABLE ...

  10. springMVC2 1入门程序

    1入门程序 .1需求 实现商品列表查询 .2需要的jar包 使用spring3.2.0(带springwebmvc模块) .1前端控制器 在web.xml中配置: <?xml version=& ...