文件字节输入流
使用输入流通常包括4个基本步骤:
设定输入流的源;
创建指向源的输入流;
让输入流读取源中的数据;
关闭输入流。
如果对文件读取需求比较简单,那么可以使用FileInputStream类(文件字节输入流),该类时InputStream类的子类,该类的实例方法都是从InputStream类继承来的。
1.构造方法
可以使用FileInputStream类的下列构造方法创建指向文件的输入流。
FileInputStream(String name);
FIleInputStream(File file);
第一个构造方法使用给定的文件名name创建FileInputStream流,第二个构造方法使用File对象创建FileInputStream流。参数name和file指定的文件称为输入流的源。
FileInputStream输入流打开一个达到文件的通道(源就是这个文件,输入流指向这个文件)。当创建输入流时,可能会出现错误。例如,输入流指向的文件不存在。当出现I/O错误,java生成一个错误信号,它使用IOException(IO异常)对象来表示这个错误信号。程序必须在try-catch语句中的try块部分创建输入流,在catch块部分捕获并处理这个异常。
2.使用输入流读取字节
输入流的目的是提供读取源中的通道,程序可以通过这个通道读取源中的数据。文件字节流可以调用从父类继承的read方法顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取文件中的其余内容,知道文件的末尾或文件字节输入流被关闭。
字节输入流的read方法以字节为单位读取源中的数据。
int read()输入流调用该方法从源中读取单个字节的数据,该方法返回字节值,如果未读出就返回-1。
int read()输入流调用该方法从源中视图读取b.length()个字节到字节数据b中,返回实际读取的字节数目,如果到达文件的末尾,则返回-1.
int read(byte b[], int off, int len)输入流调用该方法从源中试图读取len个字节到字节数据b中,并返回实际读取的字节数目。如果到达文件末尾,则返回-1,参数off指定从字节数据的某个位置开始存放读取的数据。
FileInputStream流顺序的读取文件,只要不关闭流,每次调用read方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。
3.关闭流
输入流都提供了关闭方法close(),尽管程序结束时会自动关闭所有打开的流,但是当程序使用完流后,显式地关闭任何打开的流。如果没有关闭那些被打开的流,那么就可能不允许另一个程序操作这些流所用的资源。
代码展示如下所示:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class Test05 { public static void main(String[] args) { // TODO Auto-generated method stub int n = -1; byte [] a = new byte[100]; try{ File file = new File("F:/workspace1/Test01/src/pack08/Test05.java"); FileInputStream in = new FileInputStream(file);
//FileInputStream in = new FileInputStream("F:/workspace1/Test01/src/pack08/Test05.java");
//上面这条语句也是可以的
while((n = in.read(a, 0, 100)) != -1) { String str = new String(a, 0, n); System.out.println(str); } in.close(); } catch(IOException e) { System.out.println("File read Error" + e); } } }
运行结果如下所示:
将该Test05.java文件中的代码全部输出。
String str = new String(a, 0, n);
注意这条语句中读入数组a中的n,不可以用100.
文件字节输出流
使用输出流通常包括4个基本步骤:
给出输出流的目的地;
创建指向目的地的输出流;
让输出流把数据写入到目的地;
关闭输出流。
如果对文件写入要求比较简单,那么可以使用FileOutputStream类(文件字节输出流),它是OutputStream类的子类(以字节为单位向文件写入内容),该类的实例方法都是从OutputStream类继承的。
1.构造方法
可以使用FileOutputStream类的下列具有刷新功能的构造方法创建指向文件的输出流。
FileOutputStream(String name);
FileOutputStream(File file);
第一个构造方法使用给定的文件名name创建FileOutputStream流,第二个构造方法使用File对象创建FileOutputStream流。参数name和file指定的文件称为输出流的目的地。
FileOutputStream输出流开通一个到达文件的通道(目的地就是这个文件,输出流指向这个文件)。需要特别注意的是,如果输出流指向的文件不存在,java就会创建该文件,如果指向的文件是已存在的文件,输出流将刷新该文件(清空文件中原有的内容)。
另外,与创建输入流相同,创建输出流时,可能会出现错误(被称为异常),例如,输出流试图要写入的文件可能不允许操作或有其他受限等原因。所以需要用try-catch语句抛出异常并捕获检测异常。
可以使用FileOutputStream类的下列能选择是否具有刷新功能的构造方法创建指向文件的输出流。
FileOutputStream(String name, boolean append);
FileOutputStream(File file, boolean append);
当用构造方法创建指向一个文件的输出流时,如果参数append取值true,输出流不会刷新所指向的文件(假如文件已存在),输出流的write的方法将从文件的末尾开始向文件写入数据,参数append取值false,输出流将刷新所指向的文件(假如文件已存入)。
2.使用输出流写字节
输出流的目的是提供通往目的地的通道,程序可以通过将程序中的数据写入到目的地。文件字节流可以调用从父类继承的write方法顺序地写文件。FileOutputStream流顺序地向文件写入内容,即只要不关闭流,每次调用write方法就顺序地向文件写入内容,直到流被关闭。
字节输出流的write()方法以字节为单位向目的地写数据。
void write(int n) 输出流调用流方法向目的地写入单个字节。
void wirte(byte b[]) 输出调用方法向目的地写入一个字节数组。
void write(byte b[], int off, int len) 给定字节数组中起始于偏移量off处取len个字节写到目的地。
void close()关闭输出流。
3.关闭流
需要注意的是,在操作系统把程序缩写到输出流上的那些字节保存到磁盘上之前,有时被存放在内存缓存区中,通过调用close()方法,可以保证操作系统把流缓冲区的内容写到它的目的地,即关闭输出流可以把该流所用的缓冲区的内容冲洗掉。
代码展示如下所示:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
byte [] a = "新年快乐".getBytes();
byte [] b = "Happy New Year".getBytes();
File file = new File("F:/workspace1/Test01/src/pack08/test.txt");
try{
OutputStream out = new FileOutputStream(file);
out.write(a);
out.close();
out = new FileOutputStream(file, true);
out.write(b, 0, b.length);
out.close();
}
catch(IOException e)
{
System.out.println();
}
}
}
运行之后,截图如下所示:
如果将语句
out = new FileOutputStream(file, true);
改成
out = new FileOutputStream(file, false);
运行结果如下所示: