7. 输入输出流
IO 流
File 类
只能操纵文件、获取文件信息,不能对读写文件
File file1 = new File("D:\\java\\test.txt");
////////////////////////////////////////////////////
File file2 = new File("D:\\java", "test.txt");
////////////////////////////////////////////////////
File file3 = new File("D:\\java");
File file4 = new File(file3, "test.txt");
提示
getName(): 返回文件名
getPath(): 返回文件路径
getAbsolutePath(): 返回文件的绝对路径
getParent(): 返回文件的父目录
无参:
String[] list(): 返回文件夹下的所有子目录和文件名
File[] listFiles(): 返回文件夹下的所有文件名
有参:
String[] list(FilenameFilter filter): 用字符形式返回所有符合 filter 要求类型的文件
File[] listFiles(FilenameFilter filter): 用 File 形式返回所有符合 filter 要求类型的文件
文件字节流
FileInputStream 类(文件字节输入流)
FileInputStream fis = new FileInputStream("D:\\java\\test.txt");
int b = fis.read(); // 读取一个字节
while((b = fis.read()) != -1){
System.out.println(b);
}
FileOutputStream 类(文件字节输出流)
FileOutputStream fos = new FileOutputStream("D:\\java\\test.txt");
//若想不覆盖掉原来的文件,而是在其后继续写入,可以使用:
FileOutputStream fos = new FileOutputStream("D:\\java\\test.txt", true);
byte[] b = {97, 98, 99, 100, 101};
fos.write(b);
文件字符流
FileReader 类(文件字符输入流)
FileReader fr = new FileReader("D:\\java\\test.txt");
int c = fr.read(); // 读取一个字符
while((c = fr.read()) != -1){
System.out.println(c);
}
FileWriter 类(文件字符输出流)
FileWriter fw = new FileWriter("D:\\java\\test.txt");
//若想不覆盖掉原来的文件,而是在其后继续写入,可以使用:
FileWriter fw = new FileWriter("D:\\java\\test.txt", true);
char[] c = {'a', 'b', 'c', 'd', 'e'};
fw.write(c);
提示
FileWriter 类的 write() 方法:
write(int c): 写入单个字符
write(char[] c): 写入字符数组
write(char[] c, int off, int len): 写入字符数组的一部分
write(String str): 写入字符串
write(String str, int off, int len): 写入字符串的一部分
字符缓冲流
BufferedReader 类(字符缓冲输入流)
FileReader fr = new FileReader("D:\\java\\test.txt");
BufferedReader br = new BufferedReader(fr);
/////////////////////////////////////////////////////////
BufferedReader br = new BufferedReader(new FileReader("D:\\java\\test.txt"));
String line;
while((line = br.readLine()) != null){
System.out.println(line);
}
BufferedWriter 类(字符缓冲输出流)
FileWriter fw = new FileWriter("D:\\java\\test.txt");
BufferedWriter bw = new BufferedWriter(fw);
/////////////////////////////////////////////////////////
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\test.txt"));
bw.write("hello");
bw.newLine(); // 换行
bw.write("world");
对象流
ObjectInputStream 类(对象输入流)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\java\\test.txt"));
Object obj = ois.readObject();
ObjectOutputStream 类(对象输出流)
直接上例子
import java.io.*;
import java.util.*;
Class Computer implements Serializable{
public String name;
public int price;
public Computer(String name, int price){
this.name = name;
this.price = price;
}
}
public Class TestIO{
public static void main(String[] args){
try{
Scanner in = new Scanner(System.in);
System.out.println("请输入路径和文件名:");
String s = in.nextLine();
FileOutputStream fos = new FileOutputStream(s);
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println("请输入计算机的名称和单价,用回车隔开,以finish结束:");
String s = in.nextLine(); // 接收名称
while(!s.equals("finish")){
double price = in.nextDouble(); // 接收单价
oos.writeObject(new Computer(s, price)); // 将对象写入文件
Syetem.out.println("请输入计算机的名称和单价,用回车隔开,以finish结束:");
s = in.nextLine(); // 接收nextDouble没收到的换行
s = in.nextLine(); // 接收名称
}
oos.writeObject(null); // 写入null表示结束
oos.close();
fos.close();
in.close();
FileInputStream fis = new FileInputStream(s);
ObjectInputStream ois = new ObjectInputStream(fis);
Computer c = (Computer)ois.readObject();
while(c != null){
System.out.println(c.name + " " + c.price);
c = (Computer)ois.readObject();
}
ois.close();
fis.close();
}catch(IOException ioe){
System.out.println(ioe);
}catch(ClassNotFoundException cnfe){
System.out.println(cnfe);
}
}
}
随机读写流
RandomAccessFile 类
RandomAccessFile raf = new RandomAccessFile("D:\\java\\test.txt", "rw");
raf.getFilePointer(); // 获取文件指针位置
raf.seek(10); // 将文件指针定位到10位置
raf.length(); // 获取文件长度
raf.skipBytes(10); // 跳过10个字节
raf.read系列
raf.write系列