一、输入输出流
1.输出流
流就是指一连串流动的字符,以先进先出的方式发送信息的通道
2.输入流
文件输入:读
文件输出:写
二、File类
1.什么是文件
文件可认为是相关记录或放在一起的数据的集合
在Java中,使用java.io.File类对文件进行操作.
2.绝对路径和相对路径
• 绝对路径:是从盘符开始的路径
• 相对路径:是从当前路径开始的路径
3.File(java.io包中)
(1)分隔符
Windows:""
Linux:"/"
(2)常量
(3)构造方法
(4)常用方法
4.代码实现
package com.study.file;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
// 创建File对象
// 方式1:File file1 = new File("d:\\java word\\FileProj\\io\\score.txt");
// 方式2:File file1 = new File("d:\\java word","FileProj\\io\\score.txt");
// 方式3:
File file = new File("d:\\java word");
File file1 = new File(file, "FileProj\\io\\score.txt");
// 判断是文件还是目录
System.out.println("是否是目录:" + file1.isDirectory());
System.out.println("是否是文件:" + file1.isFile());
// 创建目录和多级目录
File file2 = new File("d:\\java word\\FileProj\\set", "HashSet");
if (!file2.exists()) {// 判断文件是否存在
file2.mkdir();// 创建目录
}
File file3 = new File("d:\\java word\\FileProj\\set\\HashSet1\\test1");
if (!file3.exists()) {// 判断文件是否存在
file3.mkdirs();// 创建多级目录
}
// 创建文件
File file4 = new File("d:\\java word\\FileProj\\io\\file.txt");
if (!file4.exists()) {
try {
file4.createNewFile();// 创建文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
三、字节流
1.字节输入流InputStream
2.字节输出流FileOutputStream
3.FileInputStream
(1)从文件系统中的某个文件中获得输入字节
(2)用于读取诸如图像数据之类的原始字节流
4.FileInputStream方法
(1)构造方法
(2)常用方法
(3)如果返回值为-1,则表示已经到达文件末尾
5.FileInputStream代码实现
package com.study.file;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputDemo1 {
public static void main(String[] args) {
// 创建一个FileInputStream对象
try {
FileInputStream fis = new FileInputStream("file.txt");
// int n = fis.read();
// while (n != -1) {
// System.out.print((char) n);
// n = fis.read();
// }
int n = 0;
while ((n = fis.read()) != -1) {
System.out.print((char) n);
}
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.study.file;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputDemo2 {
public static void main(String[] args) {
// 创建一个FileInputStream对象
try {
FileInputStream fis = new FileInputStream("file.txt");
byte[] b = new byte[100];
fis.read(b, 0, 5);// 0是偏移量,5是读取数据长度
System.out.println(new String(b));
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.FileOutputStream方法
(1)构造方法
(2)常用方法
7.FileOutputStream代码实现
package com.study.file;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputDemo {
public static void main(String[] args) {
FileOutputStream fos;
FileInputStream fis;
try {
// fos = new FileOutputStream("file.txt", true);// 新增
fos = new FileOutputStream("file.txt");// 覆盖
fis = new FileInputStream("file.txt");
fos.write(50);
fos.write('a');
int n = 0;
while ((n = fis.read()) != -1) {
System.out.print((char) n);
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.study.file;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputDemo1 {
public static void main(String[] args) {
// 文件拷贝
try {
// FileInputStream fis = new FileInputStream("happy.jpg");
// FileOutputStream fos = new FileOutputStream("happycopy.jpg");
FileInputStream fis = new FileInputStream("happy.gif");
FileOutputStream fos = new FileOutputStream("happycopy.gif");
int n = 0;
byte[] b = new byte[1024];
while ((n = fis.read(b)) != -1) {
// fos.write(b);// happycopy文件总比happy文件多1k,最后一次写数据会多,解决方法:
fos.write(b, 0, n);
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、缓冲流
1.缓冲流包括
缓冲输入流BufferedInputStream
缓冲输出流BufferedOutputStream
2.BufferedInputStream
(1)常量
(2)构造方法
(3)常用方法
3.BufferedOutputStream
(1)常量
(2)构造方法
(3)常用方法
4.代码实现
package com.study.file;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedDemo {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("file.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
FileInputStream fis = new FileInputStream("file.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
long startTime = System.currentTimeMillis();// 获取系统当前时间(长整型的:当前时间-1970.1.1)
bos.write(50);
bos.write('a');
bos.flush();// 缓冲区未满,不会触发写操作,flush和close方法调用一个即可强制清空缓冲区中的数据
System.out.println(bis.read());
System.out.println((char) bis.read());
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);// 共用时间
fos.close();
fis.close();
bis.close();
bos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
五、字符流
1.类结构图
字符输入流Reader
字符输出流Writer
2.字符流和字节流对比
(1)字节流:2进制格式数据
(2)字符流:支持字符数据–写-->转为2进制–读-->字符数据读出
3.字节字符转换流
InputStreamReader
(1)构造方法
(2)常用方法
OutputStreamWriter
(1)构造方法
(2)常用方法
4.代码实现
package com.study.charstream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class ReaderDemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("file.txt");
InputStreamReader isr = new InputStreamReader(fis, "GBK");
BufferedReader br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream("file1.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
BufferedWriter bw = new BufferedWriter(osw);
int n = 0;
char[] cbuf = new char[10];
// while ((n = isr.read()) != -1) {
// System.out.print((char) n);
// }
// while ((n = isr.read(cbuf)) != -1) {
// String s = new String(cbuf, 0, n);
// System.out.print(s);
// }
while ((n = br.read(cbuf)) != -1) {
// String s = new String(cbuf, 0, n);
// osw.write(s);
bw.write(cbuf, 0, n);
bw.flush();
}
fis.close();
isr.close();
fos.close();
osw.close();
br.close();
bw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.其他字符流
BufferedReader/BufferedWriter
FileReader/FileWriter
六、对象序列化与反序列化
1.步骤:
(1)创建一个类,继承Serializable接口
(2)创建对象
(3)将对象写入文件
(4)从文件读取对象信息
2. 对象输入流ObjectInputStream
3.对象输出流ObjectOutputStream
4.代码实现
package com.study.serial;
import java.io.Serializable;
public class Goods implements Serializable {
private String goodsId;
private String goodsName;
private double price;
public Goods(String goodsId, String goodsName, double price) {
this.goodsId = goodsId;
this.goodsName = goodsName;
this.price = price;
}
public String getGoodsId() {
return goodsId;
}
public void setGoodsId(String goodsId) {
this.goodsId = goodsId;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "商品信息[编号:" + goodsId + ", 名称:" + goodsName + ", 价格:" + price + "]";
}
}
package com.study.serial;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class GoodsTest {
public static void main(String[] args) {
// 定义Goods类对象
Goods goods1 = new Goods("gd001", "电脑", 3000);
try {
FileOutputStream fos = new FileOutputStream("file.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream("file.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
// 将Goods对象信息写入文件
oos.writeObject(goods1);
oos.writeBoolean(true);
oos.flush();
// 读对象信息
try {
Goods goods = (Goods) ois.readObject();
System.out.println(goods);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(ois.readBoolean());
fis.close();
ois.close();
fos.close();
oos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5.序列化与反序列化
序列化:把Java对象转换为字节序列的过程(写对象)
反序列化:把字节序列恢复为Java对象的过程(读对象)