IO流体系(学习构造方法就行)
InputStream
|-FileInputStream
|-DataInputStream
|-ObjectInputStream
|-ByteArrayInputStream
OutputStream 很少用
|-FileOuterStream
|-DataOuterStream
|-ObjectOuterStream
|-ByteArrayOuterStream
Reader
|-FileReader
|-InputStreamReader
|-BufferedReader
Writer
|-FileWriter
|-InputStreamWriter
|-BufferedWriter
|-PrintWriter
IO流方法
1.close();所有的流都有IO异常,所有的流都必须关闭,防泄漏,close写在finally代码块里
2.read();每次读取一个字节
3.read(byte[]);每次读取一定长度的字节到byte[],返回读到字节的长度,没有读到返回-1;
4.read(byte[],int offset,int length);每次读取一定长度的字节到byte[]的offset开始的地方
5.write();跟read类似
6.flush();养成习惯,write之后写一句
File类
1.在Java中,File类用来表示文件或文件夹的具体类
2.File类有4个构造方法,其中3个用的比较多
File file = new File(Sreing name);
3.常用方法:
getName();获取文件/文件夹名
getAbsolutePath();获取绝对路径
getPath();获取相对于当前文件的路径,根本用不到
exists();存不存在
length();文件的长度,文件夹没有长度
getParent();获取父目录,返回字符串
lastModified();最后修改时间,long类型
createNewFile();创建一个没有的文件,目录不存在无法创建
getParentFile().mkdirs();创建多组目录文件夹
renameTo();剪切文件、重命名文件
delete();只能删除文件和空文件夹
文件递归获取
1.递归必须要有终止条件,否则会栈溢出
2.阶乘
3.九九乘法表
4.递归要用的3个方法
isFile();是否是一个文件
isDiretory();是否是一个文件夹
listFiles();返回当前文件夹下的所有文件和文件夹(只返回一层)
5.制作FileUtils工具类
文件读写操作
FileInputStream fis = new FileInputStream(String filename);
int len = -1;
byte[] buf = new byte[1024];
while((len = fis.read(b))!=-1){
system.out.println(new String(buf,0,len));
}
fis.close();
File file = new File(String FileName)
if (!file.exists()) {
file.getParentFile().mkdirs()
}
Scanner scanner = new Scanner(System.in)
OutputStream os = new FileOutputStream(file)
String input = scanner.next()
while (!input.equals("...")) {
//字符串转字节数组
os.write(input.getBytes())
os.write("\r\n".getBytes())
os.flush()
input= scanner.next()
}
os.close()
//关闭之后才能重命名
//如果文件存在,重命名失败
System.out.println(file.renameTo(new File("C:/Users/superman/Desktop/test/8.txt")))
scanner.close()
}
1.功能:提供对象序列化(持久化存储)的工具
2.写法:用FileInputStream和FileOutputStream来封装
1.写法:用FileInputStream和FileOutputStream来封装
2.一个类需要存储,必须实现Serializable接口
3.序列化和反序列化需要用到同一个UID,随机分配就可以
1.ByteArrayInputStream读的是字节数组
2.ByteArrayOutputStream与FileInputStream一起用,作为中转站,防止读取文件出现乱码
ByteArrayOutputStream baos = new ByteArrayOutputStream()
baos.write(buf,o,len)
sysotem.out.println(baos.toString("GBK"))
sysotem.out.println(baos.toString("GB2312"))
sysotem.out.println(baos.toString("UTF-8"))
字符流(Reader、Writer)
1.写法跟InputStream一样,就是将byte[]改成char[]
2.字符流只能复制文本文件,字节流可以复制任意文件
3.复制文本首选字节流,字符流只是需要读取文本的时候
BufferedWriter(写法与FileWriter相似)、BufferedReader写法又有些不同
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine())!=null){
system.out.println(line);
}
bufr.close();
1.网络中传递都是字节,一般用于读取网络文件(字节流→→→(InputStramReader)→→→字符流→→→(BufferedReader)→→→带缓冲区的字符流)
2.但如果读取文本文件,直接用FileWriter和FileReader就可以了
打印流(PrintWriter)
1.常用于写入文本文件
随机流(RandomAccessFile)
1.不属于IO流
2.seek(),writeUTF()
3.复制大文件工具类
防止读取文件乱码的三种方法
1.用FileReader文件读取
2.用InputStreamReader转接流读取
3.用ByteArrayInputStream用字节数组读取