天天看点

黑马程序员_Java_IO流_字节流

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、字节流概述

1、 字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。

2、 由于媒体文件数据中都是以字节存储的,所以,字节流对象可直接对媒体文件的数据写入到文件中,而可以不用再进行刷流动作。

3、 读写字节流:InputStream   输入流(读)

                              OutputStream  输出流(写)

4、 为何不用进行刷流动作:

        因为字节流操作的是字节,即数据的最小单位,不需要像字符流一样要进行转换为字节。所以可直接将字节数据写入到指定文件中。

二、字节输入流

2.1 InputStream

1、 InputStream:此抽象类表示字节输入流的缩影类的超类。需要定义InputStream子类的应用程序必须总是提供返回下一个输入字节的方法。

2、 直接已知的子类:AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream

3、 方法

int available();//返回文本内容的总计字节数。可以获取文本的大小。返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。

void mark(int readlimit);//测试此输入流是否支持mark和reset方法。

read();//读取的是单个字节。

close();//关闭字节流

void reset();//将此流重新定位到最后一次对此输入流调用mark方法时的位置。

long skip(long n);//跳过和丢弃此输入流中的数据的n个字节。

2.2 FileInputStream

1、 FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

2、 构造方法

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

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

3、 read();//从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。返回下一个数据字节;如果已到达文件末尾,则返回 -1。

程序示例:

public class FileStream {

	public static void main(String[] args) throws IOException {
		ReadFile_1();
	}
	
	public static void ReadFile_1() throws IOException{
		
		FileInputStream fis=new FileInputStream("fos.txt");
		
		int ch=0;
		while((ch=fis.read())!=-1){
			System.out.print((char)ch);
		}
		fis.close();
	}
}
           

2.3 BufferedInputStream

1、 在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

2、 构造方法

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

BufferedInputStream(InputStream in, int size);// 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

3、 自己构造一个BufferedInputStream缓冲区

程序示例:

package demo.iostream;

import java.io.*;

public class MyBufferedInputStreamDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

class MyBufferedInputStream{
	private InputStream in;
	private byte[] buf=new byte[1024];
	private int pos=0,count=0;
	MyBufferedInputStream(InputStream in){
		this.in=in;
	}
	
	public int myRead() throws IOException{
		
		if(count==0){
			count=in.read(buf);
			if(count<0)
				return -1;
			pos=0;
			byte b=buf[pos];
			count--;
			pos++;
			return b & 255;
		}
		else if(count>0){
			
			byte b=buf[pos];
			count--;
			pos++;
			return b & 255;
		}
		return -1;
		
		
	}
	
	public void myClose() throws IOException{
		in.close();
	}
}
           

2.4 DataInputStream

1、 用于操作基本数据类型的字节输入流,数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

2、 构造方法

DataInputStream(InputStream in) ;//使用指定的底层 InputStream 创建一个 DataInputStream。

3、 方法

读取基本数据类型的方法:readBoolean()、readByte()、readChar()、readDouble()、readFloat()、readInt()、readLong()、readShort()。

readUTF(),读入一个已使用 UTF-8 修改版格式编码的字符串。

程序示例:

public static void readData() throws IOException{
		DataInputStream dis=new DataInputStream(new FileInputStream("data.txt"));
		int num=dis.readInt();
		boolean b=dis.readBoolean();
		double d=dis.readDouble();
		System.out.println(num);
		System.out.println(b);
		System.out.println(d);
		dis.close();
		
	}
           

三、字节输出流

3.1 OutputStream

1、 OutputStream:此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节,并将这些字节发送到某个接收器。需要定义OutputStream子类的应用程序必须始终提供至少一个可写入一个输出字节的方法。

2、 已知直接子类:ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

3、 方法

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

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

void write(byte[] b);//将b.length个字节从指定的byte数组写入此输出流

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

3.2 FIleOutputStream

1、 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。FileOutputStream 用于写入诸如图像数据之类的原始字节的流。

2、 构造方法

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

  FileOutputStream(File file, boolean append);// 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。若append为true,则在文件后续写,否则覆盖。

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

  FileOutputStream(String name, boolean append);//创建一个向具有指定 name 的文件中写入数据的输出文件流。若append为true,则在文件后续写,否则覆盖。

3、 复制图片示例:

package demo.iostream;

/*
复制一个图片
思路:
1,用字节读取流对象和图片关联
,用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
3,通关循环读写,完成数据的存储
3,关闭资源
 */

import java.io.*;

public class CopyPic {

	public static void main(String[] args) {
		FileOutputStream fos=null;
		FileInputStream fis=null;
		try {
			fos=new FileOutputStream("2.jpg");
			fis=new FileInputStream("1.jpg");
			byte[] buf=new byte[1024];
			int len=0;
			while((len=fis.read(buf))!=-1){
				fos.write(buf,0,len);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				if(fis!=null){
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if(fos!=null){
					fos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}
           

3.3 BufferedOutputStream

1、 该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

2、 构造方法

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

        BufferedOutputStream(OutputStream out, int size);//创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。

3、 通过缓冲区复制mp3文件(用到之前做的缓冲区)

package demo.iostream;

import java.io.*;

/*
演示mp3的复制,通过缓冲区
BufferedOutputStream
BufferedInputStream
 */
public class CopyMp3 {

	public static void main(String[] args) throws IOException {
		long start=System.currentTimeMillis();
//		Copy_1();
		Copy_2();
		long end=System.currentTimeMillis();
		System.out.println((end-start)+"毫秒");
	}
	
	public static void Copy_2() throws IOException{
		MyBufferedInputStream bufis=new MyBufferedInputStream(new FileInputStream("1.mp3"));
		BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("2.mp3"));
		
		int len=0;
		while((len=bufis.myRead())!=-1){
			bufos.write(len);
		}
		bufis.myClose();
		bufos.close();
	}
	public static void Copy_1() throws IOException{
		BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("1.mp3"));
		BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("2.mp3"));
		
		int len=0;
		while((len=bufis.read())!=-1){
			bufos.write(len);
		}
		bufis.close();
		bufos.close();
	}
}
           

3.4 DataOutputStream

1、 用于操作基本数据类型的字节输出流,数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。 

2、 构造方法

DataOutputStream(OutputStream out);//创建一个新的数据输出流,将数据写入指定基础输出流。

3、 方法

读取基本数据类型的方法:writeBoolean(boolean v)、writeByte(int v)、writeChar(int v) 、writeDouble(double v)、writeFloat(float v)、writeInt(int v)、writeLong(long v)、writeShort(int v)。

writeUTF(String str) ,以与机器无关方式使用UTF-8 修改版编码将一个字符串写入基础输出流。

程序示例:

public static void writeData() throws IOException{
		
		DataOutputStream dos=new DataOutputStream(new FileOutputStream("data.txt"));
		
		dos.writeInt(234);
		dos.writeBoolean(true);
		dos.writeDouble(426.415);
		
		dos.close();		
	}
           

继续阅读