IO流 遨游在硬盘的数据时空里

  • java标准的IO

  • 可以让我们以相同的方法读写不同的设备。

  • IO将读和写分开

  • 输入:用来读取 输出:用来写出

  • java.io.InputStream

  • 所有字节输入流的超类,规定了读取字节的相关方法

  • java.io.OutputStream

  • 所有字节输出流的超类,规定了写出字节的相关方法

  • java将流划分为两大类:

  • 节点流:又称为低级流,是真实连接程序与数据的“管道”,负责实际读写数据。读写一定

  • 是建立在节点流的基础上进行的。

  • 处理流:又称为高级流,不能独立存在,必须连接在其他流上,目的是当数据流经当前流时

  • 可以对该数据做加工处理,简化我们读写时的操作。

  • 实际应用中,我们常会串联一组高级流并最终连接到低级流上,完成复杂的读写数据操作,

  • 这个过程称为流的连接,也是IO学习的精髓所在。

  • 文件流

  • java.io.FileOutputStream和FileInputStream

  • 它们是一对低级流,用于读写文件数据。功能与RAF一样。但是RAF是基于指针的随机

  • 读写形式,而文件流是基于IO的顺序读写形式。

  • IO的读写形式为顺序读写,即:读写操作只能顺序向后进行。是不可以回退的。

  • 常用构造器

  • FileOutputStream(File file)

  • FileOutputStream(String path)

  • 以上两种方式创建文件流时,为覆盖写操作。即:如果指定的文件已经存在,

  • 那么文件流会将该文件原有数据清除。再将通过该流写入的内容保存到文件中。

  • FileOutputStream(File file,boolean append)

  • FileOutputStream(String path,boolean append)

  • 重载的构造方法允许我们再传入一个boolean型参数,如果该值为true,则

  • 当前文件输出流为追加模式,即:文件原数据保留,通过当前流写入的内容会被

  • 追加到文件中。

public class FOSDemo {

	public static void main(String[] args) throws IOException {
		//使用文件输出流向文件中写入数据
		/*
		 * 常用构造器
		 * FileOutputStream(File file)
		 * FileOutputStream(String path)
		 * 以上两种方式创建文件流时,为覆盖写操作。即:如果指定的文件已经存在,
		 * 那么文件流会将该文件原有数据清除。再将通过该流写入的内容保存到文件中。
		 * 
		 * FileOutputStream(File file,boolean append)
		 * FileOutputStream(String path,boolean append)
		 * 重载的构造方法允许我们再传入一个boolean型参数,如果该值为true,则
		 * 当前文件输出流为追加模式,即:文件原数据保留,通过当前流写入的内容会被
		 * 追加到文件中。
		 */
		FileOutputStream fos = new FileOutputStream("fos.txt",true);
		
		fos.write("嘿".getBytes("GBK"));
		
		String str = "奥利给!";
		byte[]data=str.getBytes("GBK");
		fos.write(data);
		
		fos.write("卧槽~".getBytes("GBK"));
		
		System.out.println("写出完毕");
		fos.close();

	}

}
  • 使用缓冲流提高读写效率
  • java.io.BufferedInputStream和java.io.BufferedOutputStream
  • 缓冲流是一对高级流,作用是加快读写效率。内部有一个缓冲区(默认为8k的字节数组)
  • 将我们的读写操作(无论是单字节,还是块读写)最终都统一转换为块读写操作以提高效率。
public class CopyDemo2 {
	
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("Arctic Monkeys - Dancing Shoes.mp3");
		BufferedInputStream bis = new BufferedInputStream(fis);
		FileOutputStream fos = new FileOutputStream("Arctic Monkeys_cp - Dancing Shoes.mp3");
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		
		int d=0;
		long start = System.currentTimeMillis();
		while ((d=bis.read())!=-1) {
			bos.write(d);
		}
		long end = System.currentTimeMillis();
		System.out.println(String.format("复制完毕,用时%d ms",end-start));  //单字节46008 ms   加了缓冲流以后 228 ms
		
		bis.close();
		bos.close();
	}

}

关于缓冲流有一点要特别注意,就是不.close()或者不.flush(),当车没装满时,是不会立即输出或读取的。

原创文章 46 获赞 7 访问量 2088

猜你喜欢

转载自blog.csdn.net/EdwardWH/article/details/105065158