文章目录
-
- 1. 概念
- 2. 字段
-
- 1. FileInputStream
- 2. FileOutputStream
- 3. 方法
-
- 1. 构造器
-
- 1. FileInputStream
- 2. FileOutputStream
- 2. 其他方法
-
- 1. FileInputStream
- 2. FileOutputStream
- 4. 案例
1. 概念
FileInputStream和FileOutputStream分别是文件输入流和文件输出流,主要是用于读取图像,图片等原始字节流数据,如果读取的是文本数据,考虑使用字符流FileReader和FileWriter
2. 字段
1. FileInputStream
- private final FileDescriptor fd:文件描述符,通过文件描述符可以操作文件
- private final String path:文件路径,如果流对象是通过有参构造中传入文件描述符方式来创建,则path为null
- private FileChannel channel = null:用于读写文件的通道
- private final Object closeLock = new Object():关闭锁对象,将会在close()方法中调用,保证多线程调用不会发生冲突
- private volatile boolean closed = false:流是否关闭,volatile保证了多线程对于字段更改的可见性
2. FileOutputStream
- private final FileDescriptor fd:表示的是文件描述符对象
- private final boolean append:表示的是现写入的数据是否覆盖文件中数据
- private FileChannel channel:表示的是读写文件的通道
- private final String path:文件的路径,如果是以文件描述符方法创建的输出流,path为null
- private final Object closeLock = new Object():关闭锁对象,将会在close()方法中调用,保证多线程调用不会发生冲突
- private volatile boolean closed = false:流是否关闭,volatile保证了多线程对于字段更改的可见性
3. 方法
1. 构造器
1. FileInputStream
- public FileInputStream(String name):通过关联到实际文件的方式创建FileInputStream,文件通过文件系统中的路径名name指定
- public FileInputStream(File file) :通过关联到实际文件的方式创建FileInputStream,文件通过文件系统中File对象来指定
- public FileInputStream(FileDescriptor fdObj):通过文件描述符的方式创建FileInputStream,文件描述符可以关联到对应文件
2. FileOutputStream
- public FileOutputStream(String name):通过关联到实际文件的方法创建FileOuputStream,文件是通过文件路径来指定
- public FileOutputStream(String name, boolean append):表示的是否覆盖已存在文件.true表示将写入的数据追到文件的尾部
- public FileOutputStream(File file):通过关联到实际文件的方法创建FileOuputStream.文件是通过文件对象来指定
- public FileOutputStream(File file, boolean append):表示的是否覆盖已存在文件.true表示将写入的数据追到文件的尾部
- public FileOutputStream(FileDescriptor fdObj):通过关联文件描述符来创建FileOutputStream,文件描述符关联到文件
2. 其他方法
1. FileInputStream
- public int read():从输入流中读取一个字节
- public int read(byte b[]):从输入流中读取最多b.length个字节到字节数组b中
- public int read(byte b[], int off, int len):从输入流中最多读取len个字节到字节数组b中off位置开始
- public long skip(long n):跳过n个字节,实际跳过的字节可能小于n(剩余字节小于n的情况)
- public int available():从输入流无阻塞地可读取的字节数
- public final FileDescriptor getFD():返回与流关联的文件描述符FileDescriptor对象
- public FileChannel getChannel():返回读取文件的通道,如果为null的情况下,会创建一个新的通道
- protected void finalize():确保没有引用文件的情况下调用close()方法
- public void close():关闭输入流,并且释放与此流有关的所有资源
2. FileOutputStream
- public void write(int b) :将单个字节写到输出流中
- public void write(byte b[]):将字节数组b写到输出流中
- public void write(byte b[], int off, int len) :将字节数组b的off位置开始,len个字节写到输出流中
- public void close() :关闭输出流,释放关联的所有的资源
- public final FileDescriptor getFD():返回与流关联的文件描述符FileDescriptor对象
- public FileChannel getChannel():返回读取文件的通道,如果为null的情况下,会创建一个新的通道
- protected void finalize():确保没有引用文件的情况下调用close()方法
4. 案例
public class FileTestDemo {
public static void main(String[] args) throws IOException{
testFileWrite();testFileRead();}private static void testFileWrite() throws IOException{
File file = new File("D:\\java.txt");FileOutputStream fos = new FileOutputStream(file);fos.write("helloworld".getBytes());FileDescriptor fd = fos.getFD();FileOutputStream fdfos = new FileOutputStream(fd);fdfos.write("I".getBytes());//设置append的值为true,表明不覆盖原文件,即在内容helloworld上追加内容FileOutputStream fifos = new FileOutputStream(file,true);fifos.write("12345".getBytes());fos.close();fdfos.close();fifos.close();}private static void testFileRead() throws IOException{
FileInputStream fis = new FileInputStream(new File("D:\\java.txt"));int read = fis.read();System.out.println("读取一个字节:"+(char)read);fis.close();FileInputStream bytefis = new FileInputStream("D:\\java.txt");byte[] b = new byte[1024];bytefis.read(b);System.out.println("读取一个字节数组:"+new String(b));bytefis.close();}
}//结果
读取一个字节:h
读取一个字节数组:helloworldI12345