Java基础-IO (5)

Reader类图如下,Reader实现Readable和Closeable接口,根据不同的功能有众多的子类。

子类必须实现的方法只有 read() 和 close()

read()

public int read() throws IOException

用于读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。用于支持高效的单字符输入的子类应重写此方法。

返回:作为整数读取的字符,范围在 0 到 65535 之间 ( 0x00-0xffff),如果已到达流的末尾,则返回 -1

read(char[] cbuf,int off,int len)

public abstract int read(char[] cbuf,int off,int len) throws IOException

将字符读入数组的某一部分。在某个输入可用、发生 I/O 错误或者到达流的末尾前,此方法一直阻塞。

参数: cbuf - 目标缓冲区 off - 开始存储字符处的偏移量 len - 要读取的最多字符数 返回: 读取的字符数,如果已到达流的末尾,则返回 -1 抛出: IOException - 如果发生 I/O 错误 输入字符流使用流程

这里我们还是读取当前项目data目录下的data.txt文件,示例代码如下:

package com.molyeo.java.io; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; /** * Created by zhangkh on 2018/8/5. */ public class CharacterBasedReader { static Logger logger = LoggerFactory.getLogger(CharacterBasedReader.class.getName()); public static void main(String[] args) throws IOException { File path = new File("."); if (path.isDirectory()) { logger.info("root: directory is {}", path.getAbsolutePath()); String[] list; list = path.list(new DirFilter("d.*")); logger.info("File after first filter:"); for (String dirItem : list) { File file = new File(path, dirItem); if (file.isDirectory()) { logger.info("child: {} is a directory", dirItem); String[] childList = file.list(new DirFilter("data*.txt")); logger.info("File after second filter"); for (String childItem : childList) { File childFile = new File(file, childItem); if (childFile.isFile()) { logger.info("Secondary child: {} is a file", childItem); logger.info("start read file {}", childFile.getCanonicalPath()); read(childFile); } } } else { logger.info("child: {} is a file", dirItem); } } } else { logger.info("root is not a directory"); } } public static void read(File file) throws IOException{ try(FileReader reader=new FileReader(file)){ int byteData = reader.read(); while (byteData != -1) { logger.info("byteData={}, char result={}", byteData, (char) byteData); byteData = reader.read(); } } } }

输出结果如下:

18/08/05 18:45:15 INFO io.CharacterBasedReader: root: directory is D:\workspace_spark\SparkInAction\. 18/08/05 18:45:15 INFO io.CharacterBasedReader: File after first filter: 18/08/05 18:45:15 INFO io.CharacterBasedReader: child: data is a directory 18/08/05 18:45:15 INFO io.CharacterBasedReader: File after second filter 18/08/05 18:45:15 INFO io.CharacterBasedReader: Secondary child: data.txt is a file 18/08/05 18:45:15 INFO io.CharacterBasedReader: start read file D:\workspace_spark\SparkInAction\data\data.txt 18/08/05 18:45:15 INFO io.CharacterBasedReader: byteData=72, char result=H 18/08/05 18:45:15 INFO io.CharacterBasedReader: byteData=97, char result=a 18/08/05 18:45:15 INFO io.CharacterBasedReader: byteData=100, char result=d 18/08/05 18:45:15 INFO io.CharacterBasedReader: byteData=111, char result=o 18/08/05 18:45:15 INFO io.CharacterBasedReader: byteData=111, char result=o 18/08/05 18:45:15 INFO io.CharacterBasedReader: byteData=112, char result=p

需要注意的是,Java内部使用UTF8编码表示字符串。输入流中一个字节可能并不等同于一个UTF8字符
,如果你从输入流中以字节为单位读取UTF8编码的文本,并且尝试将读取到的字节转换成字符,你可能会得不到预期的结果。
如果输入的文件不是UTF8编码的话,由于FileReader不能指定编码,则需要利用字节流,然后利用转换流将字节流转换为字符流。

InputStream inputStream = new FileInputStream("D:\workspace_spark\SparkInAction\data\data.txt"); Reader reader = new InputStreamReader(inputStream, "UTF-8"); Writer类图

Writer的类图如下,主要实现Appendable,Flushable,Closeable接口,根据不同的功能有众多的子类。


主要的api接口如下:
write(String str)
public void write(String str) throws IOException
写入字符串。
参数:
str - 要写入的字符串
抛出:
IOException - 如果发生 I/O 错误

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjswp.html