针对二进制文件的操作(字符流)
我们在讨论输入输出是站在CPU的角度来看待的, 从磁盘读文件就是输入, 向磁盘写文件就是输出.
输入:InputStream
文件的打开和关闭操作:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class IODemo2 {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("d:/test.txt");
inputStream.close();
}
}
此处的创建对象操作就相当于打开文件, inputStream就和文件"test.txt"关联起来了
close()是释放资源, 这个操作十分重要,否则可能会导致文件资源泄露
上面的写法很容易造成问题. 如果在close操作之前, 有类似于break的操作, 就会导致close操作执行不到, 造成文件资源泄露, 更提倡的写法如下:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class IODemo2 {
public static void main(String[] args) throws IOException {
try (InputStream inputStream = new FileInputStream("d:/test.txt")){
}
}
}
try with resourses ,会在try代码块执行完的时候自动执行close操作
import java.io.*;
public class IOdemo8 {
public static void main(String[] args) throws IOException {
try (InputStream inputStream = new FileInputStream("d:/test.txt")){
while (true) {
int ret = inputStream.read();
if (ret == -1) {
break;
}
System.out.println(ret);
}
}
}
}
read()方法, 默认每次读取一个字节
该文件中的内容如图,得到的结果
上面的数字是"hello world"的ascii码值
输出:OutputStream
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class IOdemo9 {
public static void main(String[] args) {
try(OutputStream outputStream = new FileOutputStream("d:/test.txt")) {
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果如图
如果test.txt中有内容, 该操作会将之前的内容覆盖
针对文本文件的操作(字节流)
输入:Reader
输出:Writer
对于Reader 和 Writer 而言 核心操作和InputStream , OutputStream 是相同的
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class IOdemo10 {
public static void main(String[] args) {
try (Reader reader = new FileReader("d:/test.txt")){
while (true) {
int c = reader.read();
if (c == -1) {
break;
}
System.out.println((char) c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}