Java IO
什么是流
- 内存与存储设备之间传输数据的通道
流的分类
方向分:
- 输出流: 由内存写入存储设备
- 输入流:由存储设备读入内存
单位分:
- 字节流:以字节为单位传输数据,可以读写所有数据
- 字符流:以字符为单位传输数据,只能读写文本数据
功能分:
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流基础之上增强功能
流的介绍
字节输入输出流
FileInputStream:从某个文件获取输入字节。
public class Demo{
public static void main(String[] args) throws Exception{
// 创建InputStream 指定文件在c盘
FileInputStream fil = new FileInputStream("c:\\zpy.txt");
// 单个字节读取文件
int date = 0;
while((date = fil.read()) != 0){
System.out.print((char)date);
}
// 多字节读取文件
byte[] buf = byte[3];
int count = 0;
while((count = fil.read(buf)) != 0){
System.out.print(new String(buf,0,count));
}
// 关闭输入流
fil.close();
}
}
FileOutputStream:从内存中获取输出字节。
public class Demo1{
public static void main(String[] args) throws Exception{
// 创建OutputStream 指定文件在c盘
FileOutputStream fol = new FileOutputStream("c:\\zz.txt");
fol.write("asdasd");
String string = "asdasdasd";
fol.write(string.getBytes());
// 关闭输出流
fol.close();
}
}
字节缓冲流
BufferedInputStream
public class Demo2{
public static void main(String[] args) throws Exception{
// 创建InputStream 指定文件在c盘
FileInputStream fil = new FileInputStream("c:\\pp.txt");
BufferedInputStream bis = new BufferedInputStream(fil);
int count = 0;
while((count = bis.read()) != 0){
System.out.print((char)count);
}
// 关闭输入流
bis.close();
}
}
BufferedOutputStream
public class Demo3{
public static void main(String[] args) throws Exception{
// 创建OutputStream 指定文件在c盘
FileOutputStream fil = new FileOutputStream("c:\\yy.txt");
BufferedOutputStream bos = new BufferedOutputStream(fil);
// 写入缓冲区 8K
bos.write("asdasd".getBytes());
// 刷新缓冲区
bos.flush();
// 关闭输出流
bos.close();
}
}
对象流
- 增强缓冲区功能
- 增强8种数据类型和字符串的功能
- 增强读写对象功能
序列化
注:序列化类必须要实现Serializable接口
public class Demo6 {
public static void main(String[] args) throws Exception{
//1创建对象流
FileOutputstream fos = new FileOutputstream("d:\\stu.bin");
ObjectOutputstream oos = new ObjectOutputstream(fos);
//2序列化(写入操作)
Student zhangsan = new Student("张 ", 20);
oos.writeObject(zhangsan);
//3关闭
oos.close();
System.out.print1n("序列化完毕");
}
}
反序列化
public class Demo7 {
public static void main(String[] args) throws Exception {
//1创建对象流
FileInputStream fis=new FileInputStream("d:\\stu.bin");
objectInputStream ois=new objectInputStream(fis);
//2读取文件(反序列化)
Student s= (Student)ois.readobject();
//3关闭.
ois.close();
System.out.println("执行完毕");
System.out.println(s.toString()); I
}
}
字符流
字符编码介绍
字符编码 | 用途 |
---|---|
ISO-8859-1 | 收录除ASCII外,还包括西欧,希腊语、泰语、阿拉伯语、希伯来语对应的文字符号(1字符占1字节) |
utf-8 | 针对Unicode码表的可变长度字符编码 |
GB2312 | 简体中文 |
GBK | 简体中文、 扩充(GB2312升级版) |
BIG5 | 台湾,繁体中文. |
实现类
FileReader:
- public int read(char[] c) //从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。 .
public class Demo2 {
pub1ic static void main(String[] args) throws Exception{
//1创建FileReader文件字符输入流
FileReader fr = new FileReader("d:\\he1lo.txt");
//2读取
//单个字符读取
int data=0;
while((data=fr.read())!=-1){ //读取一个字符.
System.out.print((char)data);
}
//3关闭
fr.close();
}
}
FileWriter:
- public void write(String str) //- 次写多个字符,将b数组中所有字符,写入输出流。
public class Demo3 {
public static void main(String[] args) throws Exception {
//1创建F ileWriter对象
FileWriter fw = new FileWriter("d:\\write.txt");
//2写入.
for(int i=0;i<10;i++) {
fw.write("java是世界上最好的语言\r\n");
fw.flush(); // 刷新缓冲区
}
//3关闭
fw.close();
System.out.println("执行完毕");
}
}
字符缓冲流
- 高效读写
- 支持输出换行
- 支持成行读取,写入
BufferedReader:
public class Demo5 {
public static void main(String[] args) throws Exception{
//1创建缓冲流
FileReader fr=new FileReader("d:\\write.txt");
BufferedReader br=new BufferedReader(fr);
//2读取
//第一种方式
//char[] buf=new char[1024];
//int count=0;
//while((count=br.read(buf))!=-1) {
//System.out.print(new String(buf,0,count));
//}
//第二种方式,一行一行的读取
String line=nul1;
while((line=br.readLine())!=nu11) {
System.out.print1n(line);
}
//3关闭
br.close();
}
}
BufferedWriter:
public class Demo6 {
public static void main(String[] args) throws Exception{
//1创建BufferedWriter对象
FileWriter fw=new FileWriter("d:\\buffer. txt");
BufferedWriter bw=new BufferedWriter(fw) ;
//2写入
for(int i=0;i<10;i++){
bw.write("好好学习,天天向上");
bw.newLine(D; //写入一个换行符 windows \r\n linux\n
bw.flush();
//3关闭
bw.close();
System.out.println("执行完毕");
}
打印流
- 封装了print() / print1n()方法,支持写入后换行。
- 支持数据原样打印
PrintWriter:
pub1ic class Demo7 {
public static void main(String[] args) throws Exception {
//1创建打印流
PrintWriter pw=new PrintWriter("d:\\print.txt");
//2打印
pw.println(97) ;
pw.println(true) ;
pW.println(3.14);
pw.println('a');
//3关闭
pw.close();
System.out.println( "执行完毕");
}
转换流: InputStreamReader/0utputStreamWriter
- 可将字节流转换为字符流。
- 可设置字符的编码方式。
InputStreamReader:
pub1ic class Demo1 {
public static void main(String[] args) throws Exception {
//1创建InputStreamReader对象
FileInputStream fis=new FileInputStream("d:\\write.txt");
InputStreamReader isr=new InputstreamReader(fis,"gbk");
//2读取文件
int data=0;
while((data=isr.read())!=-1){
System.out.print((char)data);
}
//3关闭
isr.close();
}
OutputStreamWriter:
pub1ic class Demo2 {
public static void main(String[] args) throws Exception{
//1创建0utputStreamWriter
File0utputStream fos=new File0utputStream("d:\\info.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos,"gbk");
//2写入
for(int i=0;i<10;i++) {
osw.Write("我爱北京,我爱故乡\r\n");
osw.flush();
}
//3关闭.
osw.close();
System.out.println("执行成功");
}