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();
}
}
两个问题:
- 字节流写数据如何实现换行
- 字节流写数据如何实现追加写入
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();
}
}
}
}
}