一、什么是IO流?
I:Input O:Output
通过IO可以完成对硬盘文件的读和写,Java中使用流的概念来加快I/O操作的速度。
java.io软件包包含输入和输出操作所需的所有类。
二、什么是流?
Stream是数据序列。在Java中,流由字节组成。之所以称其为流,是因为它就像不断流动的水流一样。
三、IO流的分类?
输入流、输出流、字节流、字符流
在java中只要“类名”以Stream结尾的都是字节流。以“Read/Writer”结尾的都是字符流。
(1)按照流的方向分类,以内存作为作为参照物。
往内存中去,叫做输入(Input/Read)
从内存出来,叫做(Output/Write)
(2)按照字节的方式读取数据,一次读取一个字节,可以读取任何类型的文件,包括:文本、图片、音频、视频。
(3)按照字符的方式读取数据,一次读取一个字符,只能读取纯文本文件,不能读取除文本文件之外的文件。
四、常用的IO流
1、FileInputStream
2、FileOutputStream
1、FileInputStream
在java.io包下,继承于java.io.InputStream,因为所有的流都在java.io.*包下,所以通过查看API文档直接创建文件输入流对象。创建对象的时候需要进行对异常的捕捉。
FileInputStream fis = new FileInputStream("D:/Users/cwy/Desktop/JAVA/流/temp.txt");
对异常进行捕捉如下:
FileInputStream fis = null;
try {
// 创建文件字节输入流对象
fis = new FileInputStream("D:/Users/cwy/Desktop/JAVA/流/temp.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) { // 避免空指针异常!
// 关闭流的前提的是:流不是空。流是null的时候没有必要关闭。
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
读取文件内容:一次读取一个字节,内存和硬盘的交互太过频繁,不利于资源的利用。
// 开始读
int readData = fis.read(); // 这个方法的返回值是:读取到的“字节”本身。
System.out.println(readData); // 97
改进:如果等于-1表示读到文件的末尾了,已经读不到任何数据了;则循环终止。
int readData = 0;
while((readData = fis.read()) != -1){
System.out.println(readData);
}
为了较少内存与硬盘的交互,采用byte数组的方式,一次读取多个字节(<=数组.length)。
这里调用了String类的构造方法:
构造方法参数:
将读取的数据存入byte数组转化成字符串
int readCount = 0;
while((readCount = fis.read(bytes)) != -1){
System.out.print(new String(bytes,0,readCount));
}
1.1FileInputStream的方法
文件内容如下:
调用available()方法
System.out.println("总字节数量:" + fis.available()); // 6
int readByte = fis.read();
System.out.println("剩下多少个字节没有读:" + fis.available()); // 5
结果:
调用skip()方法
fis.skip(3);
System.out.println(fis.read());
返回结果是字符对应的ASCII码
2、FileOutputStream
构造方法:
FileOutputStream fos = new FileOutputStream("D:/Users/cwy/Desktop/JAVA/流/HelloWorld.txt",true);
// 以追加的方式在文件末尾写入。不会清空原文件内容。
向文件中写数据的方法:
准备文件(空):
写的第一种方式:
//字符串
String s = "我是一个程序员";
// 将字符串转换成byte数组。
byte[] bytes1 = s.getBytes();
// 写
fos.write(bytes1);
成功写入:
写的第二种方式:
// 开始写
byte[] bytes = {97,98,99,100};
// 将byte数组全部写出!
fos.write(bytes);
fos.write(bytes,0,2);
// 写完之后,最后一定要刷新
fos.flush();
追加写入成功: