一、字节数组流

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

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. VB.NET中使用Linq TO SQL添加数据后获得自增长列ID

    VB.NET中使用Linq TO SQL添加数据后获得自增长列ID: Dim tempOrdre As New Order With { .CustomerID = cmbCustomerName.S ...

  2. MEF 编程指南(十):重组

    有些应用程序被设计成在运行时动态地改变.例如,一个新的扩展可能被下载,或者其他原因变得不可用.MEF 依靠我们称之为重组(Composition)的技术处理,在初始化组合以后改变导入值的场景.   导 ...

  3. Linux单词表

     su:Swith user  切换用户,切换到root用户cat: Concatenate  串联uname: Unix name  系统名称df: Disk free  空余硬盘du: Disk  ...

  4. Swift学习笔记三

    协议和扩展 在Objective-C中,协议是很常见也非常重要的一个特性,Swift中也保留了协议,语法略有变化. 用protocol关键字声明一个协议: protocol ExampleProtoc ...

  5. [Javascript] Other functor

    EventStream: You can use RxJS, BaconJS or any reactive programming lib you want: var id_s = map(func ...

  6. iOS开发——UI_swift篇&UItableView实现移动单元格

    UItableView实现移动单元格   1,下面的样例是给表格UITableView添加单元格移动功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,可以看到单元格后面出现 ...

  7. MHA自动Failover过程解析(updated) 转

    允许转载, 转载时请以超链接形式标明文章原始出处和网站信息 http://www.mysqlsystems.com/2012/03/figure-out-process-of-autofailover ...

  8. PowerDesigner自定义列和过滤器

    好多次要增加注释列,默认值列都忘了怎么设置,写下来以备后用:) 选中表,然后右键,选择properties->columns->点击下图中那个不显眼的小图标(Customize Colum ...

  9. Aggregating local features for Image Retrieval

    Josef和Andrew在2003年的ICCV上发表的论文[10]中,将文档检索的方法借鉴到了视频中的对象检测中.他们首先将图像的特征描述类比成单词,并建立了基于SIFT特征的vusual word ...

  10. CentOS中TFTP配置

    转载:http://www.centoscn.com/image-text/config/2013/1105/2062.html TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现 1 ...