Stream,Reader/Writer,Buffered的区别(1)
Stream: 是字节流形式,exe文件,图片,视频等。支持8位的字符,用于 ASCII 字符和二进制数据。
Reader/Writer: 是字符流,文本文件,XML,txt等,用于16位字符,也就是Unicode。
Buffered:放到缓存区里为了读写提高效率,为read提供了高效的方法。InputStream的read会出现堵塞。
InputStream:
InputStream的子类:
1.ByteArrayInputStream
:
就是因为
InputStream 是不能被缓存,然后重复读取的。所以把字节流数组保存起来。为后期使用。
开发文档中的介绍:
ByteArrayInputStream
包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
内部计数器跟踪 read
方法要提供的下一个字节。关闭 ByteArrayInputStream 无效。
此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
构造方法摘要 |
ByteArrayInputStream(byte[] buf) 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。 |
ByteArrayInputStream(byte[] buf, int offset, int length) 创建 ByteArrayInputStream,使用 buf 作为其缓冲区数组。 |
用途:
InputStream 是不能被缓存,然后重复读取的。
程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。
在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。
2.FileInputStream
:
以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
FileInputStream用于读取二进制数据,FileReader用来读取字符数据。
开发文档中的介绍:
从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。
FileInputStream
用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader
。
构造方法摘要 |
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 |
FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。 |
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。 |
用途:
把图片通过FileInputStream读进来保存到数据库中(保存到数据库中的形式为{f4f472d476f6f67})然后再读取出来后把图片显示到屏幕上。
实例:
import java.io.*;
public class FileStreamDemo {
public static void main(String[] args) throws IOException {
//创建两个文件,face.gif是已经存在文件,newFace.gif是新创建的文件
File inFile = new File("face.gif");
File outFile = new File("newFace.gif");
//创建流文件(图片的二进制数据)读入与写出类
FileInputStream inStream = new FileInputStream(inFile);
FileOutputStream outStream = new FileOutputStream(outFile);
//通过available方法取得流的最大字符数
byte[] inOutb = new byte[inStream.available()];
inStream.read(inOutb); //读入流,保存在byte数组
outStream.write(inOutb); //写出流,保存在文件newFace.gif中
inStream.close();
outStream.close();
}
}
3.BufferedInputStream
:
与ByteArrayInputStream
比构造函数不同,
并且可以根据指定的size来初始化对应大小的内部数组。指定缓冲区大小这是非常明显的优势。用途一样。用于稍大点的字节流文件。
开发文档中的介绍:
BufferedInputStream
为另一个输入流添加一些功能,即缓冲输入以及支持 mark
和 reset
方法的能力。
在创建 BufferedInputStream
时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
mark
操作记录输入流中的某个点,reset
操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark
操作后读取的所有字节。
构造方法摘要 |
BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。 |
BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。 |
用途:
用途与ByteArrayInputStream一样。用于稍大点的字节流文件。
4.DataInputStream:
以不同格式读入。也就是可以识别不同数据类型的数据流。
即:
readDouble();
readBoolean();
readInt();
形式去读取。
开发文档中的介绍:
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
构造方法摘要 |
DataInputStream(InputStream in) 使用指定的底层 InputStream 创建一个 DataInputStream。 |
用途:
以下形式去读取时会用到
...
{
...
//将数据写入某个载体
DataOutputStream out = new DataOutputStream(new FileOutputStream("order.txt"));
//价格
double prices[]={10.10,10.20,8.30};
//数目
int[] num={10,20,5};
//描述
String desc[]={"帽子","皮带","眼镜"};
//写入数据
for(int i=0;i<prices.length;i++){
out.writeDouble(prices[i]);
out.writeChar('\t');
out.writeInt(num[i]);
out.writeChar('\t');
out.writeChars(desc[i]);
out.writeChar('\n');
}
...
5.PipedInputStream:
号称管道流,是不同线程之间传输数据,可在缓冲区限定的范围内将读操作和写操作分离开。
开发文档中的介绍:
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
通常,数据由某个线程从 PipedInputStream
对象读取,并由其他线程将其写入到相应的 PipedOutputStream
。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。
管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。 如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。
构造方法摘要 |
PipedInputStream() 创建尚未连接的 PipedInputStream。 |
PipedInputStream(int pipeSize) 创建一个尚未连接的 PipedInputStream,并对管道缓冲区使用指定的管道大小。 |
PipedInputStream(PipedOutputStream src) 创建 PipedInputStream,使其连接到管道输出流 src。 |
PipedInputStream(PipedOutputStream src, int pipeSize) 创建一个 PipedInputStream,使其连接到管道输出流 src,并对管道缓冲区使用指定的管道大小。 |
用途:
管道流主要用来线程间的通信,一个线程的PipedInputStream对象要从另外一个线程的PipedOutputStream对象读取数据。要使管道有用,必须同时构建管道输入流和管道输出流。
实例:
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
class PipedStreamTest{
public static void main(String[] args){
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(); try{
pos.connect(pis);
new Producer(pos).start();
new Consumer(pis).start();
}catch(Exception e){
e.getStackTrace();
}
}
}
class Producer extends Thread{
private PipedOutputStream pos;
Producer(PipedOutputStream pos){
this.pos = pos;
}
public void run(){
try{
pos.write("hello,world!".getBytes());
pos.close();
}catch(Exception e){
e.getStackTrace();
}
}
}
class Consumer extends Thread{
private PipedInputStream pis;
Consumer(PipedInputStream pis){
this.pis = pis;
}
public void run(){
try{
byte[] buffer = new byte[100];
int len = pis.read(buffer);
System.out.println(new String(buffer,0,len));
pis.close();
}catch(Exception e){
e.getStackTrace();
}
}
}
6.StringBufferInputStream:
这个类已经过时了不要用这个了用ByteArrayInputStream
。
OutputStream
:
OutputStream
的子类:
这里的outputStrem与之前的inputStrem是对应的。
唯一区别就是inputSream是有关读出操作,ouputStream是有关写入操作。
参照inputStream了解就行了。
下一节继续讲有关Reader/Writer:
Stream,Reader/Writer,Buffered的区别(1)的更多相关文章
- Stream,Reader/Writer,Buffered的区别(2)
Reader: Reader的子类: 1.BufferedReader: FileReader 没有提供读取文本行的功能,BufferedReader能够指定缓冲区大小,包装了read方法高效读取字符 ...
- RFID 读写器 Reader Writer Cloner
RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...
- RFIDler - An open source Software Defined RFID Reader/Writer/Emulator
https://www.kickstarter.com/projects/1708444109/rfidler-a-software-defined-rfid-reader-writer-emul h ...
- RubyMine生成reader/writer方法
RubyMine生成reader/writer方法 在非类的ruby文件中,Alt+Insert会出现新建文件的选项: 在ruby文件的类中,Alt+Insert会出现get/set方法生成提示和重构 ...
- 系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类
目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取 ...
- multithreading - Reader/Writer Locks in C++
You Only Need To Note This: only 1 single thread can acquire an upgrade_lock at one time. others are ...
- ExtJS4.2学习(7)——基础知识之Reader&Writer篇
Reader: 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,将解析好的数据保存到Modle中. 结构图 Ext.data.reader.Reader 读取器的根类(很少直接实例化这个 ...
- 02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri
模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStre ...
- Python CSV Reader/Writer 例子--转载
CSV(comma-separated values) 是跨多种形式导入导出数据的标准格式,比如 MySQL.Excel. 它以纯文本存储数和文本.文件的每一行就代表一条数据,每条记录包含了由逗号分隔 ...
随机推荐
- 使用AS3.0代码实现给图片添加滤镜的模糊与斜角效果
滤镜可应用于任何显示对象(即,从 DisplayObject 类继承的对象), 例如 MovieClip.SimpleButton.TextField 和 Video 对象,以及 BitmapData ...
- eclipse 拨打电话、拨号,发短信
1.拨打电话,拨号 //拨打电话Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(U ...
- 慕课网-安卓工程师初养成-3-6 Java中的逻辑运算符
来源: http://www.imooc.com/code/1301 逻辑运算符主要用于进行逻辑运算.Java 中常用的逻辑运算符如下表所示: 我们可以从“投票选举”的角度理解逻辑运算符: 1. 与: ...
- 百度地图API的使用方法
百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html> 2. <head& ...
- JavaScript创建表格的两种方式
方式一: var data = [ { id: 1, name: "first", age: 12 }, { id: 2, name: "second", ag ...
- windows网络编程-2015.12.29
在windows环境下,使用netstat命令查看网络状态,具体命令如下所示: netstat -ano | findstr listenport 在windows环境下,创建udp程序接收端,具体代 ...
- 【MySQL】Event事件与游标
MySQL的事件就像Linux系统上的定时任务,按照设置的时间或者间隔时间执行设置好的任务. 如果用SQLyog一类的写存储过程.触发器或者事件会省事一些,例如SQLyog就会生成一个大致的模板: D ...
- Qt中QObject中的parent参数
今天写了一个小程序,验证了带参的构造函数中参数parent的作用. 在MainWindow中声明一个QDialog类型的指针,在MainWindow中对它进行初始化.我采用了两种初始化方式,一种是带参 ...
- 五、用户数据报传输(UDP)
1.UDP常用的发送和接收函数 int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,i ...
- 【linux】 静态库编译
文件如下: root@ubuntu:/home/test# ll total drwxr-xr-x root root Sep : ./ drwxr-xr-x root root Sep : ../ ...