我们知道,程序与磁盘的交互相对于内存运算是很慢的,容易成为程序的性能瓶颈。减少程序与磁盘的交互,
- 是提升程序效率一种有效手段。缓冲流,就应用这种思路:普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,
- 缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,
- 减少了交互次数。 字节流是程序直接和磁盘交互,没用用到缓冲流,效率低下。
- 但是字节流可以读取任何文件,字符流只能读取纯文本内容的数据
- 字节流是数据通过字节的方式以通道进行传输,先进先出。必须有输入和输出两个动作完成,一个读取,一个写入。两个方法实现。
public class FileInputStreamTest { public static void main(String[] args) throws IOException { File file = new File("D:\\Test.txt"); write(file); String read = read(file); System.out.println(read); } /** * 使用的是字节输出流FileOutputStream 字节流没有用到缓冲流,效率低 * 写入txt文件中,输出流 * @param file */ public static void write(File file) throws IOException { FileOutputStream fos = new FileOutputStream(file); String s = "松下问童子,言师采药去。只在此山中,云深不知处."; System.out.println(s.getBytes()); fos.write(s.getBytes()); fos.close(); } /** * 使用的字节输入流FileInputStream 字节流没有用到缓冲流,效率低 * 读取txt文件中,输入流 * @param file * @throws IOException */ public static String read(File file) throws IOException { FileInputStream fis = new FileInputStream(file); //先定义读取的字节存放到该字节数组下容量为1024,可以存储1024个字节为1KB byte[] bytes = new byte[1024]; //将存储到字节数组的内容拿出来存到String1Bulider中 StringBuilder stringBuilder = new StringBuilder(); //计算一下循环次数 int i =0; /** * 从该输入流读取最多len字节的数据为字节数组。 如果len不为零,该方法将阻塞,直到某些输入可用; 否则,不会读取字节,并返回0 。 * 重写: * read在类 InputStream * 参数 * b - 读取数据的缓冲区。 * off - 目标数组 b的起始偏移量 * len - 读取的最大字节数。 * 结果:读取到缓冲区的总字节数,如果没有更多的数据,因为文件的结尾已经到达, -1 。 * * UTF-8编码中,一个中文字符是3个字节 * 如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。为了更方便地处理中文这些字符,Java就推出了字符流。 */ while((fis.read(bytes, 0, 3))!= -1){ i++; //bytes数组一直被覆盖 System.out.println("byte数组长度一直为"+bytes[4]); /** * bytes - 要解码为字符的字节 * offset - 要解码的第一个字节的索引 * length - 要解码的字节数 */ stringBuilder.append(new String(bytes,0,3)); } System.out.println("20个汉字有60个字节,每次读取三个字节总共循环了"+i+"次"); fis.close(); return stringBuilder.toString(); } }