JavaSE之IO流中的字节输出流(OutputStream)、字节输入流(InputSream)和字符输入流(Reader)、字符输出流(Writer)

本文详细介绍了Java中的字节流(OutputStream、InputStream)和字符流(Reader、Writer),包括构造方法、常用方法以及如何进行文件读写操作。通过实例演示了字节流和字符流在文件复制、读取字符数据时的应用,强调了字节流在处理中文字符时可能遇到的问题,以及字符流作为解决方案的优势。

字节输出流和字节输入流均位于java.io包下,且均为抽象类,两者都有诸多子类,FileOutputStream和FileInputStream是两者各自的子类之一,分别为文件字节输出流和文件字节输入流

一、字节输出流(OutputStream)

该类中的一些方法如下:

FileOutputStream类有多个构造方法:

1.FileOutputStream(String name);     创建一个向具有指定名称的文件中写入数据的输出文件流,String name:文件的路径

2.FileOutputStream(File file);      创建一个向指定File对象表示的文件中写入数据的输出文件流

3.FileOutputStream(String name,boolean append);     append为true时,创建对象不会覆盖原文件,继续在文件的末尾追写

4.FileOutputStream(File file,boolean append);      append为false时,创建一个新文件,覆盖原文件

使用构造方法后FileOutputStream对象就会指向这个指定的文件

字节输出流写入数据到文件:

FileOutputStream fos=new FileOutputStream("文件路径");

fos.write(97);      //参数为0-127时,就写入该数字对应的ASCII码上的字符,只写入一个字节

fos.close();      //三行均会产生异常,主要只需抛出IOException即可

------------------------

FileOutputStream fos=new FileOutputStream("文件路径");

byte[] bytes={65,66,67,68,69};      //第一个数为正数(0-127),就查询ASCII表

fos.write(bytes);      //写入ABCDE,一次性写入多个字节

byte[] bytes={-65,-66,-67,68,69};    //第一个数为负数,那么第一个数和第二个数为组成一个中文

fos.write(bytes);      //写入烤紻E

fos.close();      //注意抛出IOException

-----------------------

FileOutputStream fos=new FileOutputStream("文件路径");

byte[] bytes="你好".getBytes();      //写入字符串,使用String类的getBytes()方法,将字符串转化为字节数组

fos.write(bytes);      //写入你好

(在文件中追写时使用后两个构造方法,在文件中写入回车时,windows系统下为"\r\n")

二、字节输入流(InputStream)

该类中的一些方法如下:

 FileInputStream也有多个构造方法:

1.FileInputStream(String name);     创建一个向具有指定名称的文件中读取数据的输入文件流,String name:文件的路径

2.FileInputStream(File file);      创建一个向指定File对象表示的文件中读取数据的输入文件流

使用构造方法后FileInputStream对象就会指向这个指定的文件

FileInputStream fis=new FileInputStream("文件路径");

int len=fis.read(97);       //len为要读文件中某个字符的ASCII码值,一次只读取一个字符

System.out.println(len);    //输出len,len为-1时,表示已读完

fis.close();      

------------------------

int len=0;

while((len=fis.read())!=-1){

        System.out.println(char(len));

}         //使用while循环优化,一次性读取文件中的全部字符

------------------------

FileInputStream fis=new FileInputStream("文件路径");

byte[] bytes=new byte[1024];       //1kb大小的字节数组

int len=fis.read(bytes);       //len为从文件中读取的有效字节个数,最大为bytes数组的大小1024

System.out.println(len);    //输出len,len为-1时,表示已读完

System.out.println(new String(bytes));    //String构造函数参数为字节数组,将字节数组转化为字符串

fis.close();      

----------------------

byte[] bytes=new byte[1024];       

int len=0;       

while((len=fis.read(bytes))!=-1){

        System.out.println(new String(bytes,0,len));      //从0开始len长度的字符串,防止空间浪费

}         //使用while循环优化

三、综合案列:文件复制

FileOutputStream fos=new FileOutputStream("要复制到的文件路径");

FileInputStream fis=new FileInputStream("被复制文件路径");

byte[] bytes=new byte[1024];       

int len=0;       

while((len=fis.read(bytes))!=-1){

        fos.write(bytes,0,len);    

}         

fis.close(); 

fos.close(); 

四、字符输入流(Reader)

当使用字节流读取文件时,若文件中有中文字符,则会产生错误,因为在utc-8编码下,一个中文字符占用3个字节,而一次读取只能读取一个字节,所以最后会产生乱码,因此使用字符流解决上述问题

Reader和Writer同样位于java.io包下,也是两个抽象类,同样也有两个子类用来文件的输入输出,分别为FileReader和FileWriter

Reader类下的一些方法:

FileReader类同样有多个构造方法:

1.FileReader(String filename);     

2.FileReader((File file);      

字符输入流读取字符数据:

FileReader fr=new FileReader("文件路径");

int len=0;       //len为要读文件中某个字符的ASCII码值,一次只读取一个字符

while((len=fr.read())!=-1){

        System.out.println(char(len));

}         //使用while循环优化,一次性读取文件中的全部字符

fr.close();   

----------------------

FileReader fr=new FileReader("文件路径");

char[] cs=new char[1024];

int len=0;       //len为要读文件中某个字符的ASCII码值,一次只读取一个字符

while((len=fr.read(cs))!=-1){

        System.out.println(new String(cs,0,len));

}         //使用while循环优化,一次性读取文件中的全部字符

fr.close();   

五、字符输出流(Writer)

Writer类的一些方法如下:

FileWriter类同样有多个构造方法:

1.FileWriter(String filename);     

2.FileWriter((File file);      

3.FileWriter(String filename,boolean append);     

4.FileWriter(File file,boolean append);    

FileWriter不同于之前字节输出流的使用方法,write()方法会将字符写入内存缓冲区而不是文件中,之后要多使用一个flush()方法用来把内存缓冲区的字符写入到文件中

close()方法也会把内存缓冲区的字符写入到文件中,但flush()方法使用完后流仍存在,可以继续输出,close()方法会直接将流关掉,之后无法再输出

字符输出流写字符数据:

FileWriter fw=new FileWriter("文件路径");

fw.writer(97);       //len为要读文件中某个字符的ASCII码值,一次只读取一个字符

fw.flush();

fw.writer(98); 

fw.close();      

fw.writer(99);     //错误,流已关闭,无法写

------------------------------

char[] cs={'a','b','c','d','e'};

fw.writer(cs); 

fw.writer(cs,1,3);     //写入从1索引开始长度为3的字符串

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值