四大模块:
InputStream:(字节流输入)
OutputStream:(字节流输出)
Reader:(字符流输入)
Writer:(字符流输出)
1、InputStream:
(1)FileInputStream
文件字节输入流
使用方法:
例1:
FileInputStream in = new FileInputStream("E://Test.txt");
int a = in.read();//读入一个字节数据
a.close();
例2:读入多个字节数据
FileInputStream in = new FileInputStream("E://Test.txt");
byte[] byter = new byte[4];
int a = in.read(byter);
while(a!=-1) {
System.out.print(new String(byter,0,a));
System.out.println(a);
a = in.read(byter);
}
in.close();
例3:异常捕获
try(//try资源块,可以自动关闭in1文件流
FileInputStream in1 = new FileInputStream("E://Test.txt");
){
byte[] byter1 = new byte[4];
int len = in1.read(byter1);
while(len!=-1) {
System.out.print(new String(byter1,0,len));
System.out.println(len);
a = in.read(byter1);
}
}catch(Exception e){
e.printStackTrace();
}
2、OutputStream
字节流输出
(1)ObjectOutputSteam
对象序列化,将对象储存在文件中
例1:
//对象序列化,将对象存储在文件中
Person p1 = new Person(18,"liu");
OutputStream out = new FileOutputStream("objectInput.txt");
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(p1);
oos.close();
(2)ObjectInputStream(父类为InputStream)
对象反序列化,读取文件中的对象
例1:
FileInputStream in = new FileInputStream("E:\\li\\Test2.txt");
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = ois.readObject();
System.out.println(obj.toString());
注意:
每次在储存对象后,假如修改对象类的,那么反对象化会报错。
Exception in thread "main" java.io.InvalidClassException: shujujiegou.Person;
local class incompatible:
stream classdesc serialVersionUID = 7417176980331506136,
local class serialVersionUID = -8027723850310323071
原因是储存的对象serialVersionUID与本地的serialVersionUID不同产生的异常。
解决办法:
在创建Person类时加上固定的serialVersionUID值:
private static final long serialVersionUID = -6849723424255257710L;
(3)PrintStream
打印字节流:在指定的地方的输出数据
例1:
PrintStream ps = new PrintStream(new FileOutputStream("E:\\li\\mo.txt"));
System.out.println("这是打印字节流");
ps.print("helloworld");
System.setOut(ps);//修改标准输出流,输出的位置
System.out.println("修改后的输出流");
ps.close();
3、Reader
字符流输入
(1)FileReader
文件字符输入流
使用方法:
例1:
try(
FileReader in_0 = new FileReader("C:\\Users\\Administrator\\Desktop\\myfile.txt");
){
int a = in_0.read();
while(a!=-1) {
System.out.print((char)a);
a = in_0.read();
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
(2)InputStreamReader
字节转换流:可以将字节流转换为字符流,可以指定读入文件编码方法
例1:
FileInputStream in = new FileInputStream(fileName);
InputStreamReader inr = new InputStreamReader(in,"GBK");
int a = inr.read();
while(a!=-1) {
System.out.print((char)a);
a = inr.read();
}
in.close();
inr.close();
(3)BufferedReader
字符缓冲输入流
文件–>缓冲区(8k字符缓冲区)–>程序
例1:
FileReader in = new FileReader(fileName);
BufferedReader br = new BufferedReader(in);
String a = br.readLine();
while(a!=null) {
System.out.println(a);
a = br.readLine();
}
in.close();
br.close();
例2:
//键盘输入到文件中
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\Test1.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
while(str.length()>0) {
bw.write(str);
bw.newLine();
str = br.readLine();
}
bw.close();
br.close();
4、Writer
字符流输出
(1)FileWriter
文件字符输出流
使用方法
例1:
FileWriter fw = new FileWriter("E:\\Test.txt");
fw.write("你");
fw.write("是谁");
char[] contents = "who are you?".toCharArray();
fw.write(contents);
fw.close();
(2)BufferedWriter
字符缓冲输出流:
程序–>缓冲区(8192字符缓冲区)–> 文件
例1:
FileWriter wri = new FileWriter("E:\\Test.txt",true);//在末尾添加的方式。
BufferedWriter bw = new BufferedWriter(wri);
bw.write("\nnnsss");
bw.flush();
bw.close();
(3)PrintWrite
打印字符流
例1:
PrintWriter pw = new PrintWriter(new FileWriter("E:\\li\\mo.txt"));
System.out.println("这是打印字符流");
pw.write("helloworld");
pw.close();
FIle类
读取文件内容使用IO流,操作文件/文件夹使用File类,如创建/遍历/删除文件夹,查看文件的相关属性等操作。
例1:输出指定路径的文件夹的绝对路径
File file = new File("E:\\");
File[] file_list = file.listFiles();
for (File file2 : file_list) {
System.out.println(file2.getAbsolutePath());
}
例2:创建文件夹、创建文件
File f1 = new File("E:\\li\\li_1");
f1.mkdir();//创建文件夹
File f2 = new File("E:\\li\\li_1","test.txt");
f2.createNewFile();//创建文件test.txt