Java I/O流-总结(InputStream,OutputStream,Reader,Writer)
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)的更多相关文章
- Java中的流(4)InputStream,InputStreamReader,BufferedReader关系
InputStream是字节流,InputStreamReader将字节流转成字符流,BufferedReader将字符流转成字符缓冲,开始读字符. 1.InputStream.OutputStrea ...
- Java基础——IO流
今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
- java IO选择流的原则及其与IO流相关类的关系
1 按照用途进行分类 1.1 按照数据的来源(去向)分类 是文件:FileInputStream, FileOutputStream, FileReader, FileWriter 是byte[]:B ...
- java 文件和流
最近工作中涉及到一些文件操作的东西,闲下来刚好做个整理. 控制台IO 在控制台使用键盘作为标准输入并使用终端窗口(在windows下,经常是命令提示符或者是PowerShell:在linuxx/OS ...
- Java - 文件(IO流)
Java - 文件 (IO) 流的分类: > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter ...
- JAVA基础--IO流
数据流的方向: 输入流, 输出流 数据单位: 字节流, 字符流 功能不同: 节点流, 处理流 JDK提供的4种抽象流: 输入流: 字节流(InputStream), 字符流(Reader) , 站在程 ...
- java io 节点流和处理流
JAVA IO操作总结:节点流和处理流 JAVA IO操作总结--节点流和处理流 按照流是否直接与特定的地方(如磁盘.内存.设备等)相连,分为节点流和处理流两类. 节点流:可以从或向一个特定的地方( ...
- Java之IO流总结
IO流·Java流式输入/输出原理·Java流类的分类·输入/输出流类·常见的节点流和处理流·文件流·缓冲流·转换流·数据流·Print流·Object流 ①Java流式输入/输出原理 ...
- Java I/O流输入输出,序列化,NIO,NIO.2
Java IO流 File类: File类是java.io包下代表和平台无关的文件和目录,File不能访问文件内容本身. File类基本操作: System.out.println("判断文 ...
随机推荐
- 可移植类库无法使用async、await关键字
今天遇到了如题所示的问题,平台已经选择了.net 4.5了,可是就是编译不通过,await关键字下出现了红色下划线. 解决方法:安装一个Bcl的补丁包. https://www.nuget.org/p ...
- Python学习-16.Python中的错误处理
虽然叫错误,但跟 C# 中的异常是一回事.只不过 Python 中叫错误(Error)而 C# 中叫异常(Exception). 先手工产生一个异常: file = open('','r') 上面一句 ...
- Python2.7升级至Python3.6
Python2.7升级至Python3.6 今天在CentOS7.2上将python2.7升级至python3.6时遇到了诸多问题,下面将升级步骤以及解决方法一一列举. 1.安装Python3.6 安 ...
- UEditor编辑器两个版本任意文件上传漏洞分析
0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...
- CSS/CSS3
CSS/CSS3 选择器. 选择器 例子 例子描述 CSS 说明 .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 ...
- 自定义Asp.net core——日志记录
本文我将演示如何定制日志记录.默认的日志记录仅仅向控制台或者debug窗口输出日志,这样可以满足一些情况,但是你可能还需要把日志记录到一个磁盘文件或者数据库,或者你想为记录额外的信息.这样的场景你就需 ...
- Flask基础-配置,路由
一,配置文件 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG': get_debug_flag(default=False), 是否 ...
- Flask 视图,模板,蓝图.
https://www.cnblogs.com/wupeiqi/articles/7552008.html 1. 配置文件 from flask import Flask app =Flask(__n ...
- Educational Codeforces Round 34 (Rated for Div. 2) D - Almost Difference(高精度)
D. Almost Difference Let's denote a function You are given an array a consisting of n integers. You ...
- Vue 项目优化,持续更新...
一.减少打包的体积 通过vue-cli 初始化项目后,使用 npm run build 生成的JS文件往往会很大,加载时间过长导致页面长时间白屏,所以我们尽可能的使用一下方法来减少打包体积. 1.1 ...