字符流概述
在IO开发过程中,我们传输最频繁的数据为字符,而以字节方式传输字符需要每次将字符串转换成字节再处理,而且也丧失了程序员对数据内容的判断(因为程序员只认识字符,不认识字节)。
所以,为了让程序员方便对字符进行操作,Java提供了专门以字符作为操作单位的类——字符流,其底层仍然为字节流。
显然,字符流只能操作字符,无法操作其他数据,如声音、视频等。
字符输出流
输出流:
Writer(抽象类)
FileWriter(基本字符输出流)
构造方法:
public FileWriter(String fileName) 创建覆盖写出对象
public FileWriter(File file,boolean append) 创建指定是否追加写出对象
其他方法:
write(int n):输出一个字符(使用int替代了char)
write(char[] c):输出一个字符数组
write(char[] c , int off , int len):输出字符数组的一部分
write(String s):输出一个字符串
write(String s , int off , int len):输出字符串的一部分
flush():刷新缓冲区,将内容写出到指定IO资源
close():由于每个IO流都需要绑定一个IO资源,在使用时,需要回收资源。而字符流输出流在关闭时,会先调用flush方法。
package com.IO;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author :Andy
* @date :Created in 2019/6/16 22:06
* @description:基本字符输出流
*/
public class WriterDemo {
public static void main(String[] args) throws IOException {
//创建流对象
FileWriter fw = new FileWriter("D:/test.txt");
//写出数据
fw.write('a');
char[] arr = {'我','爱','J','A','V','A',};
fw.write(arr);
fw.write(arr,2,4);
fw.write("我爱Java!");
//省略刷新,直接用关闭资源刷新
fw.close();
}
}
字符输入流
输入流:
Reader(抽象类)
FileReader(基本字符输入流)
构造方法:需要绑定IO资源
public FileReader(String name)
其他方法:
读取时,返回数据时,使用int替代了char
int read():读取一个字符;
int read(char[] c):读取一个字符数组;
close():由于每个IO流都需要绑定一个IO资源,在使用时,需要回收资源。
package com.IO;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* @author :Andy
* @date :Created in 2019/6/16 22:32
* @description:读取一个字符
*/
public class ReaderDemo {
public static void main(String[] args) throws IOException {
//一次读取一个字符
FileReader fr = new FileReader("D:/test.txt");
//定义变量,记录每次读取到的字符
int c=-1;
while((c=fr.read())!=-1){
System.out.println((char) c);
}
fr.close();
System.out.println("===========================");
//一次读取一个字符数组
FileReader fr2 = new FileReader("D:/test.txt");
char[] arr = new char[1024];
int len = -1;
while((len=fr2.read(arr))!=-1){
//字符数组比较特殊,直接打印引用变量,不是打印的地址,而是内容
System.out.println(arr);
String s = new String(arr,0,len);
System.out.println("开始"+s+"1");
}
fr2.close();
}
}
高效字符流基本使用
Java在常规IO流的基础上,提供了更为高效的缓冲流,如下:
高效字符流:BufferedReader/BufferedWriter
: 需求:
利用高效字符流完成以下操作
1.向当前工程下的test.txt中写入"i miss u,i want u,i with u"
2.读取当前工程下的test.txt文件中的内容
3.将读取到的内容打印到控制台上
package com.IO;
import java.io.*;
/**
* @author :Andy
* @date :Created in 2019/6/17 8:29
* @description:高效字符输出流和输入流
*/
public class BufferedWriterReaderDemo {
public static void main(String[] args) throws IOException {
//创建普通流对象
FileWriter fw = new FileWriter("D:/test.txt");
//创建高校流对象
BufferedWriter bw = new BufferedWriter(fw);
String s = "i miss u,i want u,i with u";
bw.write(s);
//刷新数据
bw.flush();
//关闭高校流对象
bw.close();
//创建普通对象流
FileReader fr = new FileReader("D:/test.txt");
//创建高校对象流
BufferedReader br = new BufferedReader(fr);
char[] chars = new char[1024];
int len = br.read(chars);
String result = new String(chars,0,len);
System.out.println(result);
br.close();
}
}
高效字符输出流的特殊方法
void newLine(): 根据当前的系统,写入一个换行符,
在windows系统下调用该方法,写入的是\r\n
在mac系统下调用该方法写入的是\r
在linux系统下调用该方法写入的是\n
package com.IO;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author :Andy
* @date :Created in 2019/6/17 19:41
* @description:高效字符输出流的特殊方法
*/
public class BufferedWriterReaderDemo2 {
public static void main(String[] args) throws IOException {
//创建普通流对象
FileWriter fw = new FileWriter("D:/test.txt");
//创建高效流对象
BufferedWriter bw = new BufferedWriter(fw);
//写
bw.write("i miss u,i want u,she with u");
//换行时,每种环境对换行的识别不同,Windows识别\r\n,有的识别\r有的识别\n
//bw.write("\n");
//调用高校流的换行方法
bw.write("i miss u,i want u,she with u");
bw.newLine();
bw.write("i miss u,i want u,she with u");
bw.newLine();
bw.flush();
bw.close();
}
}