您的位置:首页 > 编程语言 > Java开发

JavaSE_46th_IO流

2017-03-18 20:24 197 查看
一、IO流

在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