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]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英 ...
随机推荐
- 基于 Paramiko 的 SSH 通讯类
# -*- coding: UTF-8 -*-import paramikoimport time################################################### ...
- Android中图表AChartEngine学习使用与例子
很多时候项目中我们需要对一些统计数据进行绘制表格,更多直观查看报表分析结果.基本有以下几种方法: 1:可以进行android api进行draw这样的话,效率比较低 2:使用开源绘表引擎,这样效率比 ...
- zookeeper 系列
ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务 ...
- ASP.NET MVC 验证
- 【原创】测试不同浏览器播放canvas动画的平滑程度
Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基 ...
- javascript面向对象学习笔记——创建对象(转)
工厂模式 该模值抽象了创建具体对象de过程.用函数来封装噫特定接口创建对象的细节. function createPerson(name,age,job){ var o=new Object(); o ...
- PHP对大文件的处理思路
需求: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容. 在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函 ...
- poj1753解题报告(枚举、组合数)
POJ 1753,题目链接http://poj.org/problem?id=1753 题意: 有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白-> ...
- Java(Android)编程思想笔记01:多态性的理解
1. 多态的定义: 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. (发送消息就是函数调用) 2. 多态的理解 多态是面向对象的重要特性,简 ...
- Python mongoDB 的简单操作
#!/usr/bin/env python # coding:utf-8 # Filename:mongodb.py from pymongo import MongoClient,ASCENDING ...