字符流
一次操作一个字符 一般用于操作文本文件,注意word文档不是字符文件
Reader字符输入流
- read():int 0-65535 -1
- read(char[]):int -1
- close():void
- FileReader用于操作文件,属于节点流 读取指定文件并在控制台上进行显示
public class Test {
public static void main(String[] args)throws Exception {
File f=new File("Test1.java");
if(f.exists()) {
//如果文件不存在,则在执行read操作时会抛出FileNotFoundException
try(Reader r=new FileReader(f);){
int cc;
while((cc=r.read())!=-1) {
System.out.print((char)cc);//windows下的换行和linux中的换行不一样
}
}
}else {
System.out.println("文件不能读取!");
}
}
}
Writer字符输出流
- write(int):void
- write(char[],int,int):void
- close()
- FileWriter用于操作文件
- new FileWriter(String fileName)
- new FileWriter(String fileName, boolean append)默认覆盖,boolean表示是否追加
public class Test {
public static void main(String[] args)throws Exception {
File f=new File("Test1.java");
if(f.exists()) {
//如果文件不存在,则在执行read操作时会抛出FileNotFoundException
try(Reader r=new FileReader(f);
Writer w=new FileWriter("c:/bbb.txt"); ){
int len=0;
char[] buffer=new char[8192];
while((len=r.read(buffer))!=-1) {
System.out.print(buffer);//windows下的换行和linux中的换行不一样
w.write(buffer,0,len);//读取多少字符则写出多少字符
}
}
}else {
System.out.println("文件不能读取!");
}
}
}
小结
- 在学些BIO时记忆父类的方法,区分子类的实现不同
- InputStream中的方法 read(byte[]):int; Reader中方法read(char[]):int 如果到达流末尾则-1
- OutputStream中的方法 write(byte[],0,len):void;Writer中的方法write(char[],0,len)/write(String)
- 一般在使用中,如果读取数据使用字节流,则写出数据采用的也是字节流;不建议混用,除非引入桥接流
- 文件流
- FileInputStream(“file-name”) FileInputStream(File) FileNotFoundException
- FileReader(“file-name”) FileReader(File) FileNotFoundException
- FileOutputStream(“file-name”) FileOutputStream(“file-name”,true) 默认文件覆盖,如果参数true表示追加
- FileWriter(“file-name”) FileWriter(“Õle-name”,true)
- 一般不使用单字节或者单字符的操作方法,使用数组
- 注意:try(){}是推荐写法,否则应该使用try{}Õnally{}结构保证流的关闭
- 针对二进制文件不建议使用字符流,建议使用字节流进行操作,否则有可能拷贝文件出现问题:
- 如果针对文本文件则建议使用字符流,因为编码使用比较方便