欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中的BufferedInputStream与BufferedOutputStream使用示例

程序员文章站 2024-03-12 21:33:02
bufferedinputstream  bufferedinputstream 是缓冲输入流。它继承于filterinputstream。 buffere...

bufferedinputstream 
bufferedinputstream 是缓冲输入流。它继承于filterinputstream。
bufferedinputstream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持“mark()标记”和“reset()重置方法”。
bufferedinputstream 本质上是通过一个内部缓冲区数组实现的。例如,在新建某输入流对应的bufferedinputstream后,当我们通过read()读取输入流的数据时,bufferedinputstream会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。
bufferedinputstream 函数列表:

bufferedinputstream(inputstream in)
bufferedinputstream(inputstream in, int size)

synchronized int   available()
void   close()
synchronized void   mark(int readlimit)
boolean   marksupported()
synchronized int   read()
synchronized int   read(byte[] buffer, int offset, int bytecount)
synchronized void   reset()
synchronized long   skip(long bytecount)

示例代码:
关于bufferedinputstream中api的详细用法,参考示例代码(bufferedinputstreamtest.java):

import java.io.bufferedinputstream;
import java.io.bytearrayinputstream;
import java.io.file;
import java.io.inputstream;
import java.io.fileinputstream;
import java.io.ioexception;
import java.io.filenotfoundexception;
import java.lang.securityexception;

/**
 * bufferedinputstream 测试程序
 *
 * @author skywang
 */
public class bufferedinputstreamtest {

  private static final int len = 5;

  public static void main(string[] args) {
    testbufferedinputstream() ;
  }

  /**
   * bufferedinputstream的api测试函数
   */
  private static void testbufferedinputstream() {

    // 创建bufferedinputstream字节流,内容是arrayletters数组
    try {
      file file = new file("bufferedinputstream.txt");
      inputstream in =
         new bufferedinputstream(
           new fileinputstream(file), 512);

      // 从字节流中读取5个字节。“abcde”,a对应0x61,b对应0x62,依次类推...
      for (int i=0; i<len; i++) {
        // 若能继续读取下一个字节,则读取下一个字节
        if (in.available() >= 0) {
          // 读取“字节流的下一个字节”
          int tmp = in.read();
          system.out.printf("%d : 0x%s\n", i, integer.tohexstring(tmp));
        }
      }

      // 若“该字节流”不支持标记功能,则直接退出
      if (!in.marksupported()) {
        system.out.println("make not supported!");
        return ;
      }

      // 标记“当前索引位置”,即标记第6个位置的元素--“f”
      // 1024对应marklimit
      in.mark(1024);

      // 跳过22个字节。
      in.skip(22);

      // 读取5个字节
      byte[] buf = new byte[len];
      in.read(buf, 0, len);
      // 将buf转换为string字符串。
      string str1 = new string(buf);
      system.out.printf("str1=%s\n", str1);

      // 重置“输入流的索引”为mark()所标记的位置,即重置到“f”处。
      in.reset();
      // 从“重置后的字节流”中读取5个字节到buf中。即读取“fghij”
      in.read(buf, 0, len);
      // 将buf转换为string字符串。
      string str2 = new string(buf);
      system.out.printf("str2=%s\n", str2);

      in.close();
    } catch (filenotfoundexception e) {
      e.printstacktrace();
    } catch (securityexception e) {
      e.printstacktrace();
    } catch (ioexception e) {
      e.printstacktrace();
    }
  }
}

程序中读取的bufferedinputstream.txt的内容如下:

abcdefghijklmnopqrstuvwxyz
0123456789
abcdefghijklmnopqrstuvwxyz

运行结果:

0 : 0x61
1 : 0x62
2 : 0x63
3 : 0x64
4 : 0x65
str1=01234
str2=fghij

bufferedoutputstream 
bufferedoutputstream 是缓冲输出流。它继承于filteroutputstream。
bufferedoutputstream 的作用是为另一个输出流提供“缓冲功能”。
bufferedoutputstream 函数列表:

bufferedoutputstream(outputstream out)
bufferedoutputstream(outputstream out, int size)

synchronized void   close()
synchronized void   flush()
synchronized void   write(byte[] buffer, int offset, int length)
synchronized void   write(int onebyte)

示例代码:
关于bufferedoutputstream中api的详细用法,参考示例代码(bufferedoutputstreamtest.java):

import java.io.bufferedoutputstream;
import java.io.file;
import java.io.outputstream;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.filenotfoundexception;
import java.lang.securityexception;
import java.util.scanner;

/**
 * bufferedoutputstream 测试程序
 *
 * @author skywang
 */
public class bufferedoutputstreamtest {

  private static final int len = 5;
  // 对应英文字母“abcddefghijklmnopqrsttuvwxyz”
  private static final byte[] arrayletters = {
    0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a
  };

  public static void main(string[] args) {
    testbufferedoutputstream() ;
  }

  /**
   * bufferedoutputstream的api测试函数
   */
  private static void testbufferedoutputstream() {

    // 创建“文件输出流”对应的bufferedoutputstream
    // 它对应缓冲区的大小是16,即缓冲区的数据>=16时,会自动将缓冲区的内容写入到输出流。
    try {
      file file = new file("out.txt");
      outputstream out =
         new bufferedoutputstream(
           new fileoutputstream(file), 16);

      // 将arrayletters数组的前10个字节写入到输出流中
      out.write(arrayletters, 0, 10);
      // 将“换行符\n”写入到输出流中
      out.write('\n');

      // todo!
      //out.flush();

      readuserinput() ;

      out.close();
    } catch (filenotfoundexception e) {
      e.printstacktrace();
    } catch (securityexception e) {
      e.printstacktrace();
    } catch (ioexception e) {
      e.printstacktrace();
    }
  }

  /**
   * 读取用户输入
   */
  private static void readuserinput() {
    system.out.println("please input a text:");
    scanner reader=new scanner(system.in);
    // 等待一个输入
    string str = reader.next();
    system.out.printf("the input is : %s\n", str);
  }
}

运行结果:
生成文件“out.txt”,文件的内容是“abcdefghij”。
分步测试: 分别按照下面3种步骤测试程序,来查看缓冲区大小以及flush()的作用。
第1种:原始程序
(1) 运行程序。在程序等待用户输入时,查看“out.txt”的文本内容;发现:内容为空。
(2) 运行程序。在用户输入之后,查看“out.txt”的文本内容;发现:内容为“abcdefghij”。
从中,我们发现(01)和(02)的结果不同;之所以(01)中的out.txt内容为空,是因为out.txt对应的缓冲区大小是16字节,而我们只写入了11个字节,所以,它不会执行清空缓冲操作(即,将缓冲数据写入到输出流中)。
而(02)对应out.txt的内容是“abcdefghij”,是因为执行了out.close(),它会关闭输出流;在关闭输出流之前,会将缓冲区的数据写入到输出流中。
注意:重新测试时,要先删除out.txt。
第2种:在readuserinput()前添加如下语句
out.flush();
这句话的作用,是将“缓冲区的内容”写入到输出流中。
(1) 运行程序。在程序等待用户输入时,查看“out.txt”的文本内容;发现:内容为“abcdefghij”。
(2) 运行程序。在用户输入之后,查看“out.txt”的文本内容;发现:内容为“abcdefghij”。
从中,我们发现(01)和(02)结果一样,对应out.txt的内容都是“abcdefghij”。这是因为执行了flush()操作,它的作用是将缓冲区的数据写入到输出流中。
注意:重新测试时,要先删除out.txt!
第3种:在第1种的基础上,将

out.write(arrayletters, 0, 10);

修改为

out.write(arrayletters, 0, 20);

(1) 运行程序。在程序等待用户输入时,查看“out.txt”的文本内容;发现:内容为“abcdefghijklmnopqrst”(不含回车)。
(02) 运行程序。在用户输入之后,查看“out.txt”的文本内容;发现:内容为“abcdefghijklmnopqrst”(含回车)。
从中,我们发现(01)运行结果是“abcdefghijklmnopqrst”(不含回车)。这是因为,缓冲区的大小是16,而我们通过out.write(arrayletters, 0, 20)写入了20个字节,超过了缓冲区的大小;这时,会直接将全部的输入都写入都输出流中,而不经过缓冲区。
(3)运行结果是“abcdefghijklmnopqrst”(含回车),这是因为执行out.close()时,将回车符号'\n'写入了输出流中。
注意:重新测试时,要先删除out.txt!