I/O流 基础流

I/O流分为字节流和字符流,每一个分类中都有输入流和输出流

InputStream字节输入流,OutputStream字节输出流,Reader字符输入流,Writer字符输出流,均为抽象类

字节输出流

  1. 创建字节输出流对象

参数可以是字符串表示的路径,也可以是 File 对象。

如果文件不存在,会创建一个新文件,但前提是父级路径必须存在。

如果文件已经存在,则会清空该文件的原有内容。

  1. 写数据

write 方法的参数是整数,但实际写入本地文件的是该整数在 ASCII 码表上对应的字符。

例如:写入整数 57 会对应字符 '9',写入整数 55 会对应字符 '7'。

  1. 释放资源

每次使用完流之后,都必须调用 close() 方法释放资源,以防止资源占用和泄漏。

java 复制代码
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamDemo1 {
    public static void main(String[] args) throws IOException {
//        写一段文字到本地文件中(暂时不写中文)
//        1.创建对象
//        写出  输出流 OutputStream
//        本地文件File
        FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\a.txt");
//        2.写出数据
        fos.write(97);
//        3.释放资源
        fos.close();
    }
}

字节输出流写出数据的三种方式

java 复制代码
//        一次写一个字节数据
        fos.write(97);
//        一次写一个字节数组数据
        byte[] bytes = {97,98,99,100};
        fos.write(bytes);
//        一次写一个数组的部分数据
        byte[] bytes = {97,98,99,100};
        fos.write(bytes,1,2);

字节输出流的换行和续写

java 复制代码
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class ByteStreamDemo4 {
    public  static void main(String[] args) throws IOException {
        /*
        换行写:
        再次写出一个换行符就可以了
        windows: \r\n I
        Linux: \n
        Mac: \r
        细节:
        在windows操作系统当中,java对回车换行进行了优化。
        虽然完整的是\r\n,但是我们写其中一个\r或者\n,
        java也可以实现换行,因为java在底层会补全。
         建议:
        不要省略,还是写全了。
        续写:
        如果想要续写,打开续写开关即可
        开关位置:创建对象的第二个个参数
         */
        FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\a.txt",true);
//        写出数据
        String str = "abcdefghiigklmn";
        str.getBytes();
        byte[] bytes = str.getBytes();
        System.out.println(Arrays.toString(bytes));
        fos.write(bytes);
   // 写入换行符
        fos.write("\r\n".getBytes());  // Windows换行符
        // 写入666
        fos.write("666".getBytes());
        fos.close();
    }
}

字节输入流细节

① 创建字节输入流对象

细节1:如果文件不存在,就直接报错。

② 读取数据

细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字

细节2:读到文件末尾了,read方法返回-1。

③ 释放资源

细节1:每次使用完流必须要释放资源。

输入流

java 复制代码
import java.io.FileInputStream;
import java.io.IOException;

public class ByteStreamDemo6 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
        int b1 = fis.read();
        System.out.println(b1);
        fis.close();
    }
}

输入流循环

java 复制代码
import java.io.FileInputStream;
import java.io.IOException;

public class ByteStreamDemo5 {
    public static void main(String[] args) throws IOException {
//        1.创建对象
        FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
//        2.循环读取
        int b;
        while ((b = fis.read()) != -1){
            System.out.println((char) b);
        }
        fis.close();
    }
}

文件拷贝

java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamDemo7 {
    public static void main(String[] args) throws IOException {
    FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
    FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");

    //2.拷贝
//核心思想:边读边写
    int b;
while((b = fis.read()) != -1){
        fos.write(b);
    }

//3.释放资源
//规则:先开的最后关闭
fos.close();
fis.close();
    }
}

缓冲区

java 复制代码
import java.io.FileInputStream;
import java.io.IOException;

public class ByteStreamDemo8 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
//        读取数据
        byte[] bytes = new byte[2];
//        一次读取多个字节数据,具体读多书,跟数组长度有关
//        返回值:本次读取到了多少个字节数据
        int len1 = fis.read(bytes);
        System.out.println(len1);
        String str1 = new String(bytes);
        System.out.println(str1);

        int len2 = fis.read(bytes);
        System.out.println(len2);
        String str2 = new String(bytes);
        System.out.println(str2);
        fis.close();
    }
}

文件拷贝修改后

java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamDemo9 {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
        FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");

        //2.拷贝
        int len;
       byte[] bytes = new byte[1024 * 1024 * 5];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }
//3.释放资源
//规则:先开的最后关闭
        fos.close();
        fis.close();
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
}

try...catch基本做法

java 复制代码
public class ByteStreamDemo10 {
    public static void main(String[] args) {
        FileInputStream fis =  null;
        FileOutputStream fos =  null;
        try {
            fis = new FileInputStream("rubish\\src\\file\\a.txt");
            fos = new FileOutputStream("rubish\\src\\file\\b.txt");
            //2.拷贝
            int len;
        byte[] bytes = new byte[1024 * 1024 * 5];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }
        } catch (IOException e) { }
        finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

try...catchJDK7

java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
//jdk7
public class ByteStreamDemo11 {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
             FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");
        ) {
            //2.拷贝
            int len;
            byte[] bytes = new byte[1024 * 1024 * 5];
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
        }catch(IOException e){
                e.printStackTrace();

        }
    }
}

try...catchJDK9

java 复制代码
public class ByteStreamDemo12 {
    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
        FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");
        try (fis;fos) {
            //2.拷贝
            int len;
            byte[] bytes = new byte[1024 * 1024 * 5];
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
        }catch(IOException e){
            e.printStackTrace();

        }
    }
}

注:实际过程时异常基本都抛出

字符输入流

空参read

java 复制代码
import java.io.FileReader;
import java.io.IOException;

public class CharStreamDemo1 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("rubish\\src\\file\\a.txt");
//        读取数据 read()
//字符流的底层也是字节流,默认也是一个字节一个字节的读取的。
//如果遇到中文就会一次读取多个。GBK一次读两个字节。UTF-8一次读三个字节

//read() 细节:
//1.read(): 默认也是一个字节一个字节的读取的, 如果遇到中文就会一次读取多个
//2. 在读取之后,方法的底层还会进行解码并转成十进制。
// 最终把这个十进制作为返回值
// 这个十进制的数据也表示在字符串上的数字
// 英文:文件里面的二进制数据 0110 0001
// read方法进行读取,解码并转成十进制97
// 中文:文件里面的二进制数据 11100110 10110001 10001001
// read方法进行读取,解码并转成十进制27721

// 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了

        int ch;
        while((ch = fr.read()) != -1){
            System.out.print((char)ch);
        }

// 释放资源
        fr.close();
    }
}

有read方法

java 复制代码
import java.io.FileReader;
import java.io.IOException;

public class CharStreamDemo2 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("rubish\\src\\file\\a.txt");
        char[] chars = new char[2];
        int len;
        while((len = fr.read(chars)) != -1){
            System.out.println(new String(chars,0,len));
        }
        // 释放资源
        fr.close();
    }
}

字符输出流

java 复制代码
import java.io.FileWriter;
import java.io.IOException;

public class CharStreamDemo3 {
    FileWriter fw = new FileWriter("rubish\\src\\file\\a.txt");

    public CharStreamDemo3() throws IOException {

        fw.write(25105);//根据字符集的编码方式进行编码,八编码之后的数据写到文件中去
//    UTF-8
        fw.close();
    }
}
相关推荐
Jasonakeke2 小时前
我的编程来时路
java·c++·python
我命由我123452 小时前
React - BrowserRouter 与 HashRouter、push 模式与 replace 模式、编程式导航、withRouter
开发语言·前端·javascript·react.js·前端框架·html·ecmascript
Yvonne爱编码2 小时前
Java 中的 hashCode () 与 equals () 核心原理、契约规范、重写实践与面试全解
java·开发语言·数据结构·python·hash
gelald2 小时前
JVM - 运行时内存模型
java·jvm·后端
老虎06272 小时前
Java基础面试题(08)—Java(集合—HashMap的使用和实现原理红黑树)
java·开发语言
IT从业者张某某2 小时前
基于DEVC++实现一个控制台的赛车游戏-02-实现赛车游戏
开发语言·c++·游戏
春和景明3602 小时前
费曼学习法和项目
intellij-idea
云边散步2 小时前
godot2D游戏教程系列二(22)
笔记·学习·游戏
guygg882 小时前
基于数据驱动的模型预测控制电力系统机组组合优化MATLAB实现
开发语言·matlab