zoukankan      html  css  js  c++  java
  • Day 14:FileInputStream、FileOutputStream


    File类: 用于描述一个文件或者文件夹的。
     
    通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要使用IO流技术。
     
    IO流(Input Output)

    IO流解决问题: 解决设备与设备之间的数据传输问题。  内存--->硬盘   硬盘--->内存


    IO流技术:

      IO流分类:

        如果是按照数据的流向划分:输入流、输出流(判断方法:以当前程序为参考物,数据流向程序就是输入流,数据从程序流出就是输出流)   

        如果按照处理的单位划分:

            字节流:字节流读取得都是文件中二进制数据,读取到二进制数据不会经过任何的处理。
           字符流:字符流读取的数据是以字符为单位的 。 字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能 识别的字符。 
             字符流 = 字节流 + 解码
        
        输入字节流:
          InputStream 所有输入字节流的基类抽象类
          FileInputStream  读取文件数据的输入字节流
       
          使用FileInputStream读取文件数据的步骤:
             1. 找到目标文件
             2. 建立数据的输入通道。
             3. 读取文件中的数据。
             4. 关闭资源

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class Demo1 {
        
            public static void main(String[] args) throws IOException {
                readTest1();
            }
            //读取的方式1    缺陷: 无法读取完整一个文件的数据.
            public static void readTest1() throws IOException{
                //1. 找到目标文件
                File file = new File("F:\a.txt");
                //建立数据的输入通道。
                FileInputStream fileInputStream = new FileInputStream(file);
                //读取文件中的数据
                int content = fileInputStream.read(); // read() 读取一个字节的数据,把读取的数据返回。
                System.out.println("读到的内容是:"+ (char)content);
                //关闭资源    实际上就是释放资源。 
                 fileInputStream.close();
             /*
            //方式2 : 使用循环读取文件的数据
            public static void readTest2() throws IOException{
                long startTime = System.currentTimeMillis();
                //找到目标文件
                File file = new File("F:\图片\1.jpg");
                //建立数据的输入通道
                FileInputStream fileInputStream = new FileInputStream(file);
                //读取文件的数据
                int content = 0; //声明该变量用于存储读取到的数据
                while((content = fileInputStream.read())!=-1){
                    System.out.print((char)content);
                }
                //关闭资源
                fileInputStream.close();
                
                long endTime = System.currentTimeMillis();
                System.out.println("读取的时间是:"+ (endTime-startTime)); //446
            } 
                 
             
            //方式3:使用缓冲数组读取。    缺点: 无法读取完整一个文件的数据。
            public static void readTest3() throws IOException{
                //找到目标文件
                File file = new File("F:\a.txt");
                //建立数据的输入通道
                FileInputStream fileInputStream = new FileInputStream(file);
                //建立缓冲字节数组,读取文件的数据。
                byte[] buf = new byte[1024];  //相当于超市里面的购物车。
                int length = fileInputStream.read(buf); // 如果使用read读取数据传入字节数组,那么数据是存储到字节数组中的,而这时候read方法的返回值是表示的是本次读取了几个字节数据到字节数组中。
                System.out.println("length:"+ length);
                
                //使用字节数组构建字符串
                String content = new String(buf,0,length);
                System.out.println("内容:"+ content);
                //关闭资源
                fileInputStream.close();
            }
        
            //方式4:使用缓冲数组配合循环一起读取。
            public static void readTest4() throws IOException{
                long startTime = System.currentTimeMillis();
                //找到目标文件
                File file = new File("F:\美女\1.jpg");
                //建立数据的输入通道
                FileInputStream fileInputStream = new FileInputStream(file);
                //建立缓冲数组配合循环读取文件的数据。
                int length = 0; //保存每次读取到的字节个数。
                byte[] buf = new byte[1024]; //存储读取到的数据    缓冲数组 的长度一般是1024的倍数,因为与计算机的处理单位。  理论上缓冲数组越大,效率越高
                while((length = fileInputStream.read(buf))!=-1){ // read方法如果读取到了文件的末尾,那么会返回-1表示。
                    System.out.print(new String(buf,0,length));
                }
                //关闭资源
                fileInputStream.close();
                long endTime = System.currentTimeMillis();
                System.out.println("读取的时间是:"+ (endTime-startTime)); //446
            }*/
        }
            
    }


     Q: 读取完一个文件的数据的时候,我不关闭资源有什么影响?
     A: 资源文件一旦 使用完毕应该马上释放,否则其他的程序无法对该资源文件进行其他 的操作。

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Arrays;
    
    public class Demo2 {
    
        public static void main(String[] args) throws IOException {
            //找到目标文件
            File file = new File("F:\day18-day21.IO.doc");
            //建立数据的输入通道
            FileInputStream fileInputStream = new FileInputStream(file);
            //建立缓冲字节数组读取文件
            byte[] buf = new byte[8];
            int length = 0 ;
            
            while((length = fileInputStream.read(buf))!=-1){
                System.out.print(new String(buf));  // aaaa   bbba  bbb' '
    //        System.out.println(Arrays.toString(buf));
            }
            //释放文件资源
            fileInputStream.close();
        }
    }

     输出字节流:

      OutputStream 是所有输出字节流 的父类。  抽象类

        FileOutStream 向文件输出数据的输出字节流。
     
    FileOutputStream如何使用呢?
       1. 找到目标文件
       2. 建立数据的输出通道。
       3. 把数据转换成字节数组写出。
       4. 关闭资源

    FileOutputStream要注意的细节:
       1. 使用FileOutputStream 的时候,如果目标文件不存在,那么会自动创建目标文件对象。
       2. 使用FileOutputStream写数据的时候,如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据。
       3.使用FileOutputStream写数据的时候, 如果目标文件已经存在,需要在原来数据基础上追加数据的时候应该使用new FileOutputStream(file,true)构造函数,第二参数为true。
       4.使用FileOutputStream的write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是
          把低八位的二进制数据写出,其他二十四位数据全部丢弃。
     
      00000000-000000000-00000001-11111111   511
      
      11111111---> -1

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Demo3 {    
        public static void main(String[] args) throws IOException {
            writeTest3();
        }
        //使用字节数组把数据写出。
        public static void writeTest3() throws IOException{
            //找到目标文件
            File file = new File("F:\b.txt");
            //建立数据输出通道
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            //把数据写出。
            String data = "abc";
            byte[] buf = data.getBytes();
            fileOutputStream.write(buf, 0, 3); // 0 从字节数组的指定索引值开始写, 2:写出两个字节
            //关闭资源
            fileOutputStream.close();
        }
        //使用字节数组把数据写出。
        public static void writeTest2() throws IOException{
            //找到目标文件
            File file = new File("F:\b.txt");
            //建立数据输出通道
            FileOutputStream fileOutputStream = new FileOutputStream(file,true);
            //把数据写出。
            String data = "
    hello world";
            fileOutputStream.write(data.getBytes());
            //关闭资源
            fileOutputStream.close();
        }
        //每次只能写一个字节的数据出去。
        public static void writeTest1() throws IOException{
            //找到目标文件
            File file = new File("F:\b.txt");
            //建立数据的输出通道
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            //把数据写出
            fileOutputStream.write('h');
            fileOutputStream.write('e');
            fileOutputStream.write('l');
            fileOutputStream.write('l');
            fileOutputStream.write('o');
            //关闭资源
            fileOutputStream.close();
        }
    }


    使用FileOutputStream的write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是
    把低八位的二进制数据写出,其他二十四位数据全部丢弃。

     00000000-000000000-00000001-11111111   511

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Arrays;
    
    public class Demo4 {
        
        public static void main(String[] args) throws IOException {
            readTest();
        }
        
        public static void readTest() throws IOException{
            //找到目标文件
            File file = new File("F:\c.txt");
            //建立数据的输入通道
            FileInputStream fileInputStream = new FileInputStream(file);
            //建立缓冲输入读取文件数据
            byte[] buf = new byte[4];
            //读取文件数据
            int length = fileInputStream.read(buf);
            System.out.println("字节数组的内容:"+ Arrays.toString(buf));
            //关闭资源
            fileInputStream.close();
        }
        public static void writeTest() throws FileNotFoundException, IOException {
            //找到目标文件
            File file = new File("F:\c.txt");
            //建立数据的输出通道
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            //把数据写出
            fileOutputStream.write(511);
            //关闭资源
            fileOutputStream.close();
        }
    }
  • 相关阅读:
    Http 请求处理流程
    ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效
    Android Animation学习笔记【转载】
    Http Handler 介绍
    对路径XXX的访问被拒绝(文件操作权限)的解决方法
    控制页面滚动条
    Sqlserver查询字段默认值
    Ajax基础
    浮动&定位
    定时器
  • 原文地址:https://www.cnblogs.com/JYDesigner/p/9389366.html
Copyright © 2011-2022 走看看