CharacterStream
- 当使用字节流读取文本时,可能会有一个问题,就是遇到中文字符时,可能不会显示完整的字符。
- 那是因为一个中文字符可能占用多个字节存储。所以,Java提供一些字符流类,以字符为单位读写数据
- 专门用于处理文本文件
- 字符输入流Reader
- java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到JVM中。
- 它定义了字符输入流的基本共性功能方法
- void close();关流
- int read();
- int read(char[]cbuf);从输入流读取一些字符,并将它们存储到字符数组中
- FileReader类
- java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区
- 1.字符编码:字节与字符的对应规则。Windows中文系统的中文编码默认的是GBK编码
-
在eclipse中,我们通常会设置默认utf-8编码
- 2.字节缓冲区:一个字节数组,用来临时存放字节数据。
- 构造方法:
- FileReader(File file);创建一个新对象,给定要读取的File对象
- FileReader(String name);创建一个新对象,给定要读取的字符串表示
- 当创建一个文件字符读取流对象时,必须传入一个文件路径,类似于FileInputStream
*/
package SE04.n3CharacterStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo01CharacterStream {
public static void main(String[] args) throws IOException {
File f=new File("folder\\io\\FR");
if(!f.exists()) {f.mkdirs();}
File f1=new File(f,"f1.txt");
if(!f1.exists()) {f1.createNewFile();}
FileReader fr1=new FileReader(f1);
// 0.读前要写点东西,稍后讲字符输出流
// 读取字符数据:
// 1.读取字符:read方法,每次可以读取一个“字符”的数据,提升为int类型,读取到文件末尾,返回-1,循环读取
int read;
while((read=fr1.read())!=-1) {
System.out.print((char)read);
}
// 2.使用字符数组读取:read(char[]cbuf),每次读取b的长度个字符到数组中,
// 返回读取到的有效字符个数,读取到末尾时,返回-1
FileReader fr2=new FileReader(f1);
int lens;
char c[]=new char[2];
while((lens=fr2.read(c))!=-1) {
System.out.print(new String(c,0,lens));
}
fr2.close();
fr1.close();
}
}
/*
- 字符输出流Writer
- java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地,它定义了
- 字节输出流的基本共性功能方法
- void write(int c);写出单个字符
- void write(char[] cbuf);写出字符数组
- abstract void write(char[] cbuf,int off,int len);写出字符数组的某一部分,off是数组的开始索引,
- len是写的字符个数
- void write(String str);写出字符串
- void write(String str,int off,int len);写出字符串的某一部分,off是字符串的开始索引,len是写的字符个数
- void flush();刷新该流的缓冲
- void close();关闭此流,会先刷新它
- FileWriter类
- java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区
- 构造方法:
- FileWrite(File file)创建一个新的对象,给定要写出的File
- FileWrite(String name)创建一个新的对象,给定要写出的File的字符串表示
- 当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream
*/
package SE04.n3CharacterStream;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Demo02Writer {
public static void main(String[] args) throws IOException {
File file=new File("folder\\io\\FR\\f1.txt");
FileWriter fw=new FileWriter(file);
File file2=new File("folder\\file\\登黄鹤楼.txt");
FileReader fr=new FileReader(file2);
// 1.写出字符:write(int b)方法:每次可以写出一个字符数据
for (int i = 100; i < 120; i++) {
fw.write(i);
}
int len;
char c[]=new char[1024];
while((len=fr.read(c))!=-1) {
fw.write(c,0,len);
}
fr.close();//后开先关
fw.close();//先开后关
}
}
IO流的异常处理
package SE04.n3CharacterStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo03HandleException {
public static void main(String[] args) throws IOException {
// IO流抛异常
// 方法一:FileInputStream写在try外面,在finally对关流进行异常处理
FileInputStream fis=null;
try {
fis=new FileInputStream(new File("folder\\io\\a.txt"));
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
// 方法二:把要抛异常的语句写在括号里,不需要关流
try(FileInputStream fis1=new FileInputStream(new File("folder\\io\\b.txt"));){
}catch(Exception e) {
}
// 方法三:把要抛异常的语句抛出去
FileInputStream fis2=new FileInputStream("");
}
}