关于java流的一点看法
今天学习java的时候用到了流,说白了就是往文件里写东西。
之前一直不是很清楚什么InputStream,InputStreamReader,BufferedReader之类的,今天就稍微根据书上的内容整理了一些。
要想实现一个从文件写入或读取的操作,首先建立一个流,代码如下:
BufferedReader reader = new BufferedReader(new FileReader(new file("path")));
BufferedWriter writer = new BufferedWriter(new FileWriter(new file("path")));
之前一直迷糊的就是他为什么需要这么多次的链接,直接用一个不就好了吗,原来这里面还是有说法的。
首先说new file(),这个生成出来的对象只是对应本地文件的一个表示,你可以获得这个文件或者目录(file可以生成目录)本身的信息,但是不能获得他里面的内容,也就是说我们还需要一个类来处理他里面的内容,这时我们用到了FileReader。
FileReader可以通过接收一个file来生成对象,这时候我们就可以获得file的内容了,那么就奇怪了,既然我们都可以对文件内容进行读取或写入了,那BufferedReader和BufferedWriter又是干什么的呢,这里书上的一个例子就很形象:写入文件就好像我们去超市购物,如果我们只有FileWriter,我们就好像空手去购物一样,一次只能拿一样东西,然后就得去付钱,这样很不方便,不高效,如果我们有了BufferedWriter,就好像我们有了一个购物车,我们就可以先把想买的东西放在购物车中一起支付,这样就便捷多了。
BufferedWriter有一个缓冲区,可以暂存一些数据,等到存满的时候一并写入到硬盘上,可以减少对硬盘操作的次数,如果你想要强制写入硬盘的话,只要使用writer.flush()函数就可以了。
这次就用到了这几个方法,等到以后再用到其他方法的时候再详细讨论。
PS:补充几个上述类的构造方法
File的构造方法:
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
File(String pathname)
通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。 |
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
File(URI uri)
通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。 |
FileReader的构造方法:
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。 |
FileReader(FileDescriptor fd)
在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。 |
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。 |
FileWriter的构造方法
FileWriter(File file) 在给出 File 对象的情况下构造一个 FileWriter 对象。 |
FileWriter(File file,
boolean append) 在给出 File 对象的情况下构造一个 FileWriter 对象。 |
FileWriter(FileDescriptor fd)
构造与某个文件描述符相关联的 FileWriter 对象。 |
FileWriter(String fileName)
在给出文件名的情况下构造一个 FileWriter 对象。 |
FileWriter(String fileName,
boolean append) 在给出文件名的情况下构造 FileWriter 对象,它具有指示是否挂起写入数据的 boolean 值。 |
BufferedReader的构造方法
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 |
BufferedReader(Reader in,
int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 |
BufferedWriter的构造方法
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。 |
BufferedWriter(Writer out,
int sz) 创建一个使用指定大小输出缓冲区的新缓冲字符输出流。 |