Java流总结

一、 流的分类

• 按数据流动方向

– 输入流:只能从中读取字节数据,而不能向其写出数据

– 输出流:只能向其写入字节数据,而不能从中读取数据

• 按照流所处理的数据类型

– 字节流:用于处理字节数据。

– 字符流:用于处理Unicode字符数据。

• 按照流所处理的源

– 节点流:从/向一个特定的IO设备读/写数据的流。(低级流)

– 处理流:对已存在的流进行连接和封装的流。(高级流)

二、 缓冲流

• 缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓

冲的功能,提高了读写的效率,同时增加了一些新的方法。

• J2SDK提供了四种缓存流:

– BufferedReader

– BufferedWriter

– BufferedInputStream s

– BufferedOutputStream

• 缓冲输入流支持其父类的mark()和reset()方法:

– mark()用于“标记”当前位置,就像加入了一个书签,可以使用reset()方法返回这个标记重新读取数据。

• BufferedReader提供了readLine()方法用于读取一行字符串(以\r或\n分隔)。

• BufferedWriter提供了newLine()用于写入一个行分隔符。

• 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()方法将会使内存中的数据立刻写出。

三、 类层次

3.1、InputStream类层次

3.2、OutputStream类层次

3.3、Reader类层次

3.4、Writer类层次

四、 常用的字符流与字节流的转化


说明:

1. 字节流用于读写诸如图像数据之类的原始字节流。

2. 字符流用于读写诸如文件数据之类的字符流。

3. 低级流能和外设交流。

4. 高级流能提高效率。

5. InputStreamReader 是字节流通向字符流的桥梁。

6. OutputStreamWriter是字符流通向字节流的桥梁。

五、 代码实例

5.1、常用读文件:

/**

*以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。

*@paramfileName:文件的名

*/

publicstaticvoid readFileByBytes(String fileName) {

File file= new File(fileName);

InputStream in = null;

try {

logger.debug("以字节为单位读取文件内容,一次读多个字节:");

/*一次读多个字节*/

byte[] tempbytes =newbyte[100];

int byteread = 0;

in = new FileInputStream(file);

/*读入多个字节到字节数组中,byteread为一次读入的字节数*/

while ((byteread = in.read(tempbytes)) != -1) {

logger.debug(tempbytes);

logger.debug(0);

logger.debug(byteread);

}

} catch (Exception e1) {

logger.error("读取文本文件异常",e1);

} finally {

if (in !=null) {

try {

in.close();

} catch (IOException e1) {

logger.error("读取文本文件异常",e1);

}

}

}

}

/**

*以字符为单位读取文件,常用于读文本,数字等类型的文件

*@paramfileName:文件名

*/

public staticvoid readFileByChars(StringfileName) {

Reader reader = null;

try {

logger.debug("以字符为单位读取文件内容,一次读多个字节:");

/*一次读多个字符*/

char[] tempchars =newchar[100];

int charread = 0;

if(fileName!=null&&!"".equals(fileName)){

reader = new InputStreamReader(new FileInputStream(fileName));

/*读入多个字符到字符数组中,charread为一次读取字符数*/

while ((charread = reader.read(tempchars)) != -1) {

/*对于windows下,rn这两个字符在一起时,表示一个换行。*/

/*但如果这两个字符分开显示时,会换两次行。*/

/*因此,屏蔽掉r,或者屏蔽n。否则,将会多出很多空行。*/

if ((charread == tempchars.length)

&& (tempchars[tempchars.length - 1] !='r')) {

logger.debug(tempchars);

} else {

for (int i = 0; i < charread; i++) {

if (tempchars[i] =='r') {

continue;

} else {

logger.debug(tempchars[i]);

}

}

}

}

}

} catch (Exception e1) {

logger.error("读取文本文件异常",e1);

} finally {

if (reader !=null) {

try {

reader.close();

} catch (IOException e1) {

logger.error("读取文本文件异常",e1);

}

}

}

}

/**

*以行为单位读取文件,常用于读面向行的格式化文件

*@paramfileName:文件名

*/

publicstatic List<String> readFileByLines(StringfileName) {

List<String> list = new ArrayList<String>();

if(fileName!=null&&!"".equals(fileName)){

File file = new File(fileName);

BufferedReader reader = null;

try {

logger.debug("以行为单位读取文件内容,一次读一整行:");

reader = new BufferedReader(new FileReader(file));

String tempString = null;

/*一次读入一行,直到读入null为文件结束*/

while ((tempString = reader.readLine()) !=null) {

logger.debug(tempString);

list.add(tempString);

}

} catch (IOException e) {

logger.error("读取文本文件异常",e);

} finally {

if (reader !=null) {

try {

reader.close();

} catch (IOException e1) {

logger.error("读取文本文件异常",e1);

}

}

}

}

return list;

}

5.2、常用写文件:

/**

*把内容写到文件

*@paramfilePathName文件名

*@paramList<String>文件内容

*/

publicstaticboolean writerFile(String filePathName,String content){

boolean flag=false;

OutputStreamWriter osw=null;

try {

if(filePathName!=null&&!"".equals(filePathName)){

osw = new OutputStreamWriter(new FileOutputStream(filePathName));

}

} catch (FileNotFoundException e1) {

flag=false;

e1.printStackTrace();

}

if(osw!=null){

BufferedWriter bw=new BufferedWriter(osw);

try {

if(content!=null&&!"".equals(content)){

bw.write(content);

flag= true;

}

} catch (IOException e) {

flag=false;

e.printStackTrace();

}finally{

try {

bw.close();

osw.close();

} catch (IOException e) {

flag=false;

e.printStackTrace();

}

}

}

return flag;

}

/**

*把内容写到文件或追加到文件中

*@paramfilePathName文件名

*@paramList<String>文件内容

*/

publicstaticboolean writerFileIsAppend(String filePathName,String content){

boolean flag=false;

OutputStreamWriter osw=null;

try {

if (filePathName!=null&&!"".equals(filePathName)) {

osw = new OutputStreamWriter(new FileOutputStream(filePathName,true));

}

} catch (Exception e1) {

flag=false;

e1.printStackTrace();

}

if(osw!=null){

BufferedWriter bw=new BufferedWriter(osw);

try {

if(content!=null&&!"".equals(content)){

bw.write(content);

flag= true;

}

} catch (IOException e) {

flag=false;

e.printStackTrace();

}finally{

try {

bw.close();

osw.close();

} catch (IOException e) {

flag=false;

e.printStackTrace();

}

}

}

return flag;

}

六、 RandomAccessFile

6.1:说明

• RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或者插入数据

• RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读/写文件

• 构造器:

---RandomAccessFile(java.io.File f,String mode)

---RandomAccessFile(String file,String mode)

6.2:代码示例

/**

*Description:读取文件最后一行内容

*@paramfileName文件路径名+文件名

*/

publicstatic String getfinalLineData(StringpathName){

RandomAccessFileraf = null;

StringlastLine = "";

try {

raf = new RandomAccessFile(pathName,"r");

long len = raf.length();

if (len != 0L) {

long pos = len - 1;

while (pos > 0) {

pos--;

raf.seek(pos);

if (raf.readByte() =='\n') {

lastLine = raf.readLine();

break;

}

}

}

} catch (Exception e) {

e.printStackTrace();

}finally {

if (raf !=null) {

try {

raf.close();

} catch (IOException e1) {

e1.getStackTrace();

}

}

}

return lastLine;

}

七、 注意事项

1、将高级流“套接“在低级流上,这样起到缓冲的作用可以提高效率。

2、将使用完的流关闭,释放资源。

3、读取如图片、声音、影像等文件用字节流。

4、读取如文本等文件用字符流。

5、根据具体的数据格式选择合适的读写方法、如按行读写、按照字节读写等。

Java I/O流-总结(InputStream,OutputStream,Reader,Writer)的更多相关文章

  1. Java中的流(4)InputStream,InputStreamReader,BufferedReader关系

    InputStream是字节流,InputStreamReader将字节流转成字符流,BufferedReader将字符流转成字符缓冲,开始读字符. 1.InputStream.OutputStrea ...

  2. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  3. java IO选择流的原则及其与IO流相关类的关系

    1 按照用途进行分类 1.1 按照数据的来源(去向)分类 是文件:FileInputStream, FileOutputStream, FileReader, FileWriter 是byte[]:B ...

  4. java 文件和流

    最近工作中涉及到一些文件操作的东西,闲下来刚好做个整理. 控制台IO 在控制台使用键盘作为标准输入并使用终端窗口(在windows下,经常是命令提示符或者是PowerShell:在linuxx/OS ...

  5. Java - 文件(IO流)

    Java - 文件 (IO)   流的分类:     > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter     ...

  6. JAVA基础--IO流

    数据流的方向: 输入流, 输出流 数据单位: 字节流, 字符流 功能不同: 节点流, 处理流 JDK提供的4种抽象流: 输入流: 字节流(InputStream), 字符流(Reader) , 站在程 ...

  7. java io 节点流和处理流

    JAVA IO操作总结:节点流和处理流 JAVA IO操作总结--节点流和处理流  按照流是否直接与特定的地方(如磁盘.内存.设备等)相连,分为节点流和处理流两类. 节点流:可以从或向一个特定的地方( ...

  8. Java之IO流总结

    IO流·Java流式输入/输出原理·Java流类的分类·输入/输出流类·常见的节点流和处理流·文件流·缓冲流·转换流·数据流·Print流·Object流 ①Java流式输入/输出原理         ...

  9. Java I/O流输入输出,序列化,NIO,NIO.2

    Java IO流 File类: File类是java.io包下代表和平台无关的文件和目录,File不能访问文件内容本身. File类基本操作: System.out.println("判断文 ...

随机推荐

  1. 【Win10】开发中的新特性及原有的变更(二)

    声明:本文内容适用于 Visual Studio 2015 RC 及 Windows 10 10069 SDK 环境下,若以后有任何变更,请以新的特性为准. 十一.x:Bind 中使用强制转换 这点是 ...

  2. kylin的配置账号密码的加密方法

    kylin的配置账号密码的加密方法 kylin安装过程中,配置账户,其中密码是加密的.生成密码对应密文的 方法如下: import java.io.PrintStream; import org.sp ...

  3. C# WebAPI中使用Swagger

    随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.前后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远. 前端和后端的唯一联系变成了API接口:API文档变成了前 ...

  4. C#: 获取当前路径不要用Environment.CurrentDirectory

    网上大把文章写到C#获取当前路径的方法如下: // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. Syste ...

  5. H5实现页面内跳转页面

    <!DOCTYPE html><html><body> <iframe src="/example/html/demo_iframe.html&qu ...

  6. CC2530学习路线-基础实验-定时器控制LED灯亮灭(3)

    目录 1. 前期预备知识 1.1 定时器中断触发 1.2 相关寄存器 1.3 寄存器相关问题 1.4 T1.T3定时器初始化流程 2 程序及代码 THE END 1. 前期预备知识 1.1 定时器中断 ...

  7. Mitsubishi Lancer JDM

  8. go get golang.org/x/net 安装失败的解决方法!

    GO语言在github.com上建立了自己的项目,对应的包如果不能下载,那么可以到这里去下载,比如:"go get golang.org/x/net"不能下载这个包,那么我们可以访 ...

  9. RabbitMQ实现的RPC

    1.主要思路 1.生产者发布任务时,指定properties,告知消费者处理任务完毕之后,将结果存储到reply_to指定的Queue中,本次任务的id是correlation_id 2.消费者消费完 ...

  10. Recursion-687. Longest Univalue Path

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...