zoukankan      html  css  js  c++  java
  • 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(); } } }
    结果:
    拷贝完毕
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    函数式编程之moand的作用
    函数式编程之构建--待完成
    函数式编程中的组合子
    函数式编程中的函数—函数式编程的多态
    swift函数式编程之compose
    swift的柯里化demo
    trait Monad:函数式编程类型系统本博客搜索关键字--类型升降
    函数式编程的三个核心问题:计算的构建、求值、关系
    金融危机是现有金融体制的重构和资产价格的重估
    代理模式:稳定的代理,可变的实现(替换)
  • 原文地址:https://www.cnblogs.com/penguin1024/p/11760091.html
Copyright © 2011-2022 走看看