您的位置:首页 > 编程语言 > Java开发

java Io流学习(三)字符流

2017-08-03 11:06 162 查看
一、字符流定义:

    字节流提供了针对字节处理的输入输出功能,基本满足了一切需求,但是其不能针对字符进行操作,unicode字符占用2个字节,如果要用字节流处理的话,还需要进行解码操作,不符合java的"一次编写,处处运行的"原则,因此针对于字符类的输入输出java 也提供了直接处理的流类,Reader和writer

二、Reader(字符输入流)

    Reader是java的所有字符输入流的顶级父类,本质也是一个抽象类,因此只能由其子类进行实例化,对于此类,了解下常用的APi即可



1)read()方法

package com;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;

public class Test11 {

public static void main(String[] args) throws Exception {

//  Reader reader=new Reader(); //此行代码会报错,抽象类无法实例化

File file =new File("D:"+File.separator+"f.txt");//注意此时的我D盘下是有f.txt的,内容是"zhangsan"-注意,不含中文汉字,否则会出现乱码
Reader reader=new FileReader(file);  //子类实例化一个reader对象

//read()方法,单个字符读取,返回的是字符在unicode的值,因此要强制转成字符,放入到字符数组中
char[] i=new char[1024]; //字符数组,用于存储单个读取的字符
int a=0;
int b=0;
while((a=reader.read())!=-1){
i[b]=(char)a; //读取的a是字符在unicode的位置(int型),因此需要把int转成char型,存储
b++;
}
reader.close(); //读取完毕后要关闭该流,释放资源
System.out.println(new String(i)); //直接用字符数组构造字符串
}
}


2、read(char[] b)方法

package com;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;

public class Test12 {

public static void main(String[] args) throws Exception {
//  Reader reader=new Reader(); //此行代码会报错,抽象类无法实例化

File file =new File("D:"+File.separator+"f.txt");//注意此时的我D盘下是有f.txt的,内容是"zhangsan"-注意,不含中文汉字,否则会出现乱码
Reader reader=new FileReader(file);  //子类实例化一个reader对象

//read(char[])方法 一次读取字符到字符数组中
char[] in=new char[1024]; //创建一个字符数组
int i=0;
while((i=reader.read(in))!=-1){  //一次读取字符到字符数组中去,最多读取1024个字符,返回实际读取的字符个数i
System.out.println(new String(in,0,i)); //利用读取到的字符个数以及字符数组,构造字符串,
}
reader.close();//关闭输入流,释放资源
}

}


3、read(char[] b,int off,int len)方法

package com;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;

public class Test13 {

public static void main(String[] args) throws Exception {
//  Reader reader=new Reader(); //此行代码会报错,抽象类无法实例化

File file =new File("D:"+File.separator+"f.txt");//注意此时的我D盘下是有f.txt的,内容是"zhangsan"-注意,不含中文汉字,否则会出现乱码
Reader reader=new FileReader(file);  //子类实例化一个reader对象

//read(char[] b,int off, int len)方法,读取len个字符,从off位置开始存储到字符数组中去,因此不影响off位置之前的字符,以及len+off后面的字符,off+len<b.length,否则会溢出异常
char b[]=new char[1024];
int i=0;
while((i=reader.read(b, 0,(int)file.length()))!=-1){ //等于是多次read()方法,单个单个字符的读取到指定位置
System.out.println(new String(b));
}
reader.close(); //关闭输入流,释放资源
}
}


    以上3种read方法,建议使用read(char[] b)方法进行读取较好,第一个read()方法,单个读取,效率较低,第三个方法,要考虑字符溢出问题,所以建议使用第二个方法进行读取(注意仅限读取字母,数字等,读取中文汉字会出现乱码,需使用其他输入流)

三、writer(字符输出流)

    writer是java 所有字符输出流的父类,其本质是抽象类,不能实例化,只能由其子类实例化,了解其常规API即可(比字符输入流要简易些许)

1、write(int c )方法

package com;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test
{

public static void main(String[] args) throws Exception {

File file=new File("E:"+File.separator+"a.txt"); //E盘下是不存在a.txt的,进行写的操作的时候,会自动检索该文件,而后进行创建
Writer writer=new FileWriter(file);
//write(int c ),写入单个字符到文件中;
char a='我'; //单个字符
int i=a; //单个字符对应的int位
System.out.println(i); //打印出来是25105,对应的就是字符‘我’在unicode中的位置
writer.write(i); //输出到文件中、输入的是字符的int位位置,但是输出的是字符‘我’到txt中
writer.close(); //输出流
}

}

2、write(String str)

package com;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test
{

public static void main(String[] args) throws Exception {

File file=new File("E:"+File.separator+"a.txt"); //E盘下是不存在a.txt的,进行写的操作的时候,会自动检索该文件,而后进行创建
Writer writer=new FileWriter(file);

//write(String str),写入对应字符串到文件中
String str="包子是个小可爱";
writer.write(str);
writer.close();
}

}

3、writer(char[] buf)
package com;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test
{

public static void main(String[] args) throws Exception {

File file=new File("E:"+File.separator+"a.txt"); //E盘下是不存在a.txt的,进行写的操作的时候,会自动检索该文件,而后进行创建
Writer writer=new FileWriter(file);

//writer.write(char[] buf);//读取buf字符数组中的字符写入到文件中
String str="咕噜是个小可爱"; //先建立字符串
char[] buf=str.toCharArray(); //字符串装字符数组
writer.write(buf);
writer.close();
}

}


4、write(char[] buf,int off,int len)
package com;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test
{

public static void main(String[] args) throws Exception {

File file=new File("E:"+File.separator+"a.txt"); //E盘下是不存在a.txt的,进行写的操作的时候,会自动检索该文件,而后进行创建
Writer writer=new FileWriter(file);

//writer.write(char[] buf,int off,int len); //从buf数组中的OFF下表开始,读取len个字符到文件中
String str="咕噜是个大胖子"; //先建立字符串
char[] buf=str.toCharArray(); //字符串转字符数组
writer.write(buf,0,buf.length);
writer.close();
}

}

5、write(String str,int off,int len)
package com;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test
{

public static void main(String[] args) throws Exception {

File file=new File("E:"+File.separator+"a.txt"); //E盘下是不存在a.txt的,进行写的操作的时候,会自动检索该文件,而后进行创建
Writer writer=new FileWriter(file);

//writer.write(String str,int off,int len); //从字符串的OFF下表开始读取len个字符到文件中,
String str="zhangsan"; //先建立字符串
writer.write(str,0,str.length());
writer.close();
}

}


 以上5种方法,第一种很少使用(单字符输出使用场景较少),其余4种按照不同场景对应使用即可、其余对应的输出流API方法基本与此相差不大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息