Java:IO流(三)——Reader、Writer
说明
Reader、Writer是字符流,以char为单位读写;
区别于InputStream、OutputStream,后者是Byte流,以Byte为单位读写。
InputStream |
Reader |
字节流,以byte为单位 | 字符流,以char为单位 |
读取字节(-1,0~255):int read() | 读取字符(-1,0~65535):int read() |
读取字节数组:int read(byte[ ] b) | 读取字符数组:int read(char[ ] c) |
OutputStream |
Writer |
字节流,以byte为单位 | 字符流,以char为单位 |
写入字节(0~255):void write(int b) | 写入字符(0~65535):void write(int c) |
写入字节数组:void write(byte[ ] b) | 读取字符数组:void write(char[ ] c) |
字符串:无 | 写入String:void write(String s) |
java.io.Reader
所有字符输入流的super class,它最主要的方法是:
read()
public int read() throws IOException;
该方法读取字符流的下个字符;返回字符表示的int值,范围是0~65535,读到末尾则返回-1。
read( char[ ] c )
public int read( char[] c ) throws IOException;
一次读取若干个字符并填充到char [ ]数组;返回实际读入的字符数,最大不超过char[ ]数组长度,返回-1表示结束。
java.io.Writer
所有字符输出流的super class,主要方法有:
- 写入单个char(0~65535):void write( int c );
- 写入char [ ]:void write( char[ ] c );
- 写入String:void write( String s )。
实现类:Reader
1)FileReader:打开一个文件并读取所有字符
流程
1、打开文件并获取Reader;
try( Reader reader = new FileReader( "src/readme.txt" , StandardCharsets.UTF_8) ) {...}
初始化时,第二个参数为文件编码类型,缺省时可以正常打开纯ASCII编码的文本文件;如果文件包含中文,就要指定编码为UTF-8。
2、反复调用read()直到返回-1;
for(;;){ int n = reader.read(); if(n==-1) break; System.out.println((char)n); }
2.5、read( char[ ] c )一次读取若干字符并填充到char [ ]数组
先设置一个缓冲区,然后每次尽可能地填充缓冲区
try(Reader reader = new FileReader("src/readme.txt",StandardCharsets.UTF_8)){ char [] buffer = new char [1000]; int n; while((n=reader.read(buffer))!=-1) System.out.println("read "+n+" chars."); }
2)CharArrayReader:在内存中模拟Reader
类似ByteArrayInputStream,其作用实际上是把char[ ]数组变成一个Reader
try(Reader reader = new CharArrayReader("Hello.".toCharArray())){ }
在内存中模拟Reader的意思是:我们不需要从一个文件构造Reader,可以直接将一个String转换为char [ ],在将char [ ]传入并构造Reader,起到模拟从文件读取这个char[ ]的作用。
3)StringReader:类似CharArrayReader,但可以直接以String作为数据源
try( Reader reader = new StringReader("Hello")){ ... }
4)InputStreamReader
Reader本质上是一个基于InputStream的从byte到char的转换器。
InputStreamReader是一个可以把任何InputStream转换为Reader的转换器:
//InputStream InputStream input = new FileInputStream("src/readme.txt"); //由InputStream构造Reader Reader reader = new InputStreamReader( input , "UTF-8");
构造InputStreamReader时,我们需要传入InputStream和编码,从而得到一个Reader对象。
上述代码可以用try( resource )更简洁地改写如下:
try(Reader reader = new InputStreamReader( new FileInputStream( "src/readme.txt") , "UTF-8" )){ ... }
上述代码就是FileReader的一种实现形式。
实现类:Writer
1)FileWriter:写入文件的Writer
try(Writer writer = new FileWriter("readme.txt",StandardCharsets.UTF_8)){ writer.write('H'); writer.write("Hello".toCharArray()); writer.write("Hello"); }
2)CharArrayWriter:在内存中模拟Writer
在内存中模拟Writer的意思是:构造一个buffer,向其中写入char,最后得到写入的char [ ]数组(而不用输出为真正的文件),这和ByteArrayOutputStream类似。
在内存中保存Writer写入的char[ ](内存中),并不保存为真正的文件(硬盘中),这就是“模拟”的意思。
try(CharArrayWriter writer = new CharArrayWriter()){ writer.write(65); writer.write(66); writer.write(67); char [] data = writer.toCharArray(); }
3)StringWriter
类似于CharArrayWriter,只不过最终在内存中维护的是StringBuffer而不是char [ ],并对外提供了Writer接口。
4)OutputStreamWriter
和Reader类似,Writer实际上是基于OutputStream构造的——它接收char,在内部转换为一个或多个byte,并写入OutputStream。因此,OutputStreamWriter就是一个将任意OutputStream转换为Writer的转换器:
try(Writer writer = new OutputStreamWriter( new FileOutputStream("readme.txt"),"UTF-8" ) ){ ... }
上述代码就是FileWriter的一种实现方式。这与之前的InputStreamReader类似。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性