“持志如心痛,一心在痛上,岂有功夫说闲话,管闲事 --摘自阳明先生语录”

Java中通过流来完成输入/输出,所有的输入/输出以流的形式处理,流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中,操作I/O的类都被放在http://java.io包中。

根据流中的数据单位分为字节流和字符流。
字节流:流中的数据是以8位字节为单位进行读写,以InputStream和OutputStream为基础类。
字符流:流中的数据是以16为字符为单位进行读写,以Reader和Writer为基础类。

先看看字节流,InputStream和OutputStream是字节流的两个顶层父类,提供了输入流类和输出流类的通用API,这是我在网上找的关于字节流的层次结构图:

InputStream抽象类

InputStream 为字节输入流,本身为一个抽象类,是所有字节输入流的父类,以字节为单位从数据源中读取数据,遇到错误时都会引发 IOException 异常,常用的子类有:

FileInputStream把一个文件作为InputStream,实现对文件的读取操作
ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
StringBufferInputStream:把一个String对象作为InputStream
PipedInputStream:实现了pipe的概念,主要在线程中使用
SequenceInputStream:把多个InputStream合并为一个InputStream

如果需要从一个文件读取数据,可以这样:

public static void main(String[] args) {try {InputStream in = new FileInputStream("E:test.txt");int  n=0; StringBuffer sBuffer=new StringBuffer();//当n不等于-1,则代表未到末尾while (n!=-1){try {n=in.read();//读取文件的一个字节(8个二进制位),并将其由二进制转成十进制的整数返回} catch (IOException e) {e.printStackTrace();}char by=(char) n; //转成字符sBuffer.append(by);}System.out.println(sBuffer.toString());} catch (FileNotFoundException e) {e.printStackTrace();}
}

使用FileInputStream读取文件时,若File类对象的所代表的文件不存在或者其他原因不能打开的话,则会抛出FileNotFoundException,下面为InputStream部分方法:

(1)读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束: int read()

(2)读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的 : read(byte b[ ])

(3)从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中:read(byte b[ ], int off, int len)
(4)在使用完后必须对打开的流进行关闭:void close()
(5) 返回输入流中还有多少可读字节 int available()
(6)跳过指定字节 long skip(long n)

OutputStream抽象类

OutputStream为字节输出流,本身为一个抽象类,是所有字节输出流的父类,它以字节为单位将数据写入数据源,遇到错误时都会引发 IOException 异常,常用的子类有:

FileOutputStream:实现对文件的写取操作
BufferedOutputStream:缓冲输出流
PrintStream:打印输出流

还有其他的子类不一一列举了,如果要将数据写入到文件中,可以这样:

public static void main(String[] args) {try {OutputStream out = new FileOutputStream("E:test.txt");out.write( new String("This is test.txt").getBytes() );} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}
}

这段代码执行后当文件不存在时,会自动创建一个文件,然后将内容写入文件中,如果文件润在将会覆盖文件的原内容。

注意:一定要在最后关闭流,如:

public static void main(String[] args) {OutputStream out = null;try {out = new FileOutputStream("E:test.txt");out.write( new String("This is test.txt").getBytes() );} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}finally{if(null != out){try {out.close();} catch (IOException e) {e.printStackTrace();}}}
}

将关闭流的操作放在finally块中可以保证不管是否出现异常都能执行关闭流的操作,OutputStream常用方法:

write(int b):一次写一个字节 b- 要写入的字节
write(byte[] b):一次写一个字节数组
write(byte[] b, int off,int len):一次写一部分字节数组
close():关闭此文件输出流并释放与此流有关的所有系统资源。此文件输出流不能再用于写入字节

再看看字符流,Reader和Writer是字符流的两个顶层父类,这是我在网上找的关于字符流的层次结构图:

Reader抽象类:

Reader抽象类是所有字符输入流的超类,它以字符为单位从数据源中读取数据,遇到错误时会引发 IOException 异常,常用的子类:

BufferedReader:字符缓冲输入流

InputStreamReader:字节流到字符流的桥接器

使用BufferedReader读取文件内容:

public static void main(String[] args) {try {Reader reader = new BufferedReader(new FileReader("E:test.txt"));int  n=0; StringBuffer sBuffer=new StringBuffer();while (n!=-1){n = reader.read();char by=(char) n;sBuffer.append(by);}System.out.println(sBuffer.toString());} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}
}

当然你也可以直接使用BufferedReader的readLine来读取内容,该方法每次读取一行内容,如果读到返回null就表示文件结束了。

使用InputStreamReader读取:

public static void main(String[] args) {try {InputStreamReader isr =new InputStreamReader(new FileInputStream("E:test.txt"), "GBK");BufferedReader br = new BufferedReader(isr);StringBuilder strb = new StringBuilder();while (true) {String line = br.readLine();if (line == null) {break;}strb.append(line);}System.out.println(strb);} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}
}

Writer抽象类:

Writer抽象类是所有字符输出流超类,它以字符为单位从数据写入数据源中,遇到错误时会引发 IOException 异常,常用的子类:

BufferedWriter:字符缓冲输出流

OutputStreamWriter:字符转换输出流

使用BufferedWriter输出:

public static void main(String[] args) throws Exception {//创建一个字符缓冲输出流对象BufferedWriter bw = new BufferedWriter(new FileWriter("E:test.txt")) ;//写数据bw.write("hello");bw.write("world");//刷新流bw.flush();//关闭资源bw.close();
}

使用OutputStreamWriter输出:

public static void main(String[] args) throws Exception {//创建一个字符缓冲输出流对象OutputStreamWriter bw = new OutputStreamWriter(new FileOutputStream("E:test.txt")) ;//写数据bw.write("hello");bw.write("world");//刷新流bw.flush();//关闭资源bw.close();
}

如果你觉得不错就分享出去

你也可以关注公众号,随时获取最新文章

PS:预计下月将在公众号做一波活动,可关注公众号回复暗号:“Java” 查看礼品~~

阅读越行 一路相伴

java inputstream read_Java学习之输入输出流相关推荐

  1. Java中IO流,输入输出流概述与总结(转载自别先生文章)

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  2. 1.1 Java流是什么?输入/输出流又是什么?

    在 Java 中所有数据都是使用流读写的.流是一组有序的数据序列,将数据从一个地方带到另一个地方.根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种. 在学习输入和输出流之前 ...

  3. Java IO (二),常见的输入/输出流

    字节流和字符流 InputStream和Reader InputStream和Reader两个抽象类是所有输入流的基类,本身并不能创建实例来执行输入,但它们将成为所有输入流的模板.他们的方法是所有输入 ...

  4. Java中IO流,输入输出流概述与总结

    1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的 ...

  5. java 对象读写_java 对象输入输出流读写文件的操作实例

    java 对象输入输出流读写文件的操作实例 java 支持对对象的读写操作,所操作的对象必须实现Serializable接口. 实例代码: package vo; import java.io.Ser ...

  6. java输入输出流_Java学习之输入输出流

    "持志如心痛,一心在痛上,岂有功夫说闲话,管闲事 --摘自阳明先生语录" Java中通过流来完成输入/输出,所有的输入/输出以流的形式处理,流可以理解为一个数据的序列.输入流表示从 ...

  7. java out.flush_java中基本输入输出流的解释(flush方法的使用)

    网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同:向客户传送数据与写入一个文件也没有什么区别. Java中输入 ...

  8. java对文件内容操作 -- 输入输出流

    目录 InputStream(输入字节流)和OutputStream(输出字节流) Reader(字符输入流)与Writer(字符输出流) Print 流 我们通过对File类的学习, 了解到File ...

  9. java输入输出及文件_java输入输出流及文件操作

    我只选择了一些代码 注意包声明和相关结构 许多类都继承了MyFile这个类 深入研究可以参考<java文件操作> 1.[代码]读取文件内容 /** *Author:Yuanhonglong ...

最新文章

  1. BestCoder Round #92 比赛记录
  2. qmake以及makefile总结
  3. linux 进程地址空间的一步步探究
  4. 俄罗斯最大搜索引擎Yandex开源了一款梯度提升机器学习库CatBoost
  5. linux fedora安装、运行mybase7.3.5报错:error while loading shared libraries: libpng12.so.0
  6. linux问题排查常用命令详解
  7. matlab中的:的优先级_内容早期设计:内容优先
  8. 想法记录---实时计算的TopN的实现
  9. 让网站变成灰色插件 可以设定特殊时间
  10. java web应用开发期末考试_Java开发工程师(Web方向) - 04.Spring框架 - 期末测试
  11. JWT实现Token认证
  12. 洛神云网络 SLB 负载均衡新姿势
  13. java 经纬度的距离计算工具包
  14. 软件人员kpi制定模板_员工绩效考核制度模板(餐厅绩效考核方案制定)
  15. 如何用python编程编一个可以盗qq的_利用 Python 编写一个类似 QQ 截图的小工具应该怎么入手?...
  16. 2019牛客多校第八场 BBeauty Values dp
  17. Unity材质:玻璃
  18. DevOps元素周期表——1号元素 Gitlab
  19. 绝对干货丨最值钱的20个管理工具,会用一半的已年薪百万
  20. Java封装libfacedetection做人脸检测

热门文章

  1. 毕业设计游戏类网站设计静态页面基于html,div+css+jquery(含源码)
  2. 凸包 Codeforces605C Freelancer's Dreams
  3. Improved 3D Object Detector Under Snowfall Weather Condition Based on LiDAR Point Cloud
  4. 【探花交友】保存用户信息、上传用户头像、用户信息管理
  5. 通过海康sdk实现指定时间段内的录像文件下载
  6. 我失业了,公司与我解除劳动合同关系
  7. geany设置运行linux,Linux强大IDE——Geany配置说明
  8. 快速上手UER-py
  9. 查询字符串中不含重复的最长子串
  10. java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署