IO(Input Output)流
What is IO流?
用来处理设备(内存、硬盘)之间的数据;
Java对数据的操作通过流的方式;
java用于操作流的对象都在IO包中;
数据流
- 流按操作数据分为:1.字节流,2.字符流;
早期IO包出现的都是字节流,
其中一些文本数据是比较常见的,为了方便处理它,单独分列出来字符流。
好处:可以在内部融合编码表。 - 流按流向分为:1.输入流,2.输出流;
IO流常用基类(抽象):
- 字符流:
InputStream,OutputStream - 字节流:
Reader,Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。前缀名是该流对象的功能。
字符流:
字符流的特点:
IO流用于操作数据,那么数据的最常见体现形式为:文件
以操作文件为主来演示:
- 现在需要在键盘上创建一个文件并写入一些文字数据。
- 明确数据要存放的目的地。
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args){
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。
FileWriter fw = new FileWriter("demo.txt");
}
}
运行一下,会看到异常!
原因:因为很有可能目标路径不存在。
所以要不抛出,要不就用try。
以抛出为例:
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("demo.txt");
}
}
抛出异常后,该文件会被创建到指定目录下,并且如果该目录下已有同名文件,将会被覆盖。
- 调用write方法,将字符串写入到流中。
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("demo.txt");
fw.write("abcde");
}
}
运行一下,发现数据并没有写入txt文档,那写到了哪里呢?
它没有直接写到目的地里,而是写到了内存(流)中。
那要怎样才能让它存到目的地中去呢?
- 调用flush()方法,刷新流对象中的缓冲的数据,将数据刷到目的地中。
即:
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("demo.txt");
fw.write("abcde");
fw.flush();
}
}
此时,重新编译运行,就能看到txt文件中有我们写入的数据。
流一直存在,可以继续将数据写入到文件
- 调用close()方法,关闭此流,但是关闭之前会刷新一次内部的缓冲中的数据。
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("demo.txt");
fw.write("abcde");
fw.close();
}
}
此时运行结果与上面是一致的,但是:
如果我们还想再次输入数据,则会提示:流已关闭。
这就是flush和close的区别。
其实,java是不能往文件内部写数据的,而是依靠系统内部完成数据的书写来完成。
所以java会调用系统中的内容来完成数据的建立。这些方式的调用都是在使用Windows的资源,所以使用完后要释放出来,那么,close()一定要做。