java IO流
- I :input , 输入流 , 从磁盘文件读数据到内存
- O : Output , 输出流 , 从内存写数据到磁盘文件
1. IO流分类
- 字节流:最小读取单位为字节,更适合读音视频文件
- 字符流:最小读取单位为字符,更适合读文本内容
2. 文件字节输入流
(1).每次读取一个字节
缺点:效率低每次只能读一个字节且不能读中文。中文在jbk下是两个字节,utf-8下是三个字节,其读取中文会乱码
(2).每次读取一个字节数组
(3).一次性读完全部字节
3. 文件字节输出流
public static void main(String[] args) throws Exception
{
//创建一个文件字节输出流
//会自动创建文件
OutputStream os = new FileOutputStream(new File("C:\\files\\poems\\李白诗3.txt"));
//写数据出去
os.write('a'); //写一个字节
byte[]buffer = {'a',97,98,99}; //写一个数组进去
os.write(buffer);
byte[]buffe2 = "我和我的祖国".getBytes(); //写中文
os.write(buffe2);
//写数据必须刷新
os.flush();
//关闭流
os.close();
}
4. 文件拷贝
public static void main(String[] args) throws Exception
{
//将poem文件拷贝到李白诗集文件
InputStream is = new FileInputStream("C:\\java作业\\2022013281王英和\\src\\poem.txt");
OutputStream os = new FileOutputStream("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
//输入流将文件输入到内存(数组)中
byte[] buffer = is.readAllBytes();
//输出流将内存(数组)数据输出到文件中
os.write(buffer);
}
5. 文件字符输入流
文件字符输入流 : Reder
(1). 每次读取一个字符
FileReader fr = new FileReader("C:\\java作业\\2022013281王英和\\src\\poem.txt");
int len;
while((len = fr.read())!= -1)
{
System.out.print((char)len);
}
(2). 每次读取一个字符数组
FileReader fr = new FileReader("C:\\java作业\\2022013281王英和\\src\\poem.txt");
char []buffer = new char[1024];
int len;
while((len = fr.read(buffer))!= -1)
{
String rs = new String (buffer,0,len);
System.out.print(buffer);
}
6. 文件字符输出流
文件字符输出流:FileWriter
Writer fw = new FileWriter("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
char[] buffer = "我爱你中国".toCharArray();
//输出流将内存(数组)数据输出到文件中
fw.write(buffer);
fw.flush();
fw.close();
7. 缓冲流
(1). 字节缓冲流
public static void main(String[] args) throws Exception
{
InputStream is = new FileInputStream("C:\\java作业\\2022013281王英和\\src\\poem.txt");
InputStream bis = new BufferedInputStream(is);
OutputStream os = new FileOutputStream("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
OutputStream bos = new BufferedOutputStream(os);
byte[] buffer = is.readAllBytes();
os.write(buffer);
}
(2). 字符缓冲流
public static void main(String[] args) throws Exception
{
Reader is = new FileReader("C:\\java作业\\2022013281王英和\\src\\poem.txt");
Reader bis = new BufferedReader(is);
Writer os = new FileWriter("C:\\java作业\\2022013281王英和\\src\\李白诗集.txt");
Writer bos = new BufferedWriter(os);
char[] buffer = new char[10];
int len;
while((len = bis.read(buffer))!=-1)
{
bos.write(buffer,0,len);
}
bos.flush();
bos.close();
}
8. 对象序列化和反序列化
(1). 对象序列化
对象序列化: 以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化
使用对象字节输出流:objectOutputStream
//想序列化必须实现这个接口
public class Student implements Serializable
{
int stuID;
String name;
String address;
public Student(int stuID,String name,String address)
{
this.stuID = stuID;this.name = name;
this.address = address;
}
};
public class serialize {
public static void main(String[]args) throws Exception
{
Student s = new Student(1,"abc","xxxx");
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("C:\\java作业\\2022013281王英和\\dest\\1.txt"));
os.writeObject(s);
}
}
(2). 对象反序列化
public static void main(String[]args) throws Exception
{
//反序列化
ObjectInputStream is = new ObjectInputStream(new FileInputStream("C:\\java作业\\2022013281王英和\\dest\\1.txt"));
Student s1 = (Student)is.readObject();
System.out.println(s1);
}