开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
什么是IO?
I -- Input:从外部系统获得数据读入到内存中,比如读取文件;
O -- Output: 将数据从内存中写出到外部系统中,比如写到文件里。
java.io 包中提供了所有相关的API。
JAVA中的IO架构
字节流: 类名以 Stream 结尾,以及 System.in/out/err 传递的数据单元为字节,可以读取任何类型的文件;
字符流: 类名以 Reader/Writer 结尾,传递的数据单元为字符,主要操作的对象为文本文件。
一个简单的IO Demo
写出数据到文件
定义 FileOutputStream 将数据写到文件中
import java.io.*;
import java.nio.charset.StandardCharsets;
public class IODemo {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("D:/test.txt");
fos.write("读取数据的DEMO".getBytes(StandardCharsets.UTF_8));
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
从文件中读入数据到内存
对上边生成的文件内容进行读取。
定义 FileInputStream 从文件中读取数据,按字节读取,如果读取的是汉字,使用字节读取可能会出现乱码的情况。
import java.io.*;
public class IODemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("D:/test.txt");
int read = fis.read();
System.out.println(read);
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出为 232,即第一个字节的数值,如果要转换为字符,就会变成乱码。
从文件中读入数据到内存二
解决上一步中读取数据出现乱码的情况,需要定义一个数组,用来存放读取出的字节内容,然后将字节数组转换为字符串,这里要注意文本的编码必须与原内容保持一致。
import java.io.*;
import java.nio.charset.StandardCharsets;
public class IODemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("D:/test.txt");
//定义存放内容的字节数组
byte[] arr = new byte[19];
int read = fis.read(arr);
String s = new String(arr, StandardCharsets.UTF_8);
System.out.println(s);
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这种方法因为需要定义字节数组,数组的长度需要人为定义。
如果少了,会导致内容读取不完整;如果多了,末尾会出现无意义字符。
所以就引入了转换流,InputStreamReader。
从文件中读入数据到内存三
通过字符转换流,将字节流转换为字符流,并使用 BufferedReader 按行读取文件内容。
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class IODemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("D:/test.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String s1 = br.readLine();
System.out.println(s1);
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}