1. 字节流
2. File类
3. 字符流
1. 字节流
1.1 InputStream和OutputStream
这是两个接口
(1)InputStream
abstract intread() 读一个字节int read(byte[] b) 读字节到此数组int read(byte[] b,int off,intlen) 最多读len个字节到b的偏移off处long skip(longn) 跳过n个字节int available() 返回在不阻塞的情况下可获取的字节数
(2)OutputStream
1.2 FileInputStream和FileOutputStream
1.3 BufferedInputStream和BufferedOutputStream
1.4 对象序列化
将实现了Serializable接口的对象转换成一个字节序列,并能在以后将这个字节序列完全恢复成原来的对象,可跨网络、跨平台进行。
序列化时不仅保存了对象的全部信息,而且跟踪对象内包含的引用,并保存引用指向的对象,并一直往下追溯。
(1)ObjectOutputStream
(2)ObjectInputStream
(3)例子
序列化一个Date对象,然后还原
1 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("date.dat"));2 Date a = newDate();3 System.out.println("原来的对象:"+a.toString());4 oos.writeObject(a);5 oos.close();6
7 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("date.dat"));8 Date x =(Date)ois.readObject();9 System.out.println("恢复的对象:"+x.toString());10 ois.close();
(4)序列号
创建一个某类对象,然后将其序列化保存;修改类成员,然后试图根据之前序列化的文件恢复对象。会发生错误:
java.io.InvalidClassException: com.company.TestCollection; local class incompatible: stream classdesc serialVersionUID = -7422208144105093601, local class serialVersionUID = -4251096331699201662
序列化时需要序列号,默认序列号与类成员关联,因为修改了类的成员,因此恢复时由于序列号不匹配无法恢复。
解决:为类添加序列号
IDEA设置对实现Serializable接口的类,如果没有加序列号成员则报警告
1.5 标准输入输出流
public static final InputStream in 字节输入流 ------System.inpublic static final PrintStrean out 字节输出流-------System.out
---------------------------------------------------------------------------------------------------
2. File类
文件和目录的抽象表示
类静态成员:
File.pathSeparator
File.pathSeparatorChar
File.separator
File.separatorChar
File.listRoots() 获取可用根目录(windows就是所有可用盘符)
构造:
File(File parent,String child)
File(String pathname)
File(String parent,String child)
File(URI uri)
常用方法:
1 //创建
2 booleancreateNewFile() 如果文件不存在,则原子性的创建此文件3 booleanmkdir() 创建目录4 booleanmkdirs() 创建目录(如果指定的父级目录不存在,则也会创建其父级目录)5 //删除
6 booleandelete() 删除相对路径指定的文件或目录7 //获取
8 File getAbsoluteFile() 获取绝对路径9 String getAbsolutePath() 获取据对路径10 File getCanonicalFile() 获取绝对路径,会解析如 . .. 这样表示当前目录和父目录的符号11 String getCanonicalPath()获取绝对路径,会解析如 . .. 这样表示当前目录和父目录的符号12 String getName() 文件或目录名13 String getParent() 父目录相对路径名14 File getParentFile() 父目录相对路径15 String getPath() 转成字符串类型的路径16 longlastModified() 最后的修改时间17 longlength() 文件长度,单位字节18 //判断
19 booleanexists() 此文件或目录是否存在20 booleanisAbsolute() 是否是绝对路径21 booleanisDirectory() 是否是一个目录22 booleanisFile() 是否是一个文件23 booleanisHidden() 是否是隐藏文件24 //修改
25 booleanrenameTo(File dest) 重命名26 boolean setExecutable(booleanexecutable) 设置owner的可执行权限27 boolean setExecutable(boolean executable,boolean ownerOnly) 设置owner或所有人的可执行权限
例子:
(1)列出某目录下所有文件和目录
File x = new File("D:\\CodeEnv\\iedaPros");
File [] files=x.listFiles();for(File f:files) {if(f.isFile()) {
System.out.println("文件:"+f.getName()+" 长度:"+f.length());
}else if(f.isDirectory()) {
System.out.println("目录:"+f.getName()+" 长度:"+f.length());
}else{continue;
}
}
(2)给一个相对路径或相对路径下的某一个文件,找其所在目录下所有java文件(包括子目录下的)
1 void fun(File file) throwsIOException{2 if(file.isDirectory()) {3 File[] files =file.listFiles();4 for(File f : files) {5 if(f.isFile()) {6 if (f.getName().endsWith(".java")) {7 System.out.println(f.getName());8 }9 }10 else if(f.isDirectory()) {11 fun(f);12 }13 }14 }15 else if(file.isFile()) {16 File tmp =file.getAbsoluteFile();17 File p =tmp.getParentFile();18 fun(p);19 }20 }21
22
23
24 File x = new File("test.txt");25 fun(x);
(3)删除指定目录
先删除该目录下所有子目录和文件,然后才能删除该目录本身
1 void funDelete(File file) throwsIOException {2 if(file.isDirectory()) {3 File[] files =file.listFiles();4 for(File f:files) {5 if(f.isFile()) {6 f.delete();7 }8 else if(f.isDirectory()) {9 funDelete(f);10 }11 }12 file.delete();13 }14 }15
16
17
18 File x = new File("xt");19 funDelete(x);
-------------------------------------------------------------------------------------------------------
3. 字符流
处理Unicode编码的字符
3.1 Reader和Writer
Reader方法:
Writer方法:
void write(intc)voidwrite(String str)void write(String str,int off,intlen)void write(char[] cbuf)void write(charp[] vbuf,int off,int len)
3.2 FileReader和FileWriter
字符输入输出流
(1)
FileReader的构造:
FileReader(File file)
FileReader(FileDescriptor fd)
FileReader(String fileName)
(2)
FileWriter的构造:
FileWriter(File file)
FileWriter(File file,booleanappend)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName,boolean append)
(3)简单例子
例子:先以追加方式写数据到文件,然后读出显示
一次读一个字符:
1 FileWriter w = new FileWriter("D:\\CodeEnv\\iedaPros\\test.txt",true);2 w.write("FileWriter类1\n");3 w.write("FileWriter类2\n");4 w.write("FileWriter类3\n");5 w.flush(); //刷新缓冲
6 w.close();7
8 FileReader r = new FileReader("D:\\CodeEnv\\iedaPros\\test.txt");9 intch;10 while((ch=r.read()) != -1) {11 System.out.print((char)ch);12 }13 r.close();
使用字符数组,每次读多个字符:
FileReader r = new FileReader("D:\\CodeEnv\\iedaPros\\test.txt");char ch[] = new char[5]; //一次最多读5个
int len = 0;while((len=r.read(ch)) != -1) {
System.out.print(new String(ch,0,len));
}
r.close();
3.3 BufferedReader、BufferedWriter
字符缓冲流:读入或写到字符输入输出流(FileReader、FileWriter),但是缓冲各个字符,对单个字符、数组、字符串的写入、读取更高效
(1)BufferedWriter
构造:
BufferedWriter(Writer out)
BufferedWriter(Writer out,int sz)
方法:
void newLine() 写入一个换行符[换行符根据系统确定]
(2)BufferedReader
构造:
BufferedReader(Reader in)
BufferedReader(Reader in,int sz)
方法:
String readLine() 读入一行,不包括换行符
(3)例子
1 BufferedWriter bw = new BufferedWriter(new FileWriter(filepath,true));2 bw.write("BufferedWriter类-1\n");3 bw.write("BufferedWriter类-2\n");4 bw.close();5
6 BufferedReader br = new BufferedReader(newFileReader(filepath));7 char chs[] = new char[5];8 int len = 0;9 while((len=br.read(chs)) != -1) {10 System.out.print(new String(chs,0,len));11 }12 br.close();
3.4
-------------------------------
4. 打印流
(1)PrintStream
(2)PrintWriter