JAVA笔记---IO流与文件读写

来源:互联网 发布:pop3默认端口 编辑:程序博客网 时间:2024/05/17 05:00

好几次遇到文件的读取忘了具体的用法了,所以这里写一篇关于JAVA关于使用IO流读写文件的笔记,方便以后查询。

首先需要明白程序是运行在内存和CPU所构成的资源里, 语句就是对CPU的操作, 而变量和new是对内存的操作, 操作内存里的东西非常便利, 要么声明变量, 要么用 new,可是有很多东西需要程序来操作, 它们不在内存里, 比如键盘、硬盘、打印机、网络等, 这个时候就需要一种模式来和内存外的东西打交道, 类似于管道(pipe), 内存里和内存外就构成了入和出的方向, 到内存里就是入, 到内存外就是出,这就是IO流的概念。

根据操作对象的类型是字符还是字节可将IO流可分为两大类: 字节流和字符流
字节流: 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件
字符流: 以字符为单位读取文件,常用于读文本,数字等类型的文件

不管是哪种类型,可以按照下面三个步骤来使用:
第一步:定位需要操作的文件的位置; 第二步: 建立管道; 第三步,操作管道。

1.字节流

这里以复制一张图片为例来看下具体用法, 以下直接给出代码:

import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class JavaIOStudy {    public static void main(String[] args) {        //第一步:定位文件所在的位置并新建一个文件用于确定复制的文件的文件名        File infile = new File("/Users/dxy/sync/infile.jpg");        File outfile = new File("/Users/dxy/sync/outfile.jpg");        try {            //第二步:建立文件流管道            FileInputStream fis = new FileInputStream(infile);            FileOutputStream fos = new FileOutputStream(outfile);            //第三步:操作文件流            //第一种方式, 一次读一个字节, 会循环该文件的字节数            int length1 = fis.available();            for(int i=0;i<length1;i++){                fos.write(fis.read());            }            //第二种方式, 一次读取多个字节            //建一个byte数值用于临时成块存放字节文件,建议使用2的n次方,这样计算机的处理效率相对会高一些            byte[] tmp = new byte[8192] ;            //设置读取的次数            int length2 = fis.available()/8192;            for (int i = 0; i < length2; i++) {                fis.read(tmp);                fos.write(tmp);            }            //处理最后一次少读取的部分            int size = fis.read(tmp) ;            //第一个参数还是byte数组形成的临时缓冲区,第二个参数是从数组的哪里开始向文件写,第三个参数是写多少。            fos.write(tmp, 0, size) ;            //最后关闭文件流            fis.close();            fos.close();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}

2.字符流

字符流用来读取文本、数字等类型的文件,相对字节流来说使用的范围更广泛些,以下以一个txt文件复制以及读取该文件里面的字符并换行显示到控制台上面,直接给出代码如下:

import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;public class JavaIOzifu {    public static void main(String[] args) {        File intfile = new File("/Users/dxy/sync/intfile.txt");        //outfile一开始不存在,通过读取intfile里面的内容赋值给outfile        File outfile = new File("/Users/dxy/sync/outfile.txt");        try {            //FileReader不能读取一行文件,只有read()方法一个个读取字符            FileReader fr = new FileReader(intfile);            FileWriter fw = new FileWriter(outfile);            //BufferedReader带有缓冲区的流, 可以调用readLine()方法读取一行String            BufferedReader bfr = new BufferedReader(fr);            //和BufferedReader对应的是BufferWriter,但是不同的平台上,使用BufferWriter有些控制字符比如回车、换行之类的可能会有差别            //PrintWriter它会适应不同的系统平台, 所以建议使用PrintWriter            PrintWriter pw = new PrintWriter(fw);            String temString = null;            while((temString = bfr.readLine())!= null){                //调用println()方法可以写入的时候进行换行                pw.println(temString);                //print()方法和write()方法都是写文件不换行                //pw.print(temString);                //pw.write(temString);                System.out.println(temString);            }            //关闭流, 注意这一步是必须的            bfr.close();            //有了缓冲区,向文件写的字符并没有被直接写到文件里,而是被放到PrintWriter的缓冲区里            //所以需要调用flush方法,以便将缓冲区的内容刷新到文件中            //或者直接调用close方法, close会调用flush方法,同时close会关闭这个流。            pw.close();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}
2 0
原创粉丝点击