美文网首页
Java基础之IO流的操作

Java基础之IO流的操作

作者: sofarsogoo_932d | 来源:发表于2018-03-31 14:10 被阅读0次

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);
        }
    }
}

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

相关文章

  • Java基础之IO流的操作

    1. 流的概念 流是一组有顺序的,有起点和终点的字节集合。 2. 流的分类 按处理数据的类型分为字节流和字符流按数...

  • Java基础系列-Stream

    原创文章,转载请标注出处:《Java基础系列-Stream》 一、概述 Stream操作简称流操作,这里的流与IO...

  • Java之IO流详解

    title: Java之IO流详解tags: Java IO流categories: Java IO流 大多数应用...

  • Java基础之IO流

    ##Java基础之IO流IO流常用几个类的关系如下: 字节流 字节输入流FileInputStream 读取文件用...

  • Java IO流详解(二)——IO流的框架体系

    一、IO流的概念 Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同...

  • Java常用包的主要作用

    java.io io流相关操作java.nio 新io操作java.lang 核心功能包,线程,System,基本...

  • JavaSE 基础学习之五 —— IO 操作 (java. io

    接上篇《JavaSE 基础学习之四 —— 异常的处理》 五. JavaSE 基础学习 —— IO 操作 (java...

  • Java IO详解

    1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的...

  • java IO入门笔记

    1.java IO流的概念,分类,类图 1.1. java IO 流的概念 java的io是实现输入和输出的基础,...

  • java笔记--IO流(字符流和字节流)

    IO流: 用来处理设备之间的数据传书。Java对数据的操作是通过流的方式。Java用于操作流的对象都在IO包中。流...

网友评论

      本文标题:Java基础之IO流的操作

      本文链接:https://www.haomeiwen.com/subject/sckklxtx.html