这篇博客主要是总结一下Java中的字符流
1.字符输出流
public abstract class Writer
extends Object
implements Appendable,Closable,Flushable
写入字符流的抽象类。子类必须实现的方法仅有write(char[],int,int)、flush()和close().但是,多数子类将重写此处定义的一些方法,以提供
更高的效率和其他功能
public void write(String str) throws IOException
直接将字符串写入输出、public void write(char[] cbuf) throws IOException
输出字符数组public abstract void close() throws IOException
关闭public abstract void flush() throws IOException()
刷新
与OutputStream一样,对文件的操作使用:FileWriter类完成,此类的操作方法如下
public FileWriter(File file) throws IOException
根据File类构造FileWriter实例
public FileWriter(File file,boolean append) throws IOException
根据File类构造FileWriter实例,可以追加内容
public class WriterDemo {
public static void write1()
{
try {
//构造一个字符流对象,true表示追加
Writer writer = new FileWriter(
new File("H:"+ File.separator+"第一种字符流.txt")
,true);
String info="good good study,day day up";
//以字符数组的形式输出
writer.write(info.toCharArray());
//以字符串的形式输出
writer.write(info);
writer.close();
}
catch (FileNotFoundException ex)
{
ex.printStackTrace();
}catch (IOException ex)
{
ex.printStackTrace();
}
}
public static void main(String args[])
{
write1();
}
}
2.字符输入流
**public abstract class Reader
extends Object
implements Readable,Closeable**
用于读取字符流的抽象类。子类必须实现的方法只有read(char[],int,int)和close().但是,多数子类将重写此处定义的一些方法,以提供更高的效率和其他功能
public int read() throws IOException
读取一个内容
public int read(char[] cbuf) throws IOException
读取一组内容,返回读入的大小
public abstract void close() throws IOException
关闭
public class ReaderDemo {
public static void reader1()
{
try {
Reader reader =new FileReader(
new File("H:"+ File.separator+"Mytext.txt")
);
char [] cs = new char[5];
int len=-1;
StringBuilder stringBuilder= new StringBuilder();
while ((len=reader.read(cs))!=-1)
{
stringBuilder.append(new String(cs,0,len));
}
System.out.println(stringBuilder);
reader.close();
}
catch (FileNotFoundException ex)
{
ex.printStackTrace();
}catch (IOException ex)
{
ex.printStackTrace();
}
}
/**
*使用字节流读取文本文件
*/
public static void byteReader()
{
try {
InputStream inputStream = new FileInputStream(
new File("H:"+ File.separator+"Mytext.txt")
);
byte []bytes = new byte[10];
int len=-1;
StringBuilder stringBuilder =new StringBuilder();
//将文件的内容读到bytes数组当中去
while ((len=inputStream.read(bytes))!=-1)
{
stringBuilder.append(new String(bytes,0,len));
}
System.out.println(stringBuilder);
inputStream.close();
}catch (FileNotFoundException ex)
{
ex.printStackTrace();
}catch (IOException ex)
{
ex.printStackTrace();
}
}
public static void main(String args[])
{
//使用字节流读取文本文件会造成乱码
//因为读取的字节不一定正好是一个字符
byteReader();
reader1();
}
}
3.字节流与字符流的区别
在所有的流操作里,字节永远是最基础的。任何基于字节的
操作都是正确的。无论你是文本文件还是二进制文件
如果确认流里面只有打印的字符,包括英文的和各种国家的文字,
也包括中文,那么可以考虑字符流
由于编码不同,多字节的字符可能占用多个字。比如GBK的汉字就占用2个字节而UTF-8的案子就占用3个字节。所以字符流是根据指定的编码,将1个或者多个字节转化为java里面的unicode的字符,然后进行操作字符操作一般使用Writer,Reader等,字节操作一般都是InputStream,OutputStream以及各种包装类。
总结:如果你确认你要处理的流是可打印的字符,那么使用字符流看上去简单一点。如果不确定,那么用字节流总是不会错的