fileinputstream
输入与输出
我们编写的程序除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身的数据发送到外界。比如,我们编写的程序想读取一个文本文件,又或者我们想将程序中的某些数据写入到一个文件中,这时我们就要使用输入与输出。
输入:输入是一个从外界进入到程序的方向,通常我们需要"读取"外界的数据时,使用输入。所有输入是用来读取数据的。
输出: 输出是一个从程序发送到外界的方向,通常我们需要"写出"数据到外界时,使用输出。所以输出是用来写出数据的。
节点流与处理流
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。
节点流:可以从或向一个特定的地方(节点)读写数据。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的连接。
通常节点流也称为低级流。
通常处理流也称为高级流或过滤流。
IS和OS常用方法
InputStream是所有字节输入流的父类,其定义了基础的读取方法,常用的方法如下:
int read()
读取一个字节,以int形式返回,该int值的"低八位"有效,若返回值为-1则表示EOF
int read(byte[] d)
尝试最多读取给定数组的length 个字节并存入该数组,返回值为实际读取到的字节量。
IS和OS常用方法
outputstream是所有字节输出流的父类,其定义了基础的写出方法,常用的方法如下:
void write(int d)
写出一个字节,写出是给定的int的"低八位"
void writer(byte[] d)
将给定的字节数组中的所有字节全部写出
文件流
FileOutputStream是文件的字节输出流,我们使用该流可以以字节为单位将数据写出文件。
构造方法:
FileOutputStream(File file):
创建一个向指定File对象表示的文件中写出数据的文件输出流。
FileOutputStream(String filename):
创建一个向具有指定名称的文件中写出数据的文件输出流。
这里需要注意,若指定的文件已经包含内容,那么当使用FOS对其写入数据时,会将该文件中原有数据全部清除。
测试构建FOS对象写文件
//创建文件字节输出流
FileOutputStream fos=new FileOutputStream("fos.dat");
//写出一组字节
fos.write("helloworld".getBytes());
fos.close();
创建FOS对象(追加模式)
通过上一节的构造方法创建的FOS对文件进行写操作时会覆盖文件中原有数据。若想在文件的原有数据之后追加新数据则需要以下构造方法创建FOS
构造方法:
FileOutputStream(File file,boolean APPend)
创建一个向指定File对象表示的文件中写出数据的文件输出流。
FileOutputStream(String filename,boolean append)
创建一个向具有指定名称的文件中写出数据的文件输出流。
以上两个构造方法中,第二个参数若为true,那么通过该FOS写出的数据都是在文件末尾追加的。
//创建文件字节输出流
FileOutputStream fos=new FileOutputStream(new File("fos.dat"),true);
//写出一组字节
fos.write("helloworld".getBytes());
fos.close();
创建FIS对象
fileinputstream是文件的字节输入流,我们使用该流可以以字节为单位从文件中读取数据。
FileInputStream有两个常用的构造方法:
FileInputStream(File file)
创建一个从指定File对象表示的文件中读取数据的文件输入流。
FileInputStream(String name)
创建用于读取给定的文件系统中的路径名name所指定的文件的文件输入流
FileInputStream fis=new FileInputStream("raf.dat");
int d=-1;
while((d=fis.read())!=-1){
System.out.print((char)d+" ");
}
fis.close();
read()和write(int d)方法
实现文件复制
FileInputStream fis=new FileInputStream("fos.dat");
FileOutputStream fos=new FileOutputStream("fos_copy1.dat");
int d=-1;
while((d=fis.read())!=-1){
fos.write(d);
}
System.out.println("复制完毕!");
fis.close();
fos.close();
read(byte[] d)和write(byte[] d)方法
FileInputStream也支持批量读取字节数据的方法:
int read(byte[] b)
从此输入流中将最多b.length个字节的数据读入到字节数组b中
FileOutputStream也支持批量写出字节数据的方法:
void write(byte[] d)
将b.length个字节从指定byte数组写入此文件输出流中。
void write(byte[] d,int offset,int len)
将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。
实现文件复制
FileInputStream fis=new FileInputStream("fos.dat");
FileOutputStream fos=new FileOutputStream("fos_copy2.dat");
int len=-1;
byte[] buf=new byte[32];
while((len=fis.read(buf))!=-1){
fos.write(buf,0,len);
}
System.out.println("复制完毕!")
fis.close();
fos.close();