day20文字笔记
正课内容:
1、IO输入与输出
java按照输入与输出方向划分两个操作:读和写
输入是用来读取的,是从外界输入到程序中的方向,输出是用来写的
java将输入与输出比喻为“流stream”,即:向同一侧顺序移动的过程
并且定义了两个超类:java.io.InputStream:输入流
里面规定了所有字节输入流的读取方法。将来实际读取不同设备的输入流都继承自它,因此都会有
这里定义的读取操作,使得程序员可以用相同的读取方式读取不同的设备。
java.io.OutputStream:输出流,所有字节的输出流都继承自它,里面定义了写出字节的方法
文件流:java.io.FileInputStream和FileOutStream
它们都继承自InputStream和OutStream.用来连接文件,进行读写文件数据的流
1)输出流的两种构造方法
public static void main(String[] args) throws IOException {
/** 文件输出流提供了两种构造方法:
需要注释,如果指定的文件不存在会自动将其创建出来,前提是该文件所在的目录必须存在!
向当前的目录下的fos.dat文件中写入数据
File file = new file("./fos.dat");
FileOutputStream fos = new FileOutStream(file);
*/
FileOutputStream fos = new FileOutputStream("./fos.dat");
/*
void write(int d)
写入一个字节,将给定的int的值对应为二进制的“低八位”写入文件
00000000 00000000 00000000 00000001
*/
fos.write(1);
fos.write(256);
System.out.println("写出完毕!");
fos.close();
}
2)文件输入流的构造方法
/** 文件输入流 */
public class FISDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(“fos.dat”);
int d = fis.read();
System.out.println(d);
d = fis.read();
System.out.println(d);
d = fis.read();
System.out.println(d);
System.out.println(“读取完毕!”);
fis.close();
3)文件复制
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(“法拉第.jpg”);
FileOutputStream fos = new FileOutputStream(“法拉第_cp.jpg”);
int d ;
long start = System.currentTimeMillis();
while ((d = fis.read())!=-1){
fos.write(d);
}
long end = System.currentTimeMillis();
System.out.println(“复制完毕!已耗时:”+(end-start)+“ms”);
fis.close();
fos.close();
}
4)块读写方式
提高每次读写的数据量,减少读写的次数,可以提高读写效率
单字节读写是一种随机读写的形式
一组字节的读写是块读写形式
对于机械硬盘和很多其他硬件而言,块读写的效率很好,但是随机读写的性能差
/
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
/* */
FileInputStream fis = new FileInputStream(“演示文稿1.pptx”);
FileOutputStream fos = new FileOutputStream(“演示文稿1_cp.pptx”);
byte[] data = new byte[1024*10];
int len;
long start = System.currentTimeMillis();
while((len = fis.read(data))!=-1){
fos.write(data,0,len);
}
long end = System.currentTimeMillis();
System.out.println("复制结束!耗时:"+(end-start)+"ms");
fis.close();
fos.close();
}
4)向文件写入文本数据
public static void main(String[] args) throws IOException {
//向文件中写入字符串
/** 文件流有两种模式:FileOutputStream(String path)
FileOutputStream(File file)
以上两种方式创建流时,若指定的文件存在则会将该文件原数据全部清除
FileOutputStream(String path,boolean append)
FileOutputStream(File file,boolean append)
如果创建时指定第二个参数且为true时,文件输出流为追加模式,即:若指定的文件存在,则数据保留
新写入的数据都会继续向文件中追加
*/
//FileOutputStream fos = new FileOutputStream("fos.txt");
FileOutputStream fos = new FileOutputStream("fos.txt",true);
//String line = "吃个桃桃好凉凉";
String line = "呵呵哒";
//将字符串按照UTF-8编码转换为一组字节
byte[] data = line.getBytes(StandardCharsets.UTF_8);
fos.write(data);
System.out.println("写出完毕!");
fos.close();
}
5)节点流和处理流
Java将流分为两类:
节点流和处理流
节点流也称为低级流,是真实连接程序与另一端的管道,读写一定是建立在节点流的基础上进行的,
比如文件流其实就是节点流
处理流也称为高级流,是不能独立存在的,必须连接在其他流上,目的是当数据流经它时对数据进行某些加工
处理,简化我们的同等操作
实际开发中我们经常会串联一组高级流并最终连接到低级流上,使得读写数据以流水线加工处理来完成。这个操作称为
”流的连接“
5.1)缓冲流
java.io.BufferedInputStream和BufferedOutputStream
缓冲流是一对高级流,作用是加快读写效率
案例:
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("视频.mp4");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("视频_cp.mp4");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int d;
long start = System.currentTimeMillis();
while ((d = fis.read())!=-1){
fos.write(d);
}
long end = System.currentTimeMillis();
System.out.println("复制完毕!耗时:"+(end-start)+"ms");
bis.close();
bos.close();
}
5.2)字节缓冲流
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("bos.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
String line = "让我再看你一遍,从南到北";
byte[] data = line.getBytes(StandardCharsets.UTF_8);
bos.write(data);
bos.flush();
System.out.println("写出完毕!");
bos.close();
}