根据字节流我们可以对文件夹进行基础的操作,但是我们要对文件写入中文字符时怎么处理
在字节流中我们可以将利用getbytes方法和new String 进行转换从而可以在访问文件中的中文字符,还可以通过字符流对文件中的中文字符进行操作
1、字符输出流 writer
该类是抽象类,不能创建类对象,所以我们要创建其子类对象 FileWriter
常见构造方法
FileWriter(File file)
FileWriter(String name)
这两个构造方法都是用来明确读写文件的位置,跟前面所学的字节流的构造方法都是一个类型的,同时开启续写功能就是在参数后边加一个布尔值,默认不写是false
常用类方法
write(int c)单个字节写入
write(char[] ch)字符数组写入
write(char[] ,int a,int b)字符数组写入,从a开始写入b个
write(String str)字符串写入
write(String str,int a,int b)字符串写入,从a开始 传入b个、
代码展示
public static void main(String[] args) throws IOException {
//明确目的地
FileWriter fw=new FileWriter("F:\\io1127\\demo11.txt",true);
//写入一个字符
fw.write(100);
//写入字符数组
char[] ch={'0','2','r','中'};
fw.write(ch,1,2);
//写入字符串
String s="海绵宝宝";
fw.write(s, 2, 2);
//释放资源
fw.close();
}
2、字符输入流 Reader
该类是抽象类,不能创建类对象,所以我们要创建其子类对象 FileReader
常见构造方法
FileReader(File file)
FileReader(String name)
这两个构造方法都是用来明确读写文件的位置,跟前面所学的字节流的构造方法都是一个类型的,同时开启续写功能就是在参数后边加一个布尔值,默认不写是false
常用类方法
read()单个字节读取
read(char[] ch)字符数组读取
代码展示单个字节读取
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("F:\\io1127\\demo11.txt");
//读取一个字符
int len=0;
while((len=fr.read())!=-1){
System.out.print((char)len);
}
//释放
fr.close();
}
代码展示字符数组读取
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr=new FileReader("F:\\io1127\\demo11.txt");
//一个字符数组
char[] ch=new char[1024];
int len=0;
while((len=fr.read(ch))!=-1){
System.out.println(new String(ch,0,len));
}
//释放
fr.close();
}
文件复制
单个字节复制
public static void main(String[] args) throws IOException {
//明确位置
FileReader fr=new FileReader("F:\\io1127\\demo11.txt");
//明确目的
FileWriter fw=new FileWriter("F:\\io1127\\work1\\demo11.txt");
int len=0;
while((len=fr.read())!=-1){
fw.write(len);
fw.flush();
}
//释放资源
fr.close();
fw.close();
}
数组复制
public static void get() throws IOException{
//明确位置
FileReader fr=new FileReader("F:\\io1127\\demo11.txt");
//明确目的
FileWriter fw=new FileWriter("F:\\io1127\\work\\demo11.txt");
char[] ch=new char[1024];
int len=0;
while((len=fr.read(ch))!=-1){
fw.write(ch);
fw.flush();
}
//释放资源
fr.close();
fw.close();
}
3.flush()和close()方法的区别
flush()刷新该流缓冲区,最好是写一句刷新一下
close()关闭该流,但先要刷新一下
4、转换流
我们的工作区是jbk码表,那我们写入的文件有可能是utf8码表的文件,这就写入字符的时候会出现乱码的情况,那么转换流就是用来指定码表用的,保证写入的字符以指定的码表写入,这样就不会出现乱码的情况。
输出流构造方法
OutputStreamWriter(FileOutputStream,mabiao);
代码展示
public static void main(String[] args) throws IOException {
//明确目的地
FileOutputStream fos=new FileOutputStream("F:\\io1127\\utf8.txt",true);
//创建转换流对象明确码表
OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
//写入
osw.write("海绵宝宝");
osw.close();
}
图解
输入流构造方法
InputeStreamReader(FileInputStream,mabiao);
代码展示
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("F:\\io1127\\utf8.txt");
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
char[] ch=new char[1024];
int len=0;
while((len=isr.read(ch))!=-1){
System.out.println(new String(ch,0,len));
}
isr.close();
}
利用转换流对文件进行复制
//用转换流复制utf-8编码的文件
public static void get4() throws IOException{
//
FileInputStream fis=new FileInputStream("F:\\io1127\\utf8.txt");
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
FileOutputStream fos=new FileOutputStream("F:\\io1127\\a\\utf8.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
char[] ch=new char[1024];
int len=0;
while((len=isr.read(ch))!=-1){
osw.write(ch);
osw.flush();
}
isr.close();
osw.close();
}