IO流的大概应用之字节流

字节流

InputStream:

是字节输入流的超类,主要包括:
FileInputStream
BufferedInputStream
DataInputStream
ByteArrayInputStream
主要方法:

//从输出流读取数据的下一个字节
abstract int read()
//从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
int read(byte[] b)
//将输入流中最多len个数据字节读入byte数组
int read(byte[] b,int off,int len)
//关闭流资源
void close();
FileInputStream

文件字节输入流,主要用来读取文件信息
构造方法:

//通过打开一个实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定
FileInputStream(File file)
//通过使用文件描述符fbObj创建一个FileInputStream,该文件描述符表示到文件系统中某个市级文件的现有连接
FileInputStream(FileDescriptor fdObj)
//通过打开一个到实际文件的连接来创建一个FIleInputStream,该文件通过文件系统中的路径名name指定
FileInputStream(String name)

方法主要是继承自InputStream

public class TestFileInPutStream {

	public static void main(String[] args) throws IOException {
		File file = new File("E:\\test.txt");
		FileInputStream fis1 = new FileInputStream(file);
		FileInputStream fis2 = new FileInputStream("E:\\test.txt");
		int b=0;
		byte[] buffer = new byte[10];
		while((b = fis1.read(buffer)) != -1) {			
			System.out.println(new String(buffer,0,b));
		}
		fis1.close();
	}

OutputStream

是字节输出流的超类,主要包含:
FileOutputStream
BufferedOutputStream
DataOutputStream
ByteArrayOutputStream
主要方法:

//每次写入一个字节,将指定的字节写入此输出流
abstract void write(int b)
//将b.length个字节从指定的byte数组写入此输出流
void write(byte[] b)
//将指定byte数组中从偏移量off开始的len个字节写入此输出流
void write(byte[] b,int off,int len)
//关闭流资源
void close();
FileOutputStream

文件字节输出流,主要用来写入文件信息,是将数据写入到File或FIleDescriptor的输出流
构造方法:

//创建一个向指定File对象表示的文件写入数据的文件输出流
FileOutputStream(File file)
//创建一个向具有指定name的文件中写入数据的输出文件流
FileOutputStream(String name)
//创建一个向指定File对象对象表示的文件写入数据的文件输出流,append表示是否在文件最后追加信息
//true表示将信息追加到最后面,false表示将信息写到最前面
FileOutputStream(File file,boolean append)
//创建一个向具有指定name的文件中写入数据的输出文件流
FileOutputStream(String name,boolean append)

主要方法继承自OutputStream

public static void main(String[] args) throws IOException {
		File file = new File("abc.txt");
		FileOutputStream fos = new FileOutputStream(file,true);
		
		byte [] array = "hello world!".getBytes();
		fos.write(array);
		fos.write(array, 2, 7);

		byte[] arrays = "\n床前明月光,\n疑似地上霜。\n举头望明月,\n低头思故乡。".getBytes();
		
		fos.write(arrays);
		fos.close();
	}

运行结果:

hello world!llo wor
床前明月光,
疑似地上霜。
举头望明月,
低头思故乡。

复制文件

将aaa中的文件读出,然后将读出的内容写到bbb中
采用数组的方式读取和写入
这里面会出现异常,全部捕获了然后处理掉,不需要抛出

public static void main(String[] args)  {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream("E:\\aaa.jpg");
			fos = new FileOutputStream("E:\\bbb.jpg");
			int b = 0;
			byte[] array = new byte[1024];
			try {
				while((b = fis.read(array)) != -1) {
					fos.write(array,0,b); 
					fos.flush();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			if(fos != null)
				fos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			if(fis != null)
				fis.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

字节缓冲流

字节缓冲流分为两个:
字节缓冲输入流(BufferedInputStream)
字节缓冲输出流(BufferedOutputStream)

缓冲区对象本身不具备对文件进行读写的功能,需要依赖输出流和输入流

BufferedInputStream

构造方法:

//创建一个BufferedInputStream并保存其参数,即输入流in
BufferedInputStream(InputStream in)
//创建一个具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in
BufferedInputStream(InputStream in,int size)

案例:

public static void main(String[] args) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("abc.txt"));
		byte[] arr = new byte[1024];
		int len = 0;
		while((len=bis.read(arr)) != -1) {
			String str = new String(arr,0,len);
			System.out.println(str);
		}
	}

运行结果:

hello world!llo wor
床前明月光,
疑似地上霜。
举头望明月,
低头思故乡。

缓冲区对象读写数据的速度比一般对象要快得多

BufferedOutputStream

构造方法:

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

案例:

public static void main(String[] args) throws IOException {
	//创建字节输出流缓冲区对象
	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt"));
	bos.write("测试一下这个".getBytes());//这里是先将数据写入到缓冲区内置的数组
	bos.flush();//把存储在内置数组中的数据写到文件中
	bos.close();//在关闭字节输出流缓冲流对象时,先调用flush()方法
	}

新的方法:
void flush()刷新缓冲区

字节流缓冲流复制文件

案例
这里复制的是一个很大的视频文件,但复制速度还是很快

public static void main(String[] args) {
		
			long start = System.currentTimeMillis();
			BufferedInputStream bis = null;
			BufferedOutputStream bos = null;
			int b = 0;
			byte[] bytes = new byte[1024];
			try {
				bis = new BufferedInputStream( new FileInputStream("F:\\aaa.mp4"));
				bos = new BufferedOutputStream( new FileOutputStream("F:\\bbb.mp4"));
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				while((b = bis.read(bytes)) != -1) {
					bos.write(bytes,0,b); 
					bos.flush();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if(bos != null) {
					bos.flush();
					bos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				if(bis != null)
					bis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			long end = System.currentTimeMillis();
			long past = end-start;
			System.out.println(past);
		}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值