JavaIO之输入输出流
这里是Java系列文章,主要介绍有Java的使用及Java相关的,如Java语言本身以及Java等级考试
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程
因此,为了更好的使用Java,加油学习吧!
关于作者:
· 小白(Libra),计算机兴趣爱好者,Java,python,C,Hadoop
· Email:717560136@qq.com
· GitHub:https://github.com/Regel-zack
转载请注明出处
前言
不管是何种语言,IO操作都会是其关键的一环,Java的IO操作也是如此,这一次我们来学习Java的输入输出流。
字节输出流
package Demo04;
import java.io.*;
public class IODemo05 {
public static void main(String[] args) throws IOException{
File f = new File("C:\\Users\\别欺负小白了好咩\\Desktop\\Libra_diary.txt");
OutputStream out = new FileOutputStream(f,true); // 实例化文件输出流对象,这里需要传入一个File类对象,true参数是为了让其能够在文件末尾追加而不是覆盖掉
String str = "\r\nThis is Libra's diary."; // 要写的字符串内容
byte b[] = str.getBytes(); // 因为OutputStream只能输出byte数组,所以这里用字符串自带的方法转型
out.write(b); // 开始输出
out.close(); // 关闭流,节省内存,回收空间
}
}
/*
1.字节输出流可以如实例所示输出内容
2.一般来讲我们的IO流程是,打开一个文件,指定输出位置,开始读/写操作,关闭,结束
3.以上实例如果我们将实例化文件输出流对象的true参数缺省的话,运行多次会发现,只写了一句话,这是因为输出位置一直都是最开始,也就是重复执行会覆盖掉先前的内容,所以我们需要添加上true,但具体看需求而定
4.这个代码内没有使用try catch 是因为之前就有throws关键字抛出异常,如果不写的话,我们需要写一定数量的try catch语句
5.OutputStream 实现了两个接口,分别是Closeable和flushable,具体可以查阅官方文档了解
*/
字符输出流
package Demo04;
import java.io.*;
public class IODemo06 {
public static void main(String[] args) throws IOException{
File f = new File("C:\\Users\\别欺负小白了好咩\\Desktop\\Libra_diary.txt");
Writer out = new FileWriter(f,true); // 实例化字符输出流对象
Reader reader = new FileReader(f); // 实例化字符输入流对象
String str = "\r\nThis is Libra's diary."; // 要写的字符串内容
int len = 0;
char c[] = new char[1024];
int temp = 0;
while((temp = reader.read()) != -1){
c[len] = (char)temp;
len++;
}
out.write(str); // 开始输出
out.close(); // 关闭流,节省内存,回收空间
reader.close(); // 关闭流
System.out.println("文件内容为:" + new String(c,0,len)); // 输出文件内容,这样验证就不用打开文件,只需要查看控制台即可
}
}
/*
1.字符输出流可以如实例所示输出内容,字符输入流也是如此
2.不用转成byte数组是因为这个输出流本身就是字符输出流,不需要转型
3.在Writer类中,除了与FileOutputStream一样实现了Closeable和Flushable两个接口以外,还多实现了一个Appendable接口,具体可参照文档了解
4.因为read()这个方法如果读到结尾会返回-1,那么只需要判断是否读到-1就可以知道其读到结尾没有,循环读取好处是在事先不知道文件大小的情况下读取
5.如果需要用到其他方法或者事先知道文件大小或者是用f.length()该方法来获取了文件大小,可以使用直接读取的方法
4.其余与上节基本一致,不再赘述
*/
小结
在学习了字节流和字符流之后,我们会发现,两者使用起来很像,差别不大,那么,我们在开发中,应该使用哪一种呢?
有人会说,要使用字符流,因为字符流在输出的时候,不需要转成byte数组,会节省内存空间
但这个时候,要知道的是,我们应该更加首选字节流,是因为字节流是直接操作文件本身,而字符流则是会先将内容推到缓冲区,通过缓冲区再操作文件
为什么这么说呢,我们看代码
File f = new File(“C:\Users\别欺负小白了好咩\Desktop\Libra_diary.txt”);
OutputStream out = new FileOutputStream(f);
String str = “This is Libra’s diary.”;
byte b[] = str.getBytes();
out.write(b);
这里没有关闭输出流
//out.close();
当我们执行完代码后,查看文件会发现文件内有写入
而字符流不关闭输出流则没有
其在没关闭输出流的时候,内容在缓冲区,只有当关闭以后,才会强制推送缓冲区的内容到文件中
如果想要在不关闭输出流的情况下,推送缓冲区的内容的话,就需要用到flush()了,这个方法可以强制推送缓冲区里的内容,具体的可以自己动手试验一下
最后
我是Libra,一位一直追求平等公正的学习者