IO写入数据

IO写入数据

基础的写入

  • 创建字节输出流对象
  • 将字节数据从内存中输出至硬盘以达到写入数据
  • 会被抛来异常,可以选择抛出或者try-catch处理
  • 调用write()方法将指定字节写入此文件输出流中
  • 所有流最后都要释放资源
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        
        FileOutputStream fileOutputStream = new FileOutputStream("java基础\\src\\com\\io\\iobase\\java.txt");
        /*
        * 创建字节输出流对象做了三件事情
        *   1.调用系统功能创建了文件
        *   2.创建了对象
        *   3.使对象指向文件
        * */

        // 一次只能写一个字节数据
        // 97为a
        fileOutputStream.write(97);
        // 如果想要数字97
        // 57为字符9
        fileOutputStream.write(57);
        // 55为字符7
        fileOutputStream.write(55);

        // 所有流最后都要释放资源
        // 关闭此文件输出流并释放相关联的任何系统资源
        fileOutputStream.close();
    }
}

两种构造方法

FileOutputStream两种构造方法,两种结果没有区别

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1{
    public static void main(String[] args) throws IOException {
        // 参数为
        // 1.String
        FileOutputStream fileOutputStream = new FileOutputStream("java基础\\src\\com\\io\\write\\java.txt");
        /*
        * 源码:
        * public FileOutputStream(String name) throws FileNotFoundException {
        *   this(name != null ? new File(name) : null, false);
        * }
        * 这一种构造方法会自动new一个File对象
        * */

        // 2.File
        File file = new File("java基础\\src\\com\\io\\write\\java.txt");
        FileOutputStream fileOutputStream1 = new FileOutputStream(file);
    }
}

写入数据的三种方式

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("java基础\\src\\com\\io\\write\\java.txt");
        // 写数据的三种方式
        // 1.public void write(int b)
//        fileOutputStream.write(97);
//        fileOutputStream.write(98);
//        fileOutputStream.write(99);

        // 2.public void write(byte b[])
//        byte[] bytes = {97,98,99};
//        fileOutputStream.write(bytes);


        // 更简单的方法
        // 在String类中有一个方法
        /*
        * 源码:
        * public byte[] getBytes() {
            return StringCoding.encode(value, 0, value.length);
        }
        * */
        // 所以可以写成
        byte[] bytes = "abc".getBytes();
//        fileOutputStream.write(bytes);

        // 3.public void write(byte b[], int off, int len)
        // 从bytes数组中下标为1开始写2个
        fileOutputStream.write(bytes,1,2);

        // 最后释放资源
        fileOutputStream.close();
    }
}

两个问题:

  1. 字节流写数据如何实现换行
  2. 字节流写数据如何实现追加写入
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) throws IOException {
//        FileOutputStream fileOutputStream = new FileOutputStream("java基础\\src\\com\\io\\question\\java.txt");

        /*
         * 问题:如何每次输入结束时换行?
         * 不同的操作系统的换行符是不一样的
         *   1.Windows:\r\n
         *   2.Linux:\n
         *   3.Mac:\r
         * */

        /*
         * 问题:字节流写数据每次写入都会覆盖,如何实现追加写入
         * FileOutputStream中有可以追加的构造方法
         * 源码:
         * public FileOutputStream(String name, boolean append) throws FileNotFoundException{
                this(name != null ? new File(name) : null, append);
           }
           *如果第二个布尔值的参数为true则写入在文件的末尾而不是开头
         * */

        FileOutputStream fileOutputStream = new FileOutputStream("java基础\\src\\com\\io\\question\\java.txt", true);

        // 写十次Hello数据
        for (int i = 0; i < 10; i++) {
            fileOutputStream.write("hello".getBytes());
            fileOutputStream.write("\r\n".getBytes());
        }

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

字节流写数据加异常处理

  • 调用FileOutputStream类的构造函数会收到抛来的异常
  • 之前都是抛出解决的
  • 这次我们使用try-catch处理
  • 使用finally分支来善后
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo1 {
    public static void main(String[] args) {

        FileOutputStream fileOutputStream = null;

        try {
             fileOutputStream = new FileOutputStream("java基础\\src\\com\\io\\exception\\java.txt");
            // 在这一步写入时会报出异常
            fileOutputStream.write("hello".getBytes());
            // 释放资源就没有执行到,就一直占用资源
            // 所以使用finally分支来善后,除非JVM退出,无论如何都会执行
            // fileOutputStream.close();
        } catch (IOException e) {
            // 报出异常后会走到这里
            e.printStackTrace();
        } finally {
            // 确保new FileOutputStream能返回给fileOutputStream值
            // 防止空指针异常
            if (fileOutputStream != null){
                try {
                    // 因为close()会报错,所以用try-catch处理
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
上一篇:『题解』Luogu-P4318 完全平方数


下一篇:java-从Tomcat启动中读取用户输入