0226字符流 转换流

根据字节流我们可以对文件夹进行基础的操作,但是我们要对文件写入中文字符时怎么处理

在字节流中我们可以将利用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();
		
		
	}

  

posted @ 2021-02-26 23:12  公雪  阅读(230)  评论(0编辑  收藏  举报