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

java中字符流讲解

2015-11-16 15:38 330 查看
1,字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。

2,下面通过三个例子来讲解字符流中的字节字符转换流、文件读写流和字符流的过滤器。

3,先看字节字符转换流的例子:

1)InputStreamReader方法主要完成字节流到字符流的转换。构造方法:

InputStreamReader(InputStream
in);

——创建一个使用默认字符集的InputStreamReader

InputStreamReader(InputStream
in, Charsetcs);

——创建使用给定字符集的InputStreamReader

InputStreamReader(InputStream
in, StringcharsetName);

——创建使用自定义字符集的InputStreamReader

2)OutputStreamWriter方法主要完成将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。构造方法:

OutputStreamWriter(OutputStream out)
;

创建使用默认字符编码的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, Charset cs)
;

创建使用给定字符集的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, Charset cs)
;

创建使用给定字符集的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, String charsetName)
;

创建使用指定字符集的 OutputStreamWriter。

3)代码实例:

public
class demo {

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

//读取源文件

FileInputStream in=new FileInputStream("D:\\IO流2.txt");

//构造一个InputStreamReader,并把in传进去

InputStreamReader reader=new InputStreamReader(in,"utf-8"); //自定义编码

//目标文件

FileOutputStream out=new FileOutputStream("D:\\IO流3.txt");

OutputStreamWriter writer=new OutputStreamWriter(out, "utf-8");

/*

* 1,一个字节一个字节的读取

*/

//int c;

//while((c=isr.read())!=-1){

//System.out.print((char)c); //这里必须要把c转换为char

//}

/*

* 2,批量读取

*/

char[] buffer=new char[3*1024];

int c;

while((c=reader.read(buffer,0,buffer.length))!=-1){

String s=new String(buffer, 0, c);

//在控制台打印输出读取到的数据

System.out.print(s);

//把源文件中的数据写出到目标文件

writer.write(buffer,0,c);

}

in.close();

reader.close();

out.close();

writer.close();

}

}

4,再通过一个例子讲解字符流的文件读写流:

1)FileWriter类(字符输出流类)。

构造方法:

a)FileWriter fw = new FileWriter(String fileName);

创建字符输出流类对象和已存在的文件相关联。文件不存在的话,并创建。

如:FileWriter fw = new FileWriter("C:\\demo.txt");

b) FileWriter fw = new FileWriter(String fileName,boolean append);

创建字符输出流类对象和已存在的文件相关联,并设置该该流对文件的操作是否为续写。

如:FileWriter fw = new FileWriter("C:\\demo.txt",ture); //表示在fw对文件再次写入时,会在该文件的结尾追加,并不会覆盖掉。

主要方法:

void write(String str) //写入字符串。当执行完此方法后,字符数据还并没有写入到目的文件中去。此时字符数据会保存在缓冲区中。 此时在使用刷新方法就可以使数据保存到目的文件中去。

viod flush() //刷新该流中的缓冲。将缓冲区中的字符数据保存到目的文件中去。

viod close() //关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后,再写入或者刷新的话,会抛IOException异常。

2)FileReeader类。

a)构造方法

FileReader fr = new FileReader(String fileName);//使用带有指定文件的String参数的构造方法。创建该输入流对象。并关联源文件。

b)主要方法

int read(); // 读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。

int read(char []cbuf);//将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。

void close();//关闭此流对象。释放与之关联的所有资源。

3)代码实例:

public class FwAndFrDemo {

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

//读取源文件

FileReader fr=new FileReader("D:\\文件流测试\\IO流.txt");

//写入到目标文件

FileWriter fw=new FileWriter("D:\\文件流测试\\IO流2.txt");

//批量读取

char[] buffer=new char[2*1024];

int c;

while((c=fr.read(buffer, 0, buffer.length))!=-1){

fw.write(buffer,0,c);

fw.flush();

}

fr.close();

fw.close();

}

}

5,最后通过一个例子讲解字符流的过滤器。

BufferedWriter和BufferedReader为带有默认缓冲的字符输出输入流,因为有缓冲区所以效率很高。

1)BufferedWriter类

构造方法:bufferedWriter bf = new bufferedWriter(Writer out );

主要方法:

void write(char ch); //写入单个字符。

void write(char []cbuf,int off,int len) //写入字符数据的某一部分。

void write(String s,int off,int len) //写入字符串的某一部分。

void newLine() //写入一个行分隔符。

void flush(); //刷新该流中的缓冲。将缓冲数据写到目的文件中去。

void close(); //关闭此流,再关闭前会先刷新他。

2)BufferedReader类

构造方法:BufferedReader br = new BufferReader(Reader in);

主要方法:

int read(); //读取单个字符。

int read(char[] cbuf,int off,int len); //将字符读入到数组的某一部分。返回读取的字符数。达到尾部 ,返回-1。

String readLine(); //读取一个文本行。

void close(); //关闭该流。并释放与该流相关的所有资源。

3)代码实例:

public class BufferDemo {

public static void copyFileByBuffer(File sreFile,File destFile)throws IOException{

if (!sreFile.isFile()) {

throw new IllegalArgumentException(sreFile+"不是文件");

}

if (!sreFile.exists()) {

throw new IllegalArgumentException("目录"+sreFile+"不存在");

}

BufferedInputStream bis=new BufferedInputStream(new FileInputStream(sreFile));

BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));

int c;

while ((c=bis.read())!=-1) {

bos.write(c);

bos.flush();

}

bis.close();

bos.close();

}

public static void main(String[] args) {

// TODO Auto-generated method stub

try {

Long start=System.currentTimeMillis();

BufferDemo.copyFileByBuffer(new File("D:\\EclipseWorkspaces\\IODemo\\src\\cn\\edu\\io\\IOUtil.java"),

new File("D:\\EclipseWorkspaces\\IODemo\\src\\cn\\edu\\io\\cc.java"));

Long end=System.currentTimeMillis();

System.err.println("拷贝文件用时:"+(end-start));

} catch (IOException e) {

e.printStackTrace();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: