FileOutputStream和FileInputStream分别继承自OutputStream和InputStream。
FileOutputStream有5个重载的构造方法,注意FileOutputStream是java.io.*包下的,使用时应该import java.io.FileOutputStream或直接import java.io.*其中前两个利用一个File对象来创建FileOutputStream对象,当此File对象不存在时,系统会按照File指定的路径自动创建该文件。此时向文件写入的内容会覆盖原来的内容。当append参数为true时,以追加方式向文件写入内容,即在文件结尾继续写入。后两个利用路径名来构造FileOutputStream对象,使用方法与前两个相似。
package com.sxu.cs.io;
import java.io.*;
public class FileOutputStreamConstrouctor {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = " use the second constructor(file,true)";
FileOutputStream out = null;
File file = new File("G:/input.txt");
try {
//FileOutputStream(File file, boolean append)
// 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
out = new FileOutputStream(file,true);
out.write(s.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(out != null)
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//当File指定的路径下文件不存在时,自动创建
String s1 = "firstly";
String s2 = "second";
FileOutputStream out1 = null;
File file1 = new File("G:/input1.txt");
try {
out1 = new FileOutputStream(file1);
out1.write(s1.getBytes());
out1.write(s2.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(out1 != null)
try {
out1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第三种构造方法是利用一个FileDescriptor对象来构造,关于FileDescriptor,可以参考http://www.fengfly.com/plus/view-214059-1.html
package com.sxu.cs.io;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
public class FDConstructor {
public static FileOutputStream out1 = null;
public static FileOutputStream out2 = null;
public static FileInputStream in = null;
public static FileInputStream inFD = null;
public static final String fileName = "G:/FD.txt";
public static void main(String[] args) {
// TODO Auto-generated method stub
testWrite();
testRead();
testStandFD();
}
/* 下面这段代码测试用FileDescriptor构造一个FileOutputStream对象
* 而且这个对象与其他FileOutputStream对象使用无区别*/
private static void testWrite(){
try {
out1 = new FileOutputStream(fileName,true);
FileDescriptor fd = out1.getFD();
out2 = new FileOutputStream(fd);
out1.write('A');
out2.write('a');
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(out1 != null)
try {
out1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(out2 != null)
try {
out2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/* 下面这段代码测试用FileDescriptor构造一个FileInputStream对象
* 而且这个对象与其他FileInputStream对象使用无区别*/
private static void testRead(){
try {
in = new FileInputStream(fileName);
FileDescriptor fd = in.getFD();
inFD = new FileInputStream(fd);
char a = (char)in.read();
System.out.println(a);
System.out.println((char)inFD.read());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(in != null)
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(inFD != null)
try {
inFD.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*下面的代码利用FileDescriptor.out构建FileOutputStream
* 再利用这个FileOutputStream构建一个PrintStream
* 再利用这个PrintStream输出一个字符串
* 实际上这段代码相当于System.out.println("hello,FileDescriptor")*/
private static void testStandFD(){
PrintStream out = new PrintStream(new FileOutputStream(FileDescriptor.out));
out.println("hello,FileDescriptor output");
out.close();
}
}
在利用FileDescriptor时,经常会抛出IOException下的stream closed异常,还没彻底搞懂这个异常。。。
FileInputStream有三个构造方法,使用方法与FileOutputStream相似