Java拾贝第十一天——IO流之字符流
Java拾贝不建议作为0基础学习,都是本人想到什么写什么
字符流
字符流是专门针对字符的IO。在字符流中:
输出流主要使用Writer类,输入流主要使用Reader类
字符输出流
Writer类定义如下:
public abstract class Writer implements Appendable, Closeable, Flushable
也是一个抽象类,想要操作文件需要使用其子类FileWriter。FileWriter构造方法如下:
public FileWriter(File file) throws IOException
public FileWriter(String fileName, boolean append) throws IOException
与FileOutputStream相同的,末尾追加内容需要使用第二个有参构造并传入布尔值。
FileWriter类常用方法如下:
方法 | 类型 | 描述 |
---|---|---|
public void close() throws IOException | 普通方法 | 关闭流 |
public void write(String str) throws IOException | 普通方法 | 输出字符 |
public void write(char cbuf[]) throws IOException | 普通方法 | 输出字符数组 |
public void flush() throws IOException | 普通方法 | 刷新缓冲区 |
write(String str)
D:\IOtest\text.txt内:
//空
栗子:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
try {
FileWriter writer = new FileWriter(file);
writer.write("Hello world!");
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
程序运行后,D:\IOtest\text.txt内:
Hello world!
与OutputStream操作流程没有什么太大区别,唯一好处就是可以直接输出字符串。不用转为byte数组之后再输出。
flush()
这里是与OutputStream最大的不同之处。依旧是上述栗子,但这次不关闭流。
D:\IOtest\text.txt内:
Hello world!
栗子:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
try {
FileWriter writer = new FileWriter(file,true);//追加输出
writer.write("Hello world!");
//注意这里没有关闭流
} catch (Exception e) {
e.printStackTrace();
}
}
程序运行后,D:\IOtest\text.txt内:
Hello world!
从结果上看,文件内并没有成功追加内容,这是因为字符流操作时使用了缓冲区。
而在关闭字符流时会强制刷新缓冲区,如果没有关闭流,则缓冲区的内容会直接丢失。
建议字符流手动调用flush()方法,人为地刷新缓冲区。
至此,修改栗子如下:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
try {
FileWriter writer = new FileWriter(file, true);
writer.write("Hello world!");
writer.flush();//人为地刷新缓冲区
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
D:\IOtest\text.txt内:
Hello world!Hello world!
为什么有缓冲区?
:缓冲区可以理解为一段内存,因为读取内存的速度比较快,所以这么做可以提升性能。
字符输入流
Reader类定义如下:
public abstract class Reader implements Readable, Closeable
又双叒叕是抽象类。FileReader构造方法如下:
public FileReader(File file) throws FileNotFoundException
FileReader类常用方法如下:
方法 | 类型 | 描述 |
---|---|---|
public void close() throws IOException | 普通方法 | 关闭流 |
public int read() throws IOException | 普通方法 | 读取一个字符 |
public int read(char cbuf[]) throws IOException | 普通方法 | 将内容读取到字符数组中,返回读取的长度 |
public int read(char cbuf[]) throws IOException
将内容读取到字符数组,返回读取的长度。
D:\IOtest\text.txt内:
任意的字符askdjsa123124@!#**!@¥
asdasfs sdafasdfjsadjfsdahgio12312
124124 124123123人riufisdf
123214 !!@#FDSAFSDAGSDG
23
1241武器的飒!
栗子:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
try {
FileReader reader = new FileReader(file);
char[] chars = new char[1024];
int i;
while ( (i=reader.read(chars)) != -1 ){
System.out.println(new String(chars,0,temp));
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
程序运行结果:
任意的字符askdjsa123124@!#**!@¥
asdasfs sdafasdfjsadjfsdahgio12312
124124 124123123人riufisdf
123214 !!@#FDSAFSDAGSDG
23
1241武器的飒!
使用字符流好还是字节流好?
在硬盘或传输时都是以字节的形式进行读写,包括图片和音频等。
而字符流只有内存中才会形成。(存疑,我在Java开发实战经典读到的这句话)
在开发中,字节流使用较为广泛。