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

Java中OutputStreamWriter和InputStreamReader的基本使用详解

2016-10-08 19:16 639 查看
之前接触的都是字节流,今天开始接触到了字符流。什么事字符流呢?顾名思义,字符流就是用于读写文本数据的。

- Writer:是所有字符输出流的父类,是抽象类。

- Reader:是所有字符输入流的父类,是抽象类。

OutputStreamWriter的使用

OutputStreamWriter:字符输出流,这是一个高级流,用于写出文本数据,OutputStreamWriter的最主要的特点就是可以将指定的字符串按照特定的字符集转换为字节流之后写出。

构造函数

//创建使用默认字符编码的OutputStreamWriter
public OutputStreamWriter(OutputStream out);

//创建使用给定字符集的 OutputStreamWriter
public OutputStreamWriter(OutputStream out,Charset cs);

//创建使用指定字符集的 OutputStreamWriter
public OutputStreamWriter(OutputStream out,String charsetName);


常用的方法

//写入单个字符
public void write(int c);

//写入一个字符数组
public void write(char cbuf[]);

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

//写入一个字符串
public void write(String str);

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

//返回此流使用的字符编码的名称。
public String getEncoding();

//刷新该流的缓冲,确保所有的数据都能够写出
public void flush();


向文件中写出字符数据

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

/**
* Writer是所有字符输出流的父类,是抽象类
* OutputStreamWriter:字符输出流(高级流),用于写出字符数据
* @author Administrator
*
*/
public class OSWDemo01 {
public static void main(String[] args){
/**
* 向文件中写入字符数据
* 1.向文件中写入(FileOutputStream)
* 2.字符数据(OutputStreamWriter)
* OutputStreamWriter的最主要 的特点就是可以将指定的字符串
* 按照特定的字符集转换为字节后写出
*/
try {
//定义一个文件输出流
FileOutputStream fos=new FileOutputStream("OSW.txt");
//将文件输出流包装为字符输出流
OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8");
osw.write("You are my wife!");
osw.append("I love you.");
osw.flush();
osw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}


InputStreamReader的使用

InputStreamReader:字符输入流(高级流),用于读入文本数据.InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

构造函数

//创建一个使用默认字符集的InputStreamReader
public InputStreamReader(InputStream in);

//创建使用给定字符集的InputStreamReader
public InputStreamReader(InputStream in,Charset cs);

//创建使用指定字符集的InputStreamReader
public InputStreamReader(InputStream in,String charsetName);


常用的方法

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

//将字符读入数组中的某一部分
public int read(char[] cbuf,int offset,int length);


从文件中读入文本数据

import java.io.FileInputStream;
import java.io.InputStreamReader;

/**
* Reader是所有字符输入流的父类,是抽象类
* InputStreamReader:字符输入流(高级流),用于读入文本数据
* @author Administrator
*
*/
public class ISRDemo01 {
public static void main(String[] args){
/**
* 从文件中读取字符数据
* 1.从文件中读取(FileInputStream)
* 2.字符数据(InputStreamReader)
*/
try {
FileInputStream fis=new FileInputStream("OSW.txt");
InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
int size=0;
//每次读入一个字符,读"低16位"
while((size=isr.read())!=-1){
char content=(char)size;
System.out.print(content);
}
isr.close();

FileInputStream fis1=new FileInputStream("OSW.txt");
InputStreamReader isr1=new InputStreamReader(fis1, "UTF-8");
char[] buffer=new char[1024];
//每次读入一个字符数组
while((size=isr1.read(buffer))!=-1){
String content=new String(buffer);
System.out.println(content);
}
isr1.close();

} catch (Exception e) {
e.printStackTrace();
}
}
}


使用字符输入流和字符输出流实现文件的复制

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class SummaryISRAndOSW {

public static void main(String[] args) {
/**
* 实现文本文件的复制
* 1.从文件中读入字符数据
* 2.输出到另外一个文件中
*/
try {
long begin=System.currentTimeMillis();
FileInputStream fis=new FileInputStream("ISR.txt");
InputStreamReader isr=new InputStreamReader(fis, "UTF-8");

FileOutputStream fos=new FileOutputStream("OSW.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8");

char[] buffer=new char[10240];
int size=0;
while((size=isr.read(buffer))!=-1){
osw.write(buffer, 0, size);
osw.flush();
}
isr.close();
osw.close();
long end=System.currentTimeMillis();
System.out.println("使用文件输入流和文件输出流实现文件的复制完毕!耗时:"+(end-begin)+"毫秒");
} catch (Exception e) {
e.printStackTrace();
}
}

}


运行结果:



以上内容只代表我个人的观点,有什么错误的地方请各路大神指正!转载请注明出处!谢谢!

每天进步一点点!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 字符流