JAVA输入/输出系统中的其他流学习笔记
一、字节数组流
字节数组流类能够操作内存中的字节数组,它的数据是一个字节数组。字节数组流类本身适配器设计模式,它把字节数组类型转为流类型使得程序能够对字节数组进行读写操作。
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输入/输出系统中的其他流学习笔记的更多相关文章
- Java 输入/输出——处理流(RandomAccessFile)
RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据.与普通的输入/输出流不同的是,Ra ...
- Java 输入/输出 反射
Java 输入/输出 反射 输入输出和反射 一.数据流的基本概念 流一般分为 ( Input Stream ) 和输出流 ( Output Stream ) 两类,但这种划分并不是绝对的.比如一 ...
- Java输入/输出教程
Java输入/输出(I/O)处理从源读取数据并将数据写入目标.通常,读取存储在文件中的数据或使用I/O将数据写入到文件中. java.io和java.nio包中包含处理输入/输出的Java类.java ...
- JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...
- 浏览器中js执行机制学习笔记
浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...
- Java 输入/输出——处理流(BufferedStream、PrintStream、转换流、推回输入流)
关于使用处理流的优势,归纳起来就是两点:(1)对于开发人员来说,使用处理流进行输入/输出操作更简单:(2)使用处理流执行效率更高. 1.BufferedInputStream/BufferedOutp ...
- 输入/输出系统的四种不同工作方式对CPU利用率比较
程序控制工作方式:输入/输出完全由CPU控制,整个I/O过程中CPU必须等待其完成,因此对CPU的能力限制很大,利用率较低 程序中断工作方式:CPU不再定期查询I/O系统状态,而是当需要I/O处理时再 ...
- java - 输入的字符串中是否包含中文
今天和同事在讨论一个问题,需要检查“输入的字符串中是否包含中文”,刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英 ...
随机推荐
- POJ 1979 dfs和bfs两种解法
fengyun@fengyun-server:~/learn/acm/poj$ cat 1979.cpp #include<cstdio> #include<iostream&g ...
- Codeforces Gym 100513G G. FacePalm Accounting 暴力
G. FacePalm Accounting Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513 ...
- 【智能家居篇】wifi在智能家居中的应用
转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 在设计智能家居系统方案时,一个很关键的point就是组网方式.组网方式关系到整个智能家居系统的稳定性.可扩展性.实时 ...
- javascript操作
1. >> 按位右移运算符 result = expression1 >> expression2 右移表达式的位,保持符号不变. >> 运算符将 expressi ...
- MYSQL-- binlog事件详解
mysqlbinlog -vvv log.000001 # at # :: server id end_log_pos CRC32 sequence_number= SET @@SESSION.GTI ...
- win7家庭版任务栏预览消失,只显文字终极解决法
出现问题:win7家庭基础版,任务栏的预览窗口没有了,只有文字: Likethis: 工具/原料 services.msc 方法/步骤 网上的解决办法都试了,不管用,先把网上的方法列举出来如下 ...
- Android 高级UI设计笔记09:Android如何实现无限滚动列表
ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...
- js页面刷新的几种方法
Javascript刷新页面的几种方法: 1 history.go(0) 2 location.reload() 3 location=location 4 location.assign(locat ...
- 记第一次web前端校招笔试
是的,我今晚跑到隔壁学校参加某电商公司的宣讲会+现场笔试.只有俩字可以形容:苦笑! 在寝室复习了下以前学习的关于前端方面的知识,重点是JavaScript,javaweb开发技术(jsp+servle ...
- 完全自定义 TabBar
// // CustomTabBarController.h // Dream // // Created by mac on 14-10-17. // Copyright (c) 2014年 HM. ...