张孝祥java视频学习笔记(九)

过滤流与包装类

包装类的概念与作用

包装流类,也叫过滤流类或处理流类,它没有对应到任何具体的流设备,一定要给它传递一个对应具体流设备的输出流对象 (Dateoutputstream)

  程序 -> 包装流类 -> 节点流类 -> 目标

DataOutputStream的构造方法: 

public DataOutputStream(OutputStream out)

DataOutputStream的部分方法: 

    public final void writeBoolean(boolean)     public final void writeShort(int)     

public final void writeChar(int)     public final void writeInt(int)     

public final void writeLong(long)     public final void writeFloat(float)     

public final void writeDouble(double)     public final void writeBytes(String)

 

BufferedInputStreamBufferedOutputStream   

缓冲流为IO流增加了内存缓冲区

允许Java程序一次不只操作1个字节,提高了程序的性能 

    由于有了缓冲区,使得在流上执行skipmarkreset方法都成为可能 

  BufferedInputStreamBufferedOutputStream类是Java提供的两个缓冲区包装类,不管底层系统(直接与目标设备交换数据)是否使用了缓冲区,它们在自己的实例对象中创建缓冲区(调用包装类包装的输出流对象,将缓冲区的数据写入到底层设备或目标设备中;或者调用包装类所包装的输入流对象,从底层设备或目标设备中读取数据到包装类的缓冲区中)

BufferInputstream定义了两种构造函数 

(1)BufferInputStream b= new BufferInputstream(in)

(2)BufferInputStream b=new BufferInputStream(in,size) 

第二个参数表示指定缓冲器的大小。

向指定文件中写入数据: 

view plaincopy to clipboardprint? 

 import java.io.*;   

class StreamTest{   

 public static void main(String[] args)throws Exception{   

 FileOutputStream fos=new FileOutputStream("testBuffer.txt");  

  BufferedOutputStream bos=new BufferedOutputStream(fos);   

 bos.write("Hello BufferedOutputStream!".getBytes());   

     bos.close();        }   }   

如果不加bos.close();语句,则运行后打开testBuffer.txt文件会查看不到内容,这是因为我们将数据写入了缓冲区,只有结束程序时才写入到指定文件中。bos.close();实现立即写入到指定文件,不同的是这样如果想要继续写入就不用再次打开文件了。 

从指定文件中读出数据:

import java.io.*;     

class StreamTest{      

  public static void main(String[] args)throws Exception{      

   FileInputStream fis=new FileInputStream("d:/test.txt");      

 BufferedInputStream bis=new BufferedInputStream(fis);          

   byte[] buf=new byte [100];    

   int len = bis.read(buf);              

  System.out.println(new String(buf,0,len));      

    bis.close();         }       }

 

 结合后的流被称为过滤流。举例: 

   DateInputStream din = new DateInputStream( 

                                             new BufferedInputStream( 

                                                         new FileInputStream("employee.dat")));    首先是从文件读取数据,用FileInputStream构造输入流;为了达到数据缓冲的效果,还要用   

   BufferedInputStream包装;最后要输出基本数据类型,而不是输出字节流,还必须用DateInputStream来包装一 

   层。这就是流最常用的包装方式,这样做很有必要,必须将流结构连续的分层,直到能够使用的所需要的 

   功能为止。这样虽然很麻烦,但是将流进行过滤分层,进行混合与匹配,从而构造出真正使用的流序列, 

   从而带来了很大的灵活性。Java IO 的一般使用原则 

一、按数据来源(去向)分类: 1 、是文件: FileInputStream, FileOutputStream(字节流),FileReader, FileWriter(字符流

、是 byte[]  ByteArrayInputStream, ByteArrayOutputStream(字节流

、是 Char[]: CharArrayReader, CharArrayWriter(字符流

4.String: StringBufferInputStream, StringBufferOuputStream (字节流)StringReader, StringWriter(字符流

、网络数据流: InputStream, OutputStream(字节流), Reader, Writer( 字符流 ) 

二、按是否格式化输出分: 

、要格式化输出: PrintStream, PrintWriter 三、按是否要缓冲分: 1 、要缓冲: BufferedInputStream, BufferedOutputStream(字节流), BufferedReader, BufferedWriter(字符流

四、按数据格式分: 

、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream 及其所有带 Stream 结束的子类 

、纯文本格式(含纯英文与汉字或其他编码方式):Reader, Writer 及其所有带 Reader, Writer 的子类 

五、按输入输出分:

、输入: Reader, InputStream 类型的子类 2 、输出: Writer, OutputStream 类型的子类 六、特殊需要: 

、从 Stream  Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter 

、对象输入输出: ObjectInputStream, ObjectOutputStream 3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter 

、合并输入: SequenceInputStream 

5特殊需要 PushbackInputStream, PushbackReader,LineNumberInputStream, 

LineNumberReader 

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要): 

首先,考虑最原始的数据格式是什么: 原则四 

第二,是输入还是输出:原则五 

第三,是否需要转换流:原则六第 1  

第四,数据来源(去向)是什么:原则一 

第五,是否要缓冲:原则三 

(特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出:原则二

DataInputStream和DataOutputStream对象可以读取各种类型的数据

DataOutputStream方法

1.public final void writeBytes(String s)低字节写入到目标设备中

2.public final void writeChars(String s) 字符串中的两个字节写入到目标中

3.public final void writeUTF(String str) 按照UTF写入到目标设备中去

DataInputStream方法只有readUTF

——12中没有写入输入的长度,不知道怎么读出来

FileOutputStream fos=new FileOutputStream("count.txt");

BufferedOutputStream bos=new BufferedOutputStream(fos);

DataOutputStream dos=new DataOutputStream(bos);

 

dos.writeUTF("ab 中国");

dos.writeBytes("ab 中国");

dos.writeChars("ab 中国");

dos.close();

;

FileInputStream fis=new FileInputStream ("count.txt");

BufferedInputStream bis=new BufferedInputStream(fis);

DataInputStream dis=new DataInputStream(bis);

System.out.println(dis.readUTF());

byte[] buf=new byte[1024];

int len =dis.read(buf);

System.out.println(new String(buf,0,len));

fis.close();

 

PrintStream

PrintStream类提供了一系列的printprintln方法,可以将基本数据类型的数据格式化成字符串输出,而不是输出原始的字节数。不是基本类型先调用toString的方法转换成字节再输出。

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream;这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 ('\n')

PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。

PrintStream(OutputStream out)创建新的打印流。此流将不会自动刷新。

PrintStream(OutputStream out, boolean autoFlush)

autoFlush - boolean 变量;如果为 true,则每当写入 byte 数组、调用其中一个 println 方法或写入换行符或字节 ('\n') 时都会刷新输出缓冲区

PrintStream(OutputStream out, boolean autoFlush, String encoding)

PrintStream对应的printwriter类,即使遇到了文本换行标示符(\n),printwriter类也不会自动清空缓冲区,只有设置了缓冲区或者调用了println方法,它才会刷新缓冲区。

ObjectOutputStreamObjectInputStream

两个包装类用于从底层输入流中读取对象类型的数据和将对象的数据写入到底层的输入流

实现了接口Serializable,以利用对象流对对象进行序列化(可以处理不同系统上面的差异)。对象中的transient(临时)和static类型的成员变量不会读取和写入

一个可以被序列化的myclass类的定义:

Public class myclass implements Serializable(必须实现)

{public transient Thread t;(为了不保留线程所以将其定义为transient)

Private String customerID;

Private int total;}

如果连续的存储对象运用循环语句····

字节流与字符流的转换

1、从字节流到字符流:InputStreamReaderOutputStreamWriter类可以实现。 

2、从字符流到字节流:可以从字符流中获取char[]数组,转换为String,然后调用StringAPI函数getBytes() 获取到byte[],然后就可以通过ByteArrayInputStreamByteArrayOutputStream来实现到字节流的转换。

JAVA程序与其它进程的数据通信

JAVA程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。

调用Process类的getOutputStreamgetInputStream方法可以获得连接到子进程的输出流和输入流对象。

编程实例:在TestInOut(父类)中启动java.exe命令执行另个一个MyTest(子类)TestInOutMyTest通过进程间的管道相互传递数据。

 验证管道缓冲区满后,将发生下面的哪种情况:
(1)新的数据写入时,将最前面写入的数据挤出去,从而发生数据丢失。
(2)与PipedInputStream相连的PipedOutputStream无法再写入新的数据,PipedOutputStream.write方法处于阻塞状态。(出现的正是这种情况)
(3)与PipedInputStream相连的PipedOutputStream无法再写入新的数据,PipedOutputStream.write方法抛出异常。

 记住调用Process类的destroy方法结束子进程的运行。

 

提高程序的运行效率

 

1

for(int i=0;i<str.length();i++);{

   ......

}

与下面代码的比较:

int len = str.length();

for(int i=0;i<len;i++);{

   ......

}2

byte[] buf = new byte[1024];

while(true){

   对buf元素的操作语句

}

与下面代码的比较:

while(true){

   byte[] buf = new byte[1024];

   对buf元素的操作语句

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值