io基本概念
- IO可以简单的理解成输入输出的意思。输入就是读,输出就是写。
- IO可以读写硬盘、光盘、内存、键盘、网络等资源上的数据。
- 1)程序需要数据:把数据流入到程序中—>输入.
2)程序需要保存数据,把数据传递给别人—>输出.
流
- IO中的流就相当于现实生活中的水流一样,一打开自来水的龙头开关,水就从一头流向另一头。可以理解成每个按顺序排列的水滴就是需要传输的字节。把有序数据理解成流,流负责传输数据,以便于输入输出。数据是流动的,是有方向的流动。
流的分类
- 按数据的走向可以分为:输入流,输出流。
- 按数据的单位可以分为:字节流、字符流。
- :根据功能的划分:节点流和包装流.
输入流与输出流
- 输入流:只能从中读取数据,而不能向其写入数据。一般用于将数据从网络、硬盘读取到内存中。
- 输出流:只能向其写入数据,而不能从中读取数据。一般用于将数据从内存中写入到网络、硬盘。
- 输入流主要由InputStream作为父类。InputStream:所有字节输入流的超类,向程序输入使用FileInputStream;
- 输出流主要由OutputStream作为父类。OutputStream:此为抽象类,所有输出字节流的超类,向文件中输出使用FileOutputStream类;
- 他们都是抽象的,因此无法直接创建对象。
字节流与字符流
- 字节流与字符流的用法几乎完全一样,区别在于所操作的单位不同,字节流操作8位的字节,
- 而字符流操作16位的字符。
字节流主要由InputStream和OutputStream作为父类。
字符流主要由Reader和Writer作为父类。
输入输出:
字节输入输出流:每次只操作一个字节(读取或写入),字节操作流,默认每次执行写入操作会直接把数据写入文件.
输出:
public class OutPutText02 {
public static void main(String[] args) throws IOException {
File f1=new File("d:/aa");
File f2=new File(f1,"a.txt");
f1.mkdirs();
f2.createNewFile();
//使用OutputStream输出流完成对文件的写入操作
OutputStream outputStream=new FileOutputStream(f2);//定义一个输出流。输出到f2文件中
//outputStream.write(97);//按照ASCII解析数字 写入文件中
byte[] bytes={97,98,99,100,101,102,103,104,105};
//outputStream.write(bytes);//按照ASCII解析数组 写入文件 写入的:abcdefg
outputStream.write(bytes,2,3);//从数组 指定索引的位置2 写入3个元素
}
}
输入:
public static void main(String[] args) throws IOException {
//输出流:把内容的内存输出到文件中(写操作) 输入流:把文件内容输入到内存中(读操作)
File f1 = new File("d:/a.txt");
//定义输入流来读取文件内容
InputStream inputStream = new FileInputStream(f1);
//使用缓冲区进行数据读取
// byte[] bytes=new byte[10];
// 一次最多读取数组长度个字节,读取的内容转换对应的数字存入byte数组中,返回的是实际读取的字节符
// int n=inputStream.read(bytes);
// System.out.println("读取的字节数:"+n);
// String s=new String(bytes);
// System.out.println(s);
//
// byte[] bytes1=new byte[10];
// int n1=inputStream.read(bytes1); 只剩下5个字节,实际读取了5个字节 数组后五个是默认值(无效数据)
// System.out.println("读取的字节数:"+n1);
// String s1=new String(bytes1);
// System.out.println(s1);
// byte[] buttef=new byte[10];
// while (true){
// int n=inputStream.read(buttef);
// if (n!=-1){
// String s=new String(buttef,0,n);
// System.out.println(s);
// }else {
//如果是-1表示读取到了文件末尾,结束循环
// break;
// }
// }
//推荐写法
byte[] buttef = new byte[10];
int n;
while ((n = inputStream.read(buttef)) != -1) {
String s = new String(buttef, 0, n);
System.out.println(s);
}
}
案例:
文件的复制
/*
文件复制
*/
public static void main(String[] args) throws IOException {
//1.定义源文件和目标文件的File对象
File f1 = new File("d:/a.txt");
File newFile = new File("D:/aa/newFile");
//2,定义输入输出流关联文件
InputStream inputStream = new FileInputStream(f1);
OutputStream outputStream = new FileOutputStream(newFile);
//使用输入流读取内容,然后把读取的内容写入目标文件中
//一个一个字节进行读写
// int n;
// while((n=inputStream.read())!=-1){
// outputStream.write(n);
// }
//使用缓冲区读写
long Start=System.currentTimeMillis();
byte[] bytes=new byte[1024];
int n;
while ((n=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,n);
}
Long stop=System.currentTimeMillis();
System.out.println("耗时:"+(stop-Start));
//使用io复制视频
}