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

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. c语言和画图软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  2. Unity Shaders
  3. 利用oracle快照dblink解决数据库表同步问题
  4. php如何定义的数位置,php如何实现不借助IDE快速定位行数或者方法定义的文件和位置...
  5. SQL基础操作_2_操作多个表
  6. Spring SetFactoryBean实例
  7. 程序员养生之道——坚持泡脚(十五分钟以上)
  8. html area图片热点
  9. Java通过Executors提供四种线程池
  10. oracle10g如何导出dmp,Oracle 10g dmp文件的导入导出
  11. linux中如何设置用户自己的工作环境,Linux系统下设置用户登录环境
  12. 将DW数据窗口导出为EXCEL文件的方法(整理)
  13. Python实现pdf转图片
  14. 历史双色球数据分析---python
  15. 【应用笔记】APM32F4xx_ADC应用笔记
  16. python openpyxl创建excel文件,自己选择excel保存的位置
  17. python常用工具类
  18. launchOptions利用userActivity呼起app设置
  19. 【Python】Python之禅
  20. 东莞UG编程培训、UG拆铜公教程、CNC电脑锣数控编程培训

热门文章

  1. 谷歌浏览器开发工具调试样式
  2. iOS上架appstore详细教材
  3. 艾司博讯:在拼多多开店都有什么步骤
  4. EndNote 毕业论文开题报告 批量导入 参考文献
  5. 搭建各类游戏如何选择合适的服务器
  6. 解决Cadence 17.4软件无法启动,capture cis启动缓慢,打开项目缓慢,allegro 打开程序未响应(即使微软拼音切换兼容模式也无法解决的情况)
  7. Android之APP跳转到权限设置界面适配华为、小米、vivo等
  8. 天池数据竞赛docker提交操作学习
  9. Building dependency tree… Done Package aptitude is not available, but is referred to by another pac
  10. 【最优化算法】基于【MATLAB】的拟牛顿法【Quasi Newton method】分析与推导