-
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(),当车没装满时,是不会立即输出或读取的。