黑马程序员——IO流-字节流

------- android培训java培训、期待与您交流! ----------

 

字节流

 

IO(Input Output)

1.      IO流概述

1)      IO流用来处理设备之间的数据传输

2)      Java对数据的操作是通过流的方式

3)      Java用于操作流的对象都在IO包中

4)      流按操作数据分为两种: 字节流与字符流

5)      流按流向分为: 输入流, 输出流

2.      字节流和字节流

1)      字节流

InputStreamOutputStream是字节流的两个根类, 这两个类都是抽象类, InputStream以及它的子类用来读出数据, OutputStream的子类用来写入数据, 它们的子类都是有这两个类的名字作为后缀, 例如BufferedInputStream, BufferedOutputStream, 字节流处理可以处理一切数据流, 但是处理字符不方便

2)      字符流

ReaderWriter是字符流的两个根类, 这两个类都是抽象类, Reader的子类用来读出字符数据, Writer以及它的子类用来写入字符数据, 它们的子类都是有这两个类的名字作为后缀, 例如FileReader, FileWriter, 这两个类是专门用来处理字符的

 

 

字节流

1.      FileInputStream

1)      构造方法

FileInputStream(String name)

指定一个要读入文件的路径

例如 FileInputStream fis = new FileInputStream(“e:/abc/a.txt”)

这个对象指定了将“e:\abc”路径下的a.txt读入程序

注意: windows下文路径用”\”来分割文件夹, Java程序中要用转义字符”\\”来表示”\”, 或者用”/”来替换”\”.

2)      读入方法

a)      public int read()

作用: 读取一个字节的数据, 返回数据的ASCII, 如果读到文件末尾会返回-1

这个方法一次只能读入一个字节的数据, 数据量大的时候效率低

b)        public int read(byte[] b)

作用: 最多读入b.length个字节的数据, 返回读入数据的字节数

这个方法可以指定一次读入的字节数, 效率比较高, 读入的的字节数可能会比源文件的字节数多

c)      public int read(byte[] b, intoff, int len)

作用: 最多读入len个字节的数据, 返回读入数据的字节数

这个方法指定读入字节的长度, 可以读入正好数量的字节数据

3)      available方法

public int available()

作用: 返回当前要读入数据剩余的字节数

可以指定字节数组的大小, 大数据不建议使用

4)      close方法

public void close()

作用: 关闭当前输入流, 关闭是会自动刷新

当创建一个输入流对象的时候会打开系统的读写通道, 如果不关闭, 会占用资源, 时间长了会导致内存溢出, 所以当读写完毕后必须关掉IO, 下面的输出流也是一样

 

2.      FileOutputStream

1)      构造方法

a)      FileOutputStream(String name)

指定一个要读入文件的路径

例如 FileOutputStream fis = new FileOutputStream(“e:/abc/a.txt”)

这个对象指定了要写入数据的文件, 每次调用写入方法是都会将原来的文件覆盖掉

b)      FileOutputStream(String name,boolean append)

这个方法还接收一个布尔类型的值, 如果是true, 那么将不会覆盖原来的文件, 会将新写入的数据追加到原来数据的末尾处

注意: windows下文路径用”\”来分割文件夹, Java程序中要用转义字符”\\”来表示”\”, 或者用”/”来替换”\”.

2)      写出方法

a)      public void write(int b)

作用: 将指定字节写出到当前输出流

b)      public void write(byte[] b)

作用: 将指定byte[]中全部的数据写出到当前输出流

c)      public void read(byte[] b, intoff, int len)

作用: byte[]中从off开始的len个字节写出到当前输出流

d)      close方法

3)      plush方法

public voidplush()

当写出数据时数据时先存在内存中, 调用这个方法刷新将内存中的数据写到指定文件中

4)      public void close()

作用: 关闭当前输出流, 关闭是会自动刷新

        

 

3.      BufferedInputStream,BufferedOutputStream

这两个类的构造方法分别接收一个FileInputStream对象, FileOutputStream对象, 当用这两个类的对象读写数据时, 调用read()write(int b)方法会先将数据存入一个缓存是1024*8的的字节数组, 当字节数达到这么大的时候一次将数据读入或写出, 使用着两个类读写字节数据效率高

4.      输入输出流关闭的代码一定要写在finally语句中, finally中有异常再嵌套try{} finally{}

扩展: Jdk7新特性, 自动关闭流

语法: try () {} 这个语句可以不用将关闭流放在finally语句中, IO流将会被自动关闭, jdk7中的InputStreamOutputStream实现了AutoCloseable这个接口

FileInputStream和FileOutputStream代码示例

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

@SuppressWarnings("unused")
public class ReadWriteTest {
	public static void main(String[] args) throws IOException {
		method1();
		method2();
		method3();
		available();
	}

	// write(byte[] b, int offset, int len)
	private static void method3() throws FileNotFoundException, IOException {
		// 创建一个FileInputStream对象, 指定一个读入的文件
		FileInputStream fis = new FileInputStream("test.txt");
		// 创建一个FileOutputStream对象, 指定一个要写入的文件
		FileOutputStream fos = new FileOutputStream("test1.txt");
		// 创建一个byte[]存储数据
		byte[] b = new byte[1024];
		// 循环读取数组中的数据
		int len = 0; // 用来保存数组中数据的长度
		while ((len = fis.read(b)) != -1)
			// 将数组中的所有数据写出
			fos.write(b, 0, len);
	}

	// read(byte[] b)方法, write(byte[] b)
	private static void method2() throws FileNotFoundException, IOException {
		// 创建一个FileInputStream对象, 指定一个读入的文件
		FileInputStream fis = new FileInputStream("test.txt");
		// 创建一个FileOutputStream对象, 指定一个要写入的文件
		FileOutputStream fos = new FileOutputStream("test1.txt");
		// 创建一个byte[]存储数据
		byte[] b = new byte[1024];
		// 循环读取数组中的数据
		int len = 0; // 用来保存数组中数据的长度
		while ((len = fis.read(b)) != -1)
			// 将数组中的所有数据写出
			fos.write(b);
	}

	// read()方法, write(int b)方法
	private static void method1() throws FileNotFoundException, IOException {
		// 创建一个FileInputStream对象, 指定一个读入的文件
		FileInputStream fis = new FileInputStream("test.txt");
		// 创建一个FileOutputStream对象, 指定一个要写入的文件
		FileOutputStream fos = new FileOutputStream("test1.txt");
		// 循环读取每个字符
		int x = 0; // 用来保存读出的数据
		while ((x = fis.read()) != -1)
			// 将每个读入程序的数据写入指定文件
			fos.write(x);
	}

	// available方法
	private static void available() throws IOException {
		// 创建一个FileInputStream对象, 指定一个读入的文件
		FileInputStream fis = new FileInputStream("test.txt");
		// 将文件剩余的字节数赋给变量
		int a = fis.available();
		System.out.println(a);

	}
}


 

6

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class Copy_Test {
	public static void main(String[] args) {
		// 创建Scanner对象用于接收命令行数据
		Scanner scan = new Scanner(System.in);
		System.out.println("输入要拷贝文件路径: ");
		// 输入要被拷贝的文件的路径
		String source = scan.nextLine();
		System.out.println("输入拷贝的目标文件路径: ");
		// 输入目标文件路径
		String target = scan.nextLine();

		// 自动关闭流try语句
		try (
		// 创建BufferedInputStream对象用于读出指定文件数据
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				source));
		// 创建BufferedOutputStream对象用于向指定文件写入数据
				BufferedOutputStream bos = new BufferedOutputStream(
						new FileOutputStream(target));) {
			int len; // 定义变量用来接收读出的每个字节的数据
			// 设定一个开始的时间
			long start = System.currentTimeMillis();
			// 当读出的字节返回值不是-1时循环
			while ((len = bis.read()) != -1) {
				// 将读出的数据写入指定文件
				bos.write(len);
			}
			bos.flush();
			// 设置一个结束的时间
			long end = System.currentTimeMillis();
			System.out.println("拷贝成功, 一共用了" + ((end - start) / 1000) + "s");
		} catch (Exception e) {
			System.out.println("文件读写错误");
		}

	}
}


.      BufferedInputStreamBufferedOutputStream代码示例

从命令行输入两个路径, 实现文件拷贝

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值