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:

时间: 2024-10-11 05:00:11

Stream,Reader/Writer,Buffered的区别(1)的相关文章

Stream,Reader/Writer,Buffered的区别(2)

Reader: Reader的子类: 1.BufferedReader: FileReader 没有提供读取文本行的功能,BufferedReader能够指定缓冲区大小,包装了read方法高效读取字符流.提供字符.数组和行的高效读取. 开发文档中的介绍: 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取.可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求. 因此,建

系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类

目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取字符的行号.行号从 0 开始.每当 LineNumberReader 在包装的 Reader 返回的字符中遇到行终止符时,行号递增. 可以通过调用 getLineNumber() 方法获取当前行号,也可以通过调用 setLineNumber() 方法设置当前行号. 注意设置的行号不会改变实际的文件指

02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri

 模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStream; class MyBufferedInputStream{ private InputStream in; private byte[] buf = new byte[1024*4]; private int pos = 0,count = 0; MyBufferedInputStream(I

RFID Reader Writer Detector Emulator Sniffer

How does RFID tag technology works RFID is so called Radio Frequency Identification system which consists of two main parts: transmitter and receiver. The labels, access cards and even passports in some countries they have RFID transponders integrate

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 very straightforward. 96 vote 1800 INFORMATION is more or less correct, but there are a few issues I wanted to correct. boost::shared_mutex _access;v

IPC 经典问题:Reader &amp; Writer Problem

完整代码实现: #include <stdio.h> #include <unistd.h> #include <time.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define TOTAL_NUMBER 20 void *writer(void *param); void *reader(void *param); int reader_n

信号量解决写者优先&amp;读者优先&amp;公平竞争(reader writer)

先说问题: 这里的rand都是伪随机.解决也很简单,srand即可.内容懒得改了~~ 描述及思路: 代码: 运行结果: 读者优先: 效果图: 公平竞争: 只有读者写者线程做了一些修改.增加的信号量que.sem_init(&que,0,1). 效果: 原文地址:https://www.cnblogs.com/lqerio/p/11117657.html

JAVA 字符流与字节流的区别

Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换.而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换.字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高

Java中的IO流系统详解

Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换.而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换.字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高