使用输入流通常包括4个基本步骤:
●设定输入流的源
●创建指向源的输入流
●让输入流读取源中的数据;
●关闭输入流
如果对文件读取需求比较简单,那么可以使用FileInputStream 类(文件字节输入流),该类是InputStream类的子类(以字节为单位读取文件),该类的实例方法都是从InputStream类继承来的。
构造方法
可以使用FileInputStream 类的下列构造方法创建指向文件的输入流。
FileInputStream(String name) ;
FileInputStream(File file) ;
第一个构造方法使用给定的文件名name创建FileInputStream 流
第二个构造方法使用File对象创建FileInputStream流。参数name和file指定的文件称为输入流的源
异常处理
使用输入流读取字节
输入流的目的是提供读取源中数据的通道,程序可以通过这个通道读取源中的数据,文件字节流可以调用从父类继承的read方法顺序地读取文件。
只要不关闭流,每次调用read方法就顺序地读取文件中的其余内容,直到文件的末尾或文件字节输入流被关闭。
字节输入流的read方法以字节为单位读取源中的数据。
●int read()
输入流调用该方法从源中读取单个字节的数据,该方法返回字节值(0~255之间的一个整数)
如果未读出字节就返回-1。
●int read(byte b[])
输入流调用该方法从源中试图读取b.length个字节到字节数组b中,返回实际读取的字节数目。
如果到达文件的末尾,则返回-1。
●int read(byte b[], int off, int len)
输入流调用该方法从源中试图读取len个字节到字节数组b中,并返回实际读取的字节数目。
如果到达文件的末尾,则返回-1
参数off指定从字节数组的某个位置开始存放读取的数据。
注: FileInputStream流顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。
关闭流
输入流都提供了关闭方法close(),尽管程序结束时会自动关闭所有打开的流,但是当程序使用完流后,显式地关闭任何打开的流仍是一个良好的习惯。
如果没有关闭那些被打开的流,那么就可能不允许另一个程序操作这些流所用的资源
例1:输出当前的代码
import java.io.*;
public class Example10_4 {
public static void main(String args[]) {
int n=-1;
byte [] a=new byte[100];
try{ File f=new File("Example10_4.java");
InputStream in = new FileInputStream(f);
while((n=in.read(a,0,100))!=-1) {
String s=new String(a,0,n);//获取b中读取的内容
System.out.print(s);
}
in.close();
}
catch(IOException e) {
System.out.println("File read Error"+e);
}
}
}
文件字 节输出流
使用输出流通常包括4个基本步骤:
●给出输出流的目的地;
●创建指向目的地的输出流;
●让输出流把数据写入到目的地;
●关闭输出流
如果对文件写入需求比较简单,那么可以使用FileOutputStream类(文件字节输出流),它是OutputStream 类的子类(以字节为单位向文件写入内容),该类的实例方法都是从OutputStream类继承来的。
➊构造方法
可以使用FileOutputStream类的下列具有刷新功能的构造方法创建指向文件的输出流
FileOutputStream (String name) ;
FileOutputStream(File file) ;
第一个构造方法使用给定的文件名name创建FileOutputStream流
第二个构造方法使用File对象创建FileOutputStream流。参数name和file指定的文件称为输出流的目的地
FileOutpuStream输出流开通一个到达文件的通道(目的地就是这个文件,输出流指向这个文件)。
需要特别注意的是,如果输出流指向的文件不存在,Java 就会创建该文件
如果指向的文件是已存在的文件,输出流将刷新该文件(使得文件的长度为0)
异常处理
可以使用FileOutputStream 类的下列能选择是否具有刷新功能的构造方法创建指向文件的输出流。
FileOutputStream (String name, boolean append) ;
FileOutputStream(File file, boolean append) ;
当用构造方法创建指向一个文件的输出流时,如果参数append取值true,输出流不会刷新所指向的文件(假如文件已存在),输出流的write的方法将从文件的末尾开始向文件写入数据
参数append取值false,输出流将刷新所指向的文件(假如文件已存在)
使用输出流写字节
输出流的目的是提供通往目的地的通道,程序可以通过这个通道将程序中的数据写入到目的地
文件字节流可以调用从父类继承的write方法顺序地写文件
FileOutStream流顺序地向文件写入内容,即只要不关闭流,每次调用write 方法就顺序地向文件写入内容,直到流被关闭。
字节输出流的write方法以字节为单位向目的地写数据。
**●void write(int n)
输出流调用该方法向目的地写入单个字节
●void write(byte b[])
输出流调用该方法向目的地写入一个字节数组
●void write(byte b[],int off,int len)给定字节数组中起始于偏移量off处取len个字节写到目的地
●void close() 关闭输出流
注: FileOutputStream 流顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容,直到流被关闭。
例2:将字符串写入到txt中
import java.io.*;
public class Example10_5 {
public static void main(String args[]) {
byte [] a = "新年快乐".getBytes();//字符串调用getBytes()方法使其存储在byte[]数组中
byte [] b = "Happy New Year".getBytes();
File file = new File("a.txt");//输出的目的地
try{
OutputStream out=new FileOutputStream(file); //指向目的地的输出流
System.out.println(file.getName()+"的大小:"+file.length()+"字节");//a.txt的大小:0字节
out.write(a); //向目的地写数据
out.close();
System.out.println(file.getName()+"的大小:"+file.length()+"字节");///a.txt的大小:12字节
out=new FileOutputStream(file,true); //append为真 准备向文件尾加内容
out.write(b);
System.out.println(file.getName()+"的大小:"+file.length()+"字节");///a.txt的大小:8字节
out.close();
}
catch(IOException e) {
System.out.println("Error "+e);
}
}
}
输入输出流的综合应用
需要提前建立好a.txt 并手动输入内容
import java.io.*;
public class Example10_6 {
public static void main(String args[]) {
File sourceFile = new File("a.txt"); //读取的文件
File targetFile = new File("b.txt"); //写入的文件
char c[] =new char[9]; //char型数组
try{
Writer out = new FileWriter(targetFile,true); //指向目的地的输出流
Reader in = new FileReader(sourceFile); //指向源的输入流
int n = -1;
while((n=in.read(c))!=-1) {
out.write(c,0,n);
}
out.flush();
out.close();
in.close();
}
catch(IOException e) {
System.out.println("Error "+e);
}
}
}