IO之字节流



字节流以8位的字节为单位进行读与写操作。其体系都是以InputStream和OutputStream为基类派生出来。这两个类是抽象类,作为字节流的模版。

1.OutputStream和FileOutputStream

1.1 OutputStream
OutputStream是表示输出字节流的所有类的超类。
其用于输出的方法有如下几个:

void write(int b):将指定的字节写入此输出流。

void write(byte[] b):将b.length个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len):将指定 byte 数组中从偏移量off开始的len个字节写入此输出流。

可见,输出方法可以输出单个字节和字节数组。

将字符串转换为字节数组可以使用String类的getBytes()方法。

除了写的几个重载方法,还有以下几个方法:

void flush():刷新此输出流并强制写出所有缓冲的输出字节。

void close():关闭此输出流并释放与此流有关的所有系统资源。

注意,即使没有使用flush和close方法,依然可以将数据输出。这与字符流不同。因为字符流带有默认的缓冲:字符由两个字节组成,读入或写出一个字符时,先要将第一个字节保存,在读到第二个字节时再一起查表,才可以变为一个完整的字符。所以要刷新默认的缓存。


1.2 FileOutputStream

FileOutputStream是用于写入诸如图像数据之类的原始字节的流。

构造器:

FileOutputStream(String fileName):创建一个向具有指定名称的文件中写入数据的输出文件流。

FileOutputStream(String fileName, boolean append):创建一个向具有指定name的文件中写入数据的输出文件流。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。


FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。

FileOutputStream(File file, boolean append):创建一个向指定File对象表示的文件中写入数据的文件输出流。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。

见下面程序(在使用输入输出类的方法中,有许多方法会抛出异常,这里为了方便学习与查看,没有将异常处理而是抛出,后面会有详细的异常处理)

public class OutputStreamDemo {

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

		//字节流
		FileOutputStream fos = new FileOutputStream("demo.txt");
		
		//写入单个字节
		fos.write('a');
		
		//写入字节数组,将字符串变为字节数组。
		fos.write("你好".getBytes());
		//关闭字节流
		fos.close();
	}

}

2.InputStream和FileInputStream

2.1 InputStream

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

用于输入的方法:

int read():从输入流中读取数据的下一个字节。返回0255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。输出时需要进行强转(byte)。如果读的是中文字符,那么会发生乱码。因为2个字节才是一个完整的字符。


int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。返回读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回-1。 
  

int read(byte[] b, int off, int len): 将输入流中最多len个数据字节读入 byte 数组。返回读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回-1。 


其他方法:

int available():返回文件的字节数。

使用该方法,可以在起初就创建一个长度与被读取文件字节数相同的数组,这样输出时就不需要再循环。但是如果源文件过大,会发生内存溢出。


2.2 FileInputStream

FileInputStream用于读取诸如图像数据之类的原始字节流。

构造器:

FileInputStream(String fileName):通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名fileName指定。

FileInputStream(File file):通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。

public class InputStreamDemo {

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

		method_1();
		method_2();
		method_3();
	}
	
	//输入单个字节
	public static void method_1() throws IOException{
		FileInputStream fis = new FileInputStream("demo.txt");
		int b = 0;
		//判断是否读到末尾的只要判断返回值是否为-1
		while((b = fis.read()) != -1){
			//打印时需要进行强转
			System.out.println((char)b);
		}
	}
	
	//使用字节数组
	public static void method_2() throws IOException{
		FileInputStream fis = new FileInputStream("demo.txt");
		byte[] buf = new byte[1024];
		int len = 0;
		while((len = fis.read(buf)) != -1){
			System.out.println(new String(buf, 0 ,len));
		}
	}
	
	//使用字节数组,大小为文件字节数
	public static void method_3() throws IOException{
		FileInputStream fis = new FileInputStream("demo.txt");
		
		//大小等于文件字节数
		byte[] buf = new byte[fis.available()];
		
		//不需要使用循环
		fis.read(buf);
		System.out.println(new String(buf));
	}

}


3.BufferedInputStream和BufferedOutputStream

BufferedInputStream和BufferedOutputStream是带有缓冲的字节流。

3.1 BufferedInputStream

构造器

BufferedInputStream(InputStream in):创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。

方法:

void close():关闭字节流。不需要手动关闭包装的字节流。

public class BufferedInputStreamDemo {

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

		//字节流
		FileInputStream fis = new FileInputStream("c:\\demo.txt");
		//带有缓冲的字节流
		BufferedInputStream bufin = new BufferedInputStream(fis);
		
		//字节数组
		byte[] buf = new byte[1024];
		int len = 0;
		while((len = bufin.read(buf)) != -1){
			System.out.print(new String(buf, 0, len));
		}
		
		bufin.close();
	}

}



3.2 BufferedOutputStream

构造器:

BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

方法:

void close():关闭字节流。不需要手动关闭包装的字节流。

public class BufferedOutputStreamDemo {

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

		//字节流
		FileOutputStream fos = new FileOutputStream("c:\\demo.txt");
		//带缓存的字节流
		BufferedOutputStream bufout = new BufferedOutputStream(fos);
		//输出字节数组,将字符串转换为字节数组
		bufout.write("java".getBytes());
		bufout.close();
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值