java-API之字节流的读取与写入

字节流的读取与写入

字节流的读取

InputStream

InputStream类是抽象类,是表示字节输入流的所有类的超类。

public abstract class InputStream{}  // InputStream类是抽象类
public class FileInputStream extends InputStream{} // InputStream类是FileInputStreamextends的父类/超类

public class FilterInputStream extends InputStream{}
public class BufferedInputStream extends FilterInputStream{}  // InputStream类是BufferedInputStreamextends 的父类/超类

InputStream中的常用方法

  • abstract int read() 从输入流中读取数据的下一个字节。
  • int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
  • int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。
  • void close() 关闭此输入流并释放与该流关联的所有系统资源。

FileInputStream 子类

创建对象的方法

  • FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
  • FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
InputStream in = new FileInputStream( new File( "F:\\ioTest\\1.txt" ) );
InputStream in = new FileInputStream( "F:\\ioTest\\1.txt" );

高效的BufferedInputStream子类

BufferedInputStream 之所以高效,其根本原因在于创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

private static int DEFAULT_BUFFER_SIZE = 8192;
/**
 * The internal buffer array where the data is stored. When necessary,
 * it may be replaced by another array of
 * a different size.
 */
protected volatile byte buf[]; // 源码中的缓存数组 大小默认8kb = 8 * 1024

创建对象的方式:

  • BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
InputStream in = new BufferedInputStream(new FileInputStream( new File( "F:\\ioTest\\1.txt" ));
InputStream in = new BufferedInputStream(new FileInputStream( "F:\\ioTest\\1.txt" );

字节流读取的测试案例

// 注:该案例需要导入包,及处理异常,请自行处理
// 1.创建字节读取对象
// InputStream in = new FileInputStream("F:\\ioTest\\1.txt");
InputStream in = new BufferedInputStream(new FileInputStream("F:\\ioTest\\1.txt")); // 效率较高
// 2.开始读取数据
 int data = 0;
 while((data = in.read()) != -1) {
    System.out.println(data);
 }
// 3.释放资源
 in.close();

字符流的写出

OutputStream类

OutputStream类是抽象类,表示输出字节流的所有类的超类/父类。

public abstract class OutputStream{} // OutputStream类 是 抽象类
public class FileOutputStream extends OutputStream{} // OutputStream类 是FileOutputStream类 的父类/超类

public class FilterOutputStream extends OutputStream{}
public class BufferedOutputStream extends FilterOutputStream {}  // OutputStream类 是 BufferedOutputStream类 的父类/超类

常用方法:

  • void close() 关闭此输出流并释放与此流有关的所有系统资源。
  • void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
  • void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
  • void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
  • abstract void write(int b) 将指定的字节写入此输出流。

FileOutputStream子类

创建对象的方式:

  • FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
  • FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
  • FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
  • FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
OutputSteam out1 = new FileOutputStream( new File( "F:\\ioTest\\1.txt" ) );  //写入数据 覆盖原来的数据
OutputSteam out2 = new FileOutputStream( new File( "F:\\ioTest\\1.txt" ), true );  //写入数据 追加数据
OutputSteam out3 = new FileOutputStream( "F:\\ioTest\\1.txt" );  //写入数据 覆盖原来的数据
OutputSteam out4 = new FileOutputStream( "F:\\ioTest\\1.txt", true );  //写入数据 追加数据

高效BufferedOutputStream子类

BufferedOutputStream之所以高效,其根本原因在于创建 BufferedOutputStream时,会创建一个内部缓冲区数组。当缓存数组满了后,可以一次性写入多个字节。

/**
 * The internal buffer where data is stored.
 */
protected byte buf[]; // 源码中的缓存数组 大小默认8kb = 8 * 1024

创建对象

  • public BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
OutputStream out = new BufferedOutputStream( new FileStream( new File("F:\\ioTest\\1.txt") ) );
OutputStream out2 = new BufferedOutputStream( new FileStream( "F:\\ioTest\\1.txt" ) );

字节流写入的案例

try {	
// 1、创建对象
OutputStream out = new FileOutputStream("F:\\ioTest\\1.txt",true);  // 有第二个boolean参数,追加数据
// OutputStream out2 = new FileOutputStream(new File("F:\\ioTest\\1.txt")); //没有第二个boolean参数,会覆盖原来的数据
// 2、写出数据
for (int i = 65; i < 91; i++) {  // A-Z
    out.write(i);
}
out.close();  //关闭资源
// 3、释放数据
out.close();
} catch (IOException e) {
    e.printStackTrace();
}
posted @ 2020-03-06 20:45  技术狂-CYL  阅读(574)  评论(0编辑  收藏  举报