javaSE I/O流—— 各种各样的流

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaSE I/O流—— 各种各样的流相关的知识,希望对你有一定的参考价值。

一、Java IO

1. 关于C++在I/O流上的操作,之前也整理过一点。

C语言fputs fgets fputc fgetc fscanf fprintf及fopen操作的整理_玛丽莲茼蒿的博客-CSDN博客_fgetc fscanf最近写了一些文件操作的程序,频繁使用下面的函数。所以整理一下。一、fopen函数fopen函数的一般用法FILE *f;if((f=fopen("1.txt","这里写文件操作"))==NULL) printf("Open file failed\\n");1.以只读方式打开文件。fopen第二个参数为r。要求文件“1.txt”必须存在,不存在的话只读方式不会帮你创建的FILE *f;if((f=fopen("1.txt","r"))==NULL) //打开只读文件phttps://blog.csdn.net/qq_44886213/article/details/1173658072. 输入是输出是相对来说的(一个程序和文件进行通信,文件的输出对于程序来说是输入),那我们站位在什么角度呢?

答:站位在程序(内存)的角度。内存读取文件叫输入,往文件里写东西叫输出。

3. 一般I/O有两种

以前接触过的是对文件的I/O,还有一种是网络传输,两个网络设备之间的I/O。

4. 流的分类

 理解节点流和处理流:从进行I/O的两方之间简单建立起来的I/O流叫节点流。如果想让这个节点流传输得更快或者更安全,就要在这个节点流外面再包一层流,叫处理流

5. IO流的体系

四个抽象基类:

字节流:InputStream、OutputStream

字符流:Reader 、Writer

 哪些是重点呢?

6、在Main函数中和Test单元测试中,文件路径是不同的

二、访问文件的4个节点流

2.1 FileReader

1、 FileReader类记忆点

  • 为了保证close操作一定执行,需要使用try-catch-finally
  • 读入的文件一定要存在。不然在调用new FileReader的时候会报“FileNotFound”异常

2、 FileReader类常用方法

(1)构造方法

FileReader fr = new FileReader(file);

(2)int read()

一次只能读一个字符,直接作为返回值返回。

注意:返回的不是char类型,而是char对应的int。返回值-1时,表示读到文件末尾

(3)int read(char [])

一次读多个字符,读入到char[] 数组中

注意:返回的依然是int类型“每次实际读出的个数”。返回值-1时,表示读到文件末尾

(4)close

3、int read()一次读一个字符 操作演示

首先,我们在对应的Module下建立一个hello.txt文件,输入内容“hello world!!!”。

    @Test
    public void test01() throws IOException 
        //1)创建File对象
        File file = new File("hello.txt");

        //2)创建FileReader对象
        FileReader fr = new FileReader(file);

        //3) 读文件
        int data;  
        while((data = fr.read()) !=-1)
            System.out.print((char)data);
        

        //4)关闭流
        fr.close();
    

运行结果:

hello world!!! 

但这个代码当中存在一些问题,需要优化一下:

现在是在整个函数外抛出异常,如果我的read函数出错了,那么程序中止,会导致前面打开的流没有close。换句话说,close操作是必须要执行的,那就用try-catch-finally语句。

        1)选中要被try包含的代码,按住快捷键Ctrl+Alt+t,选中“try/catch/finally” 

        

        2)由于close本身也需要做异常处理。所以close也要用try-catch包起来。

        

          3)这里还有一个问题。如果不是在read处出错,而是在new FileReader的时候就出错了,fr没有创建成功,那么进入finally的fr.close()时,会出现“空指针异常”。所以我们在进行close操作的时候要先判断fr是不是空指针

        

         优化后的完整代码:

@Test
    public void test01() 
        FileReader fr = null;
        try 
            //1)创建File对象
            File file = new File("hello.txt");

            //2)创建FileReader对象
            fr = new FileReader(file);

            //3) 读文件
            int data;
            while((data = fr.read()) != -1)
                System.out.println((char)data);
            
         catch (IOException e) 
            e.printStackTrace();
         finally 
            //4)关闭流
            try 
                if(fr != null)
                    fr.close();
             catch (IOException e) 
                e.printStackTrace();
            
        


    

4、一次读多个字符int read(char[] ) 操作演示 

难点:错误写法那里,不能用buf.length,而要用len。

  @Test
    public void test02()
        FileReader fr = null;
        try 
            //1)创建File对象
            File file = new File("hello.txt");

            //2)创建FileReader对象
            fr = new FileReader(file);

            //3)读文件
            char []buf = new char[5];
            int len;
            while((len = fr.read(buf))!= -1)
                /*------输出方式(一)------*/
                //错误写法
//                for(int i=0; i<buf.length; i++)
//                    System.out.println(buf[i]);
//                
                for(int i=0; i<len; i++)
                    System.out.print(buf[i]);
                
                /*-----输出方式(二)------*/
                //错误写法
//                String string = new String(buf);
//                System.out.println(string);
                String string1 = new String(buf, 0, len);
                System.out.println(string1);
            
         catch (IOException e) 
            e.printStackTrace();
         finally 
            //4)关闭文件
            try 
                if(fr != null)
                    fr.close();
             catch (IOException e) 
                e.printStackTrace();
            
        
    

2.2 FileWriter

2.2.1 FileWriter类的记忆点

  • 为了保证close操作一定执行,需要使用try-catch-finally
  • 输出的文件可以不存在。不存在的话会自动创建
  • “append追加”还是覆盖

2.2.2 FileWriter类的常用方法

(1)构造方法

fw = new FileWriter(file, true); //true为追加

fw = new FileWriter(file, false); //false为不追加
//等同于fw = new FileWriter(file);

(2)write(char)

        一次写入一个字符

(3)write(char [] )

        一次写入多个字符

(4)write(String)

        一次写入一个字符串

2.2.3 三个常用write()方法的一波操作

     @Test
    public void test01()
        FileWriter fw = null;
        try 
            //1)创建File对象
            File file = new File("notExist.txt");

            //2)创建FileWriter对象
            fw = new FileWriter(file, true);

            //3)写入操作
            fw.write('3');
            fw.write(new char[]'S','e','p','t','e','m','b','e','r');
            fw.write("You must find more time on this work");
         catch (IOException e) 
            e.printStackTrace();
         finally 
            //4) 关闭流
            try 
                fw.close();
             catch (IOException e) 
                e.printStackTrace();
            
        
    

运行结果: 

3SeptemberYou must find more time on this work

 如果想要换行,就输入“\\n”

2.3 使用FileReader和FileWriter实现文本文件的复制

 模板:

        //1)创建File对象:读出和写入各一个
        
        //2)创建FileReader对象 和 FileWriter 对象
        
        //3)读出和写入操作
        
        //4)关闭两个流

完整代码

     @Test
    public void test02() 
        FileReader fr = null;
        FileWriter fw = null;
        try 
            //1)创建File对象:读出和写入各一个
            File readFile = new File("hello.txt");
            File writeFile = new File("notExist.txt");

            //2)创建FileReader对象 和 FileWriter 对象
            fr = new FileReader(readFile);
            fw = new FileWriter(writeFile, true);

            //3)读出和写入操作
            char []buf = new char[5];
            int len;
            while((len = fr.read(buf)) != -1)
//                //方式(一)
//                String s = new String(buf, 0, len);
//                fw.write(s);
                //方式(二)
                fw.write(buf,0,len);
            
         catch (IOException e) 
            e.printStackTrace();
         finally 
            try 
                //4)关闭两个流
                if(fr != null)
                    fr.close();
             catch (IOException e) 
                e.printStackTrace();
            

            try 
                //4)关闭两个流
                if(fw != null)
                    fw.close();
             catch (IOException e) 
                e.printStackTrace();
            
        
    

PS:发现File类中有创建文件、删除文件,但好像并没有拷贝文件的操作。所以不能通过file.copy(源文件,目的文件)一行代码直接实现吗 

那能否用FileWriter和FileReader去拷贝一张图片呢?

答:不能。

 出来的bbb.jpg是打不开的。

2.4 FileInputStream

2.5 FileOutoutStream

以上是关于javaSE I/O流—— 各种各样的流的主要内容,如果未能解决你的问题,请参考以下文章

I/O流

JavaSE入门学习45:文件传输基础之I/O流

I/O流

java从基础知识I/O

JavaSE入门学习44:文件传输基础之I/O流

JavaSE入门学习43:文件传输基础之I/O流