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。
创建使用给定字符集的 OutputStreamWriter。
创建使用给定字符集的 OutputStreamWriter。
创建使用指定字符集的 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();
}
}
}
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();
}
}
}
相关文章推荐
- ubuntu14.04,安装Eclipse(开源开发工具)
- ubuntu14.04,安装Eclipse(开源开发工具)
- Java简介(3)-基本语法
- java环境配置——工具下载地址
- Spring学习总结(4)——Spring AOP教程
- Spring学习总结(4)——Spring AOP教程
- Spring学习总结(4)——Spring AOP教程
- Spring学习总结(4)——Spring AOP教程
- Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)
- Spring@Autowired注解与自动装配
- spring自定义schema学习
- 自己理解的GMF
- java中的快捷键
- failed to create java virtual machine的解决方法
- Java中Properties类的常用操作
- Spring使用Cache、整合Ehcache(转)
- java进阶学习笔记
- Java基础编程之分解质因数
- Spring MVC 框架搭建及详解
- Eclipse版本区别