黑马程序员--IO输入与输出(二)

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

1.字节流

    字节流的抽象基类

      InputStream:字节输入流

      OutputStream:字节输出流

/*
 * 字节输入流读取数据:
 * 方式1:一次读取一个字节
 * 方式2:一次读取一个字节数组
 */
public class FileInputStreamDemo {
	public static void main(String[] args) throws IOException {
		// 创建字节输入流对象
		FileInputStream fis = new FileInputStream("fos.txt");
		// 读取数据
		/* 方式1
		 int by = 0;
		 while ((by = fis.read()) != -1) {
		 System.out.print((char) by);
		 }
		*/
		// 方式2
		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = fis.read(bys)) != -1) {
			System.out.print(new String(bys, 0, len));
		}
		// 释放资源
		fis.close();
	}
}

用字节流复制图片文件

/*
 * 需求:把d盘目录下mn.jpg复制到e盘目录下copy.jpg
 * 思路:
 * 数据源:
 * 		d:\\mn.jpg -- 字节流 -- 读取数据 -- InputStream -- FileInputStream
 * 目的地:
 * 		e:\\copy.jpg -- 字节流 -- 写入数据 -- OutputStream -- FileOutputStream
 */
public class CopyIMG {
	public static void main(String[] args) throws IOException {
		// 封装数据源
		FileInputStream fis = new FileInputStream("d:\\mn.jpg");
		// 封装目的地
		FileOutputStream fos = new FileOutputStream("e:\\copy.jpg");
		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = fis.read(bys)) != -1) {
			fos.write(bys, 0, len);
			fos.flush();
		}
		// 释放资源
		fos.close();
		fis.close();
	}
}

    字节流-缓冲区作用是提高了字节流的读写效率

复制MP3文件

public class CopyMP3 {
	public static void main(String[] args) throws IOException {
		long start = System.currentTimeMillis();
		method();
		long end = System.currentTimeMillis();
		System.out.println("时间为:" + (end - start) + "毫秒");
	}
	// 高效的一次读写一个字节
	private static void method() throws IOException {
		// 封装数据源
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				"d:\\a.mp3"));
		// 封装目的地
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream("b.mp3"));
		// 基本读写
		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = bis.read(bys)) != -1) {
			bos.write(bys, 0, len);
			
		}
		// 释放资源
		bos.close();
		bis.close();
	}
}

2.标准输入输出流

    System类中的字段:in,out,它们各代表了系统标准的输入和输出设备

    默认输入设备是键盘,输出设备是显示器

    System.in的类型是InputStream,System.out的类型是PrintStream,它是OutputStream系列的子类

/*
 * 需求:键盘录入数据,写入到文本文件当录入的数据是over时,结束打印程序
 * 数据源:
 * 		键盘录入数据 -- Scanner -- readLine()
 * 目的地:
 * 		文本文件 -- 写入数据 -- 字符流 -- 高效 -- BuffereWriter 
 */
public class SystemInDemo {
	public static void main(String[] args) throws IOException {
		// 键盘录入数据
		Scanner sc = new Scanner(System.in);
		// 封装目的地
		BufferedWriter bw = new BufferedWriter(new FileWriter("sc.txt"));
		// 读写操作
		String line = null;
		while ((line = sc.nextLine()) != null) {
			// 自定义结束标记
			if ("over".equals(line)) {
				break;
			}
			bw.write(line);
			bw.newLine();
			bw.flush();
		}

		// 释放资源
		bw.close();
		sc.close();
	}
}

3.转换流

    转换流包括:InputStreamReader和OutputStreamWriter

    转换流的作用:是字节流和字符流的桥梁;方便了字节流和字符流之间的操作

    转换流的应用:字节流中的数据都是字符时,转成字符流操作更高效

IO流复制文件的操作规律

(1)文本文件 -- 文本文件

    BufferedReader br = new BufferedReader(new FileReader("a.txt"));

    BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));

(2)文本文件 -- 控制台输出

    BufferedReader br = new BufferedReader(new FileReader("a.txt"));

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

(3)键盘录入 -- 文本文件

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));

(4)键盘录入 -- 控制台输出

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


使用IO时应先分清一下几点:

    A:搞清楚数据源和目的地都可以用哪些对象操作

      数据源:

        InputStream

        Reader

     目的地:

        OutputStream

        Writer

    B:分清楚数据源和目的地是什么类型的文件?

      数据源:文本文件?

         是:Reader

         不是:InputStream

     目的地:文本文件?

         是:Writer

         不是:OutputStream

    C:搞清楚数据源和目的地的设备

       数据源:

        文件   FileReader

        键盘录入  InputStream is = System.in;

                  使用转换流nputStreamReader isr = new InputStreamReader(is);

       目的地:

         文件  FileWriter

         控制台输出  OutputStream os = System.out;

                     使用转换流OutputStreamWriter osw = new OutputStreamWriter(os);

    D:是否要求高效

       是:使用Buffered流对象

       否:不使用Buffered流对象

学习感悟

    对于字节流的操作,与字符流类似.一般操作中应先考虑以下几点:明确数据源和数据目的地,明确数据的内容是否是纯文本,明确具体设备,明确是否需要提高效率.通过这几点明确自己在编码的过程中该使用哪种流.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值