JavaSE_46th_IO流
2017-03-18 20:24
197 查看
一、IO流
在Java程序中,对于数据的输入/输出操作以“流”(stream)方式进行,J2SDK提供了各种各样的“流”类控制,用以获取不同种类的数据。程序中通过标准的方法输入或输出数据。
java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同的角度对其进行分类:
1)按数据流的方向不同可以分为输入流和输出流。
2)按处理数据单位不同可以分为字节流和字符流。
3)按照功能不同可以分为节点流和处理流。
J2SDK所提供的所有流类型位于包java.io内,都分别继承自以下四种抽象流类型:
![](https://img-blog.csdn.net/20170318202414735)
FileInputStream类的对象fis可以认为是一个管道,可以从一个文件中抽取数据,
FileOutputStream类的对象fos也可以认为是一个管道,可以把数据注射到一个文件中。
1.先让fis和fos都指向一个空对象
FileInputStream fis = null;
FileOutputStream fos = null;
2.进入try-catch语句块,
fis = new FileInputStream("D:\\myFile\\test.txt");
FileOutputStream fos = new FileOutputStream("E:\\copy.txt");
3.循环读取
1)第一次使用fis.read()方法时,将读取文件中的第一个字节,并返回该字节的数值,返回值为int,要打印该字节的内容时,可将返回值强制类型转换为char。
2)要将读取到的内容写到另一个文件中时,可调用fos.write(c),c是fis.read()的返回值。
3)下一次调用fis.read()时,流将读取文件中的第二个字符,直到读取到文件末尾,将返回-1。
4.在finally语句中关闭文件
1)为什么在finally语句中关闭流?
为了照顾到下列三种情况:
①如果流对象fis或fos实例化成功,读写过程中也没有发生异常,将直接进入finally语句,直接关闭流。
②如果流对象fis或fos实例化成功,但在读写过程中发生异常,将进入catch语句,如果程序没有退出,将会进入finally,把流关闭。
③如果流对象fis或fos实例化失败,将进入catch语句,如果程序没有退出,也将进入finally,如果fis或fos依然指向空对象,就没有流可以关闭。
2)在关闭流之前,通过判断fis、fos是否为空来决定是否调用close()方法。
3)在关闭流时也可能发生异常,因此在finally语句中依然要try-catch。
注:
为什么流对象的定义和实例化要分开?
下面以fis为例:
凡是涉及文件IO操作(fis可能实例化失败(如指定位置的文件不存在))的语句块都必须写在try-catch语句中,
现在在try语句中定义和实例化fis如下:
FileInputStream fis = new FileInputStream("D:\\myFile\\test.txt");
fis的作用域仅为try语句,当我们要在finally语句中使用fis.close()方法关闭管道(关闭流)的时候,编译器会无法识别fis变量。
凡是与文件IO有关的语句块都必须要try-catch,也包括fis的实例化,如果我们将定义和实例化都放在try语句中,将使得fis的作用域仅限于try语句,这会导致在try语句之外,流是无法关闭的。最好的解决办法就是在try语句之前就定义fis变量为main函数的局部变量,这就是为什么要在try语句之前定义fis流对象,而在try语句内部才实例化fis的原因。
不仅是txt格式的文件可以被拷贝,图片文件也可以使用这种方法被拷贝。
在Java程序中,对于数据的输入/输出操作以“流”(stream)方式进行,J2SDK提供了各种各样的“流”类控制,用以获取不同种类的数据。程序中通过标准的方法输入或输出数据。
java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同的角度对其进行分类:
1)按数据流的方向不同可以分为输入流和输出流。
2)按处理数据单位不同可以分为字节流和字符流。
3)按照功能不同可以分为节点流和处理流。
J2SDK所提供的所有流类型位于包java.io内,都分别继承自以下四种抽象流类型:
package cn.hpe.io; import java.io.*; public class TestFileInputStream { public static void main(String[] args) { FileInputStream fis = null; FileOutputStream fos = null; try { /* 1.创建输入流对象 */ fis = new FileInputStream("D:\\test.txt"); /* 2.创建输出流对象 */ fos = new FileOutputStream("D:\\copy.txt", true); /* 3.定义一个变量c接收读取到的字符 */ int c = 0; int count = 0; //记录字符个数 /* 4.通过输入流对象fis从指定文件读出一个字符,如果不为-1, * 则将读到的字符通过输出流对象fos写入到指定文件 ,以此循环操作 * */ for(c = fis.read(); c != -1; c = fis.read()) { fos.write(c); count++; } System.out.println("文件复制完成,共复制" + count +"个字符,请查看文件。"); } catch(FileNotFoundException e) { System.out.println("没有找到指定文件"); System.exit(-1); } catch(IOException e) { e.printStackTrace(); } finally { /* 5.关闭文件 */ try { if(fis != null) { fis.close(); } if(fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
FileInputStream类的对象fis可以认为是一个管道,可以从一个文件中抽取数据,
FileOutputStream类的对象fos也可以认为是一个管道,可以把数据注射到一个文件中。
1.先让fis和fos都指向一个空对象
FileInputStream fis = null;
FileOutputStream fos = null;
2.进入try-catch语句块,
fis = new FileInputStream("D:\\myFile\\test.txt");
FileOutputStream fos = new FileOutputStream("E:\\copy.txt");
3.循环读取
1)第一次使用fis.read()方法时,将读取文件中的第一个字节,并返回该字节的数值,返回值为int,要打印该字节的内容时,可将返回值强制类型转换为char。
2)要将读取到的内容写到另一个文件中时,可调用fos.write(c),c是fis.read()的返回值。
3)下一次调用fis.read()时,流将读取文件中的第二个字符,直到读取到文件末尾,将返回-1。
4.在finally语句中关闭文件
1)为什么在finally语句中关闭流?
为了照顾到下列三种情况:
①如果流对象fis或fos实例化成功,读写过程中也没有发生异常,将直接进入finally语句,直接关闭流。
②如果流对象fis或fos实例化成功,但在读写过程中发生异常,将进入catch语句,如果程序没有退出,将会进入finally,把流关闭。
③如果流对象fis或fos实例化失败,将进入catch语句,如果程序没有退出,也将进入finally,如果fis或fos依然指向空对象,就没有流可以关闭。
2)在关闭流之前,通过判断fis、fos是否为空来决定是否调用close()方法。
3)在关闭流时也可能发生异常,因此在finally语句中依然要try-catch。
注:
为什么流对象的定义和实例化要分开?
下面以fis为例:
凡是涉及文件IO操作(fis可能实例化失败(如指定位置的文件不存在))的语句块都必须写在try-catch语句中,
现在在try语句中定义和实例化fis如下:
FileInputStream fis = new FileInputStream("D:\\myFile\\test.txt");
fis的作用域仅为try语句,当我们要在finally语句中使用fis.close()方法关闭管道(关闭流)的时候,编译器会无法识别fis变量。
凡是与文件IO有关的语句块都必须要try-catch,也包括fis的实例化,如果我们将定义和实例化都放在try语句中,将使得fis的作用域仅限于try语句,这会导致在try语句之外,流是无法关闭的。最好的解决办法就是在try语句之前就定义fis变量为main函数的局部变量,这就是为什么要在try语句之前定义fis流对象,而在try语句内部才实例化fis的原因。
不仅是txt格式的文件可以被拷贝,图片文件也可以使用这种方法被拷贝。
相关文章推荐
- 一、javaSE (二十)递归、IO流、自学字符流
- 黑马程序员----JAVASE之IO流操作【字符流】
- JavaSE复习之十 高级特性:IO流和文件 补充(1)
- 学习笔记之JavaSE(41)--IO流3
- JavaSE 学习参考:IO流之字节流
- JavaSE学习总结第20天_IO流2
- 【JavaSE基础】------IO流【一】
- JAVASE----16----IO流_3
- JAVASE基础 Item -- IO流之字节流
- 一、javaSE (二十一)字符流、IO流小结、案例
- [javaSE] IO流(装饰设计模式)
- 黑马程序员----JAVASE之IO流操作【字节流】
- JavaSE复习_11 IO流复习
- JavaSe基础XX18——IO流_3
- JavaSE学习总结第21天_IO流3
- ——JAVASE-IO流(上)
- JavaSE实战——IO流
- JavaSE IO流
- ——JAVASE-IO流(下)
- [javaSE] IO流(RandomAccessFile)