FileIntputStream / FileOutputStream 类


FileInputStream类(重点)
 
 
(1)基本概念
java.io.FileInputStream类用于读取诸如图像之类的原始字节流。
 
(2)常用的方法
FileInputStream(String name) - 根据参数指定的文件进行关联并创建对象。
int read( ) - 用于读取一个字节数据,返回-1表示读到文件末尾,否则返回数据。
int read(byte[] b) - 用于读满整个字节数组。 若读到文件尾就返回-1,否则返回实际读取的字节数。
int read(byte[] b, int off, int len) - 用于读满字节数组的一部分空间。
void close( ) - 关闭流并释放资源。

代码1:读取 E:/abc.txt 路径下的 abc.txt文档文件 内容是: abcd
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class FileInputStreamTest {

    public static void main(String[] args) {
        
        try {
            
            // 1.创建FileInputStream类 的对象 与指定的文件关联 (相当于管道)
            FileInputStream fis = new FileInputStream("E:\abc.txt");
            
            // 2. 读取文件中的内容 并且打印出来
             
            
            int res = 0;
            
            while((res= fis.read())!=-1) {   // 当     (res= fis.read())= -1 时,表示已经读完文件中的字节了
                
                System.out.println("打印出读出的内容(int类型的ASCII码值): "+res);
                System.out.println("打印出读出的字节内容(强转成char类型): "+(char)res);
                System.out.println();
            }
            
            
        
        
        // 3.关闭流对象 并释放资源
        fis.close();
        
            
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
结果:
打印出读出的内容(int类型的ASCII码值): 97
打印出读出的字节内容(强转成char类型): a

打印出读出的内容(int类型的ASCII码值): 98
打印出读出的字节内容(强转成char类型): b

打印出读出的内容(int类型的ASCII码值): 99
打印出读出的字节内容(强转成char类型): c

打印出读出的内容(int类型的ASCII码值): 100
打印出读出的字节内容(强转成char类型): d
代码2:
package com.monkey1024;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class FileInputStreamTest {

    public static void main(String[] args) {
        
        try {
            
            // 1.创建FileInputStream类 的对象 与指定的文件关联 (相当于管道)
            FileInputStream fis = new FileInputStream("E:\abc.txt");
            
            // 2. 读取文件中的内容 并且打印出来
             
 
            
            
            byte[] data    = new byte[10];  //创建一个byte类型的数组
            
            int res = fis.read(data);
            System.out.println("实际读取到的数据大小是: "+res+",读取到的文内内容是:"+new String(data, 0, res) +"!");  
//String中有个构造方法String(byte[] bytes)
//
String(int[] codePoints, int offset, int count)
          // 分配一个新的 String,它包含 Unicode 代码点数组参数一个子数组的字符。
// 3.关闭流对象 并释放资源 fis.close(); } catch (Exception e) { e.printStackTrace(); } } }
 
结果:
实际读取到的数据大小是: 4,读取到的文内内容是:abcd!

FileOutputStream类(重点)
 
1.基本概念
java.io.FileOutputStream类主要用于将字节流数据写入到输出流中。
 
2.常用的方法
FileOutputStream(String name) - 按照参数指定的路径构造对象。
FileOutputStream(String name, boolean append) - 按照追加的方式构造对象与指定的路径关联。
 
void write(int b) - 写入单个字节。
void write(byte[ ] b, int off, int len) - 写入数组中的一部分字节数据。
void write(byte[ ] b) - 写入整个数组的字节数据。
void flush() - 刷新输出流并强制写入缓冲数据。
void close() - 关闭输出流并释放资源。
 
 代码1:
 
import java.io.FileOutputStream;

public class FileOutputStreamTest {

    public static void main(String[] args) {
        try {
            
            // 1.创建FileOutputStream类的对象,与指定的文件关联
            // 若文件不存在,则 自动创建新的空文件
            // 若文件存在,  则 清空文件中的原有内容
            
            FileOutputStream fos = new FileOutputStream("e:/hello.txt");
            
            
            // 2. 使用write()可以向文件中 写入数据
            fos.write(97);  // a
            fos.write(98);  // b
            fos.write(99);  // c
            fos.write("hello".getBytes());   // 转换成字符数组
            System.out.println("数据写入成功.....");
            
            // 3.关闭流操作
            fos.flush();
            fos.close();          
        } catch (Exception e) {
            e.printStackTrace();
        }
             
    }
}

 结果:

数据写入成功.....

 注意:

    // FileOutputStream fos = new FileOutputStream("e:/hello.txt",true);
在后面加 true,这样写的意思:
-若文件存在, 则向文件中追加新的数据内容;
-若文件不存在,则自动创建新的空文件

 
三、演示 拷贝文件
 
方式一:
package com.monkey1024;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileCopyTest {

    public static void main(String[] args) {
        
        try {
            // 1.创建FileInputStream类的对象,指向源文件 (读文件)
            FileInputStream fis = new FileInputStream("E:\reader.txt");
            
            // 2.创建FileOutputStream类的对象,指向目标文件 (写文件)
            
            FileOutputStream fos = new FileOutputStream("E:\readerCopy.txt");
            
            // 3.读一个字节,写一个字节
// 不断地读取源文件中的内容 并且 写入到 目标文件中
// 这样可以实现文件的拷贝,但是 文件比较大的时候,效率低下
int res = 0; while((res =fis.read())!= -1) { fos.write(res);// } // 4.关闭流操作 fis.close(); fos.close(); System.out.println("拷贝完毕"); } catch (Exception e) { e.printStackTrace(); } } }
结果:
拷贝完毕
 
方式二:
根据源文件的大小准备对应的缓冲区(数组),可能导致内存溢出
 
方式三:
无论文件大小是多少,每次都准备一个1024整数倍的数组
package com.monkey1024;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileCopyTest {

    public static void main(String[] args) {
        
        try {
            // 1.创建FileInputStream类的对象,指向源文件 (读文件)
            FileInputStream fis = new FileInputStream("E:\reader.txt");
            
            // 2.创建FileOutputStream类的对象,指向目标文件 (写文件)
            
            FileOutputStream fos = new FileOutputStream("E:\readerCopy.txt");
            
            // 3.无论文件大小是多少,每次都准备一个1024整数倍的数组
// 这样做,效率高太多
byte[] data = new byte[1024*8]; int res = 0; while((res = fis.read(data)) != -1){ fos.write(data,0,res); } // 4.关闭流操作 fis.close(); fos.close(); System.out.println("拷贝完毕"); } catch (Exception e) { e.printStackTrace(); } } }
结果:
拷贝完毕
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/penguin1024/p/11760091.html