缓冲流&内存流

缓冲字节流

缓冲区:计算机访问外部设备或文件,要比直接访问内存慢的多。如果我们每次调用read()方法或者writer()方法访问外部的设备或文件,CPU就要花上最多的时间是在等外部设备响应,而不是数据处理。为此,我们开辟一个内存缓冲区的内存区域,程序每次调read()方法或writer()方法都是读写在这个缓冲区中。当这个缓冲区被装满后,系统才将这个缓冲区的内容一次集中写到外部设备或读取进来给CPU。使用缓冲区可以有效的提高CPU的使用率,能提高整个计算机系统的效率。在字符流操作中,所有的字符都是在内存中形成的,在字符流输出前都将保存在内存中的缓冲区内。

缓冲流:再读写数据时,让数据在缓缓冲区能减少系统实际对原始数据来源的存取次数,因为一次能做多个数据单位的操作,相较而言,对于从文件读取数据或将数据写入文件,比起缓冲区的读写要慢多了。所以使用缓冲区的 流,一般都会比没有缓冲区的流效率更高,拥有缓冲区的流别称为缓冲流,包括BufferedInputStream、BufferedOutputStream类和BufferedReader、BufferedWriter类。缓冲流把数据从原始流成块读入或把数据积累到一个大数据块后再成批写出,通过减少通过资源的读写次数来加快程序的执行

缓冲字节输入流BufferedInputStream:

public class Demo01 {
	/*
	* 	BufferedInputStream(InputStream in,int size)
	* 	size: 指定缓冲区的大小,默认是8kb
	* */
	public static void main(String[] args)  {
		BufferedInputStream bis = null;
		try {
			// 1、真正去文件中读取字节数据的字节流
			FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\test.txt");
			// 2、创建缓冲流对象,并且规定缓冲区为4kb
			bis = new BufferedInputStream(fis,4*1024);
			// 3、通过缓冲流读数据
			byte [] bytes = new byte[1024];
			int len;
			while((len=bis.read(bytes))!=-1){
				System.out.println(len);
				System.out.println(new String(bytes,0,len));
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(bis!=null) {
				try {
					bis.close();// 4、释放资源, 关闭流
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

缓冲字节输出流BufferedOutputStream:

/*
* 	缓冲字节输出流
* 		BufferedOutputStream:
* 		1、BufferedOutputStream(OutputStream out)
* 		2、BufferedOutputStream(OutputStream out,int size)
*
* 	以stream结尾是字节流, 操作字节数组. 字节流的所有核心方法都被定义在了InputStream/OutputStream
* 	所以凡是涉及到字节流的输入/输出,代码基本上是一摸一样的。
*
* 	以reader/writer结尾是字符流, 操作字符数组
* */
public class Demo05 {
	public static void main(String[] args) {
		BufferedOutputStream bos = null;
		try {
			FileOutputStream fos = new FileOutputStream("C:\\Users\\GzhAnkh\\Desktop\\456.txt");
			bos = new BufferedOutputStream(fos);
			String s = "xxaaxa!";
			int len;
			byte [] data = s.getBytes(); // 通过"utf-8"编码将s字符串转为字节数组
			bos.write(data,0,data.length);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(bos!=null) {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

缓冲字符输入流BufferedReade:

/*
* 	字符缓冲流:
* 		BufferedReader(Reader reader)
* 		BufferedWriter(Writer writer)
* */
public class Demo06 {
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\test.txt");
			Reader reader = new InputStreamReader(fis);
			br = new BufferedReader(reader);

			char [] chars = new char[1024];
			int len;
			while((len=br.read(chars))!=-1){
				System.out.println(chars);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br!=null)
		// 会用到一个设计模式(写代码的套路): 装饰者模式
			{
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		/*
		*	可以写,但是没必要,因为BufferedReader的close方法底层会去调用下面的方法
		* 		reader.close();
		*		fis.close();
		* */
		}
	}
}
public class Demo07 {
    public static void main(String[] args) {
        /*
         * 	BufferedReader中有一个方法: readLine(), 一次读取一行
         * 	如果调用该方法返回为null,表示读完。
         *
         * 	注意: readLine()方法是在BufferedReader中定义的,所以
         * 	在声明类型时候要声明为BufferedReader而不是Reader
         *
         * 	凡是以Buffered开头的流,都有一个构造方法来指定缓冲区的大小,
         * 	默认缓冲区的大小是8KB.
         *
         * */
        BufferedReader br = null;
        try {
            FileInputStream fis = new FileInputStream("C:\\Users\\000\\Desktop\\test.txt");
            Reader reader = new InputStreamReader(fis);
            br = new BufferedReader(reader);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

字符缓冲输出流BufferedWriter:

public class Demo09 {
	public static void main(String[] args)  {
		BufferedWriter bw = null;
		try {
			FileWriter fw = new FileWriter("C:\\Users\\000\\Desktop\\789.txt");
			bw = new BufferedWriter(fw);
			bw.write("abcabcabc");
			/*
			* 	newLine(): 在文件中换行
			* */
			bw.newLine(); // 等价于bw.writer("\r\n")
			bw.write("徐卓韩也喜欢去");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bw.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
			if(bw!=null) {
				try {
					bw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

字符流,缓冲流实现文件复制:

public class Demo01 {
    public static void main(String[] args) {
        buffererReaderTest("C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code04.java",
                            "C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code03.java");
    }

    private static void buffererReaderTest(String s,String s1) {
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try {

            File file = new File(s);
            FileReader fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);

            File file1 = new File(s1);
            FileWriter fileWriter = new FileWriter(file1);
            bufferedWriter = new BufferedWriter(fileWriter);

            String lenght;
            while ((lenght = bufferedReader.readLine()) != null) {
                System.out.println(lenght);
                bufferedWriter.write(lenght+"\n");
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedWriter.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

内存流ByteArrayOutputStream、ByteArrayInputStream

public class Demo01 {
	public static void main(String[] args) throws Exception{
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte [] bytes = {1,2,3,4,5,6};
		baos.write(bytes);
		byte[] target = baos.toByteArray();
		for (byte b : target) {
			System.out.println(b);
		}
	}
}
posted @ 2021-07-24 09:38  GzhAnkh  阅读(182)  评论(0)    收藏  举报