Java基础之IO流的操作

1. 流的概念

流是一组有顺序的,有起点和终点的字节集合。

2. 流的分类

按处理数据的类型分为字节流和字符流
按数据流向分为输入流和输出流

字节流和字符流的区别
字节流一次只读取一个字节,字符流一次读取一个字符(一个字符包含多个字节)。字节流可以所有类型的数据,而字符流只能处理字符类型的数据(如文本文件)

字节流
InputStream,抽象了应用程序读取数据的方式
OutputStream ,抽象了应用程序写出数据的方式

输入流的基本方法
InputStream in = new InputStream();
int b = in.read();
读取一个字节无符号填充到int的最后8位,返回的是读到的字节(转换成int类型的值的)内容,当读到-1时,标识读取到最后结束了。
in.read(byte[] buf);
读取的数据填充到字节数组buf中,返回的是读到的字节的个数。
in.read(byte[] buf,int start ,int size);
读取数据到字节数组buf,并且是从buf的start位置开始,最多存放size长度的数据,返回的是读到的字节的个数。

输出流的基本方法
OutputStream out = new OutputStream();
out.write(int b);
写出一个字节到流,写的是int的最后的8位
out.write(byte[] buf);
将buf字节数组都写入到流
out.write(byte[] buf,int start,int size);
字节数组buf从start位置开始写size长度的字节到流

字节流的实现类

文件输入输出流
FileInputStream FileOutputStream

数据输入输出流
DataInputStream DataOutputStream
加了一些方法如writeInt(),writeLong()等等,普通的流只有writre(),即只能写入字节

字节缓冲流
BufferedInputStream BufferedOutputStream
为IO流加入缓冲,提高了读写的性能
带缓冲要在out.write()后加out.flush(); flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满.
实验证明,批量读写速度最快(通过byte[]来作为缓冲区),比带缓冲的快很多

字符流
Reader,读取字符的抽象基类
Writer,写入字符的抽象基类

字符流和字节流的方法差不多,只不过读取的单位不同,读取单位指的是read和write方法中参数的类型

字符流的实现类
InputStreamReader,完成byte流解析为char流,按照编码解OutputStreamReader,提供char流到byte流,按照编码处理
注意:
假设文本文件的编码格式为gbk,项目的工作空间编码是utf-8
InputStreamReader isr=new InputStreamReader(in)
此时读出的数据会乱码,因为默认是按照项目的编码进行解析的
InputStreamReader isr=new InputStreamReader(in,“charset”)
将charset写为gbk,则不会出现乱码问题
读取单位是char

文件的读写
FileReader/FileWriter
读取单位char或者string

字符缓冲流
BufferedReader
BufferedWriter

3. File类和RandomAccessFile类

读写 rw 只读r

File
将文件和文件夹抽象成类的形式

RandomAccessFile
可以从文件指定的位置读取数据

4. 代码体现IO流的各种操作

文件复制

private static void copyFile() {
    String sPath = "/Users/sufan/Desktop/szsmk说明.txt";
    String dPath = "/Users/sufan/Desktop/copyszsmk.txt";
    File sFile = new File(sPath);
    File dFile = new File(dPath);
    if(!sFile.exists()){
        System.out.println("源文件不存在");
        return;
    }
    //这句代码有无均可
    if (!dFile.exists()) {
        try {
            dFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    try {
        FileInputStream fis = new FileInputStream(sFile);
        FileOutputStream fos = new FileOutputStream(dFile);
        byte[] bytes = new byte[512];
        int rs = -1;
        while ((rs = fis.read(bytes)) > 0) {
            fos.write(bytes, 0, rs);
        }
        fis.close();
        fos.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

文件夹复制

private static void copyFileDir() {
    String sPath = "/Users/sufan/Desktop/javaTest";
    String dPath = "/Users/sufan/Desktop/copyJavaTest";
    File sFile = new File(sPath);
    File dFile = new File(dPath);

    if(!sFile.exists()){
        System.out.println("源文件夹不存在");
        return;
    }
    //此处可有可无
    if (!dFile.exists()) {
        dFile.mkdir();
    }
    File[] files = sFile.listFiles();
    copyFileChild(files, dFile);
}

// 循环遍历复制文件夹中的内容(文件夹和文件)
private static void copyFileChild(File[] sFiles, File dFile) {
    for (int i = 0; i < sFiles.length; i++) {
        if (sFiles[i].isFile()) {
            try {
                FileInputStream fis = new FileInputStream(sFiles[i]);
                FileOutputStream fos = new FileOutputStream(
                        new File(dFile.getAbsolutePath() + "/"
                                + sFiles[i].getName()));

                byte[] bytes = new byte[512];
                int rs = -1;
                while ((rs = fis.read(bytes)) > 0) {
                    fos.write(bytes, 0, rs);
                }
                fis.close();
                fos.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else if (sFiles[i].isDirectory()) {

            String dPath = dFile.getAbsolutePath() + "/"
                    + sFiles[i].getName();
            System.out.println(dPath);
            File df = new File(dPath);
            if (!df.exists()) {
                df.mkdir();
            }
            File[] sf = sFiles[i].listFiles();
            copyFileChild(sf, df);
        }
    }
}

同样删除操作也分为文件和文件夹
等等还有很多操作在这里我就不一一列出代码了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268