File 类:
是操作系统中,文件和目录(文件夹)的抽象表示形式
构造方法:
public File(String pathname)
public File(String parent,String child)
public File(File parent,String child)
成员方法:
创建功能
public boolean createNewFile():如果不存在就创建该文件
public boolean mkdir():创建目录
public boolean mkdirs():创建目录们
删除功能
public boolean delete()
重命名功能
public boolean renameTo(File dest):重新命名文件,带有 move的功能,可以指定不同的目录结构
判断功能
public boolean isDirectory():是否为目录
public boolean isFile():是否为文件
public boolean exists():是否存在
public boolean canRead():是否可以读
public boolean canWrite():是否可以写
public boolean isHidden():是否隐藏
基本获取功能
public String getAbsolutePath():获取绝对路径的字符串表示形式
public String getPath():此抽象路径名的字符串形式
public String getName():返回由此抽象路径名表示的文件或目录的名称
public long length():返回由此抽象路径名表示的文件的长度
public long lastModified():最后修改时间
高级获取功能
public String[] list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
public File[] listFiles()
什么是绝对路径:带有盘符的路径
什么是相对路径:既然是相对路径,必须要有参照物
默认在eclipse中,默认的参照物路径是什么呢?
-> 当前的项目路径,作为默认的参考路径
-> 例如:day20 是当前的项目,那么day20目录的绝对路径,就是默认的参考路径
-> C:\Users\小可爱\workspace\day20\a.txt
流的分类
输入流:InputStream
输出流:OutputStream
字节流:
字符流:
IO流中我们会学习四种流
1:字节的输入流:InputStream(抽象类)abstract
2:字节的输出流:OutputStream(抽象类)abstract
3:字符的输入流:Reader(抽象类)abstract
4:字符的输出流:Writer(抽象类)abstract
字符 = 字节 + 编码
字节流和字符流可以转换
举例:使用OutputStream 以及子类FileOutputStream
实现向文本文件中写入一句话"helloworld"
什么时候使用输入流,什么时候使用输出流
我们要在java程序的角度考虑:
如果对于java程序来讲,是将硬盘上面的文件,读入java程序的,就使用输入流
如果对于java程序来讲,是将java程序(内存)中的文件,写入到硬盘上,就使用输出流
OutputStream
创建输出流具体做了什么事情?
1:先创建java的对象
2:将对象的引用,指向 堆空间的地址
3:又调用操作系统的命令,来具体创建一个“文件”
4:将对象的引用跟操作系统中“文件”发生了关联
数据写成功后,为什么要close()?
close()做了两个事情:
1:告诉jvm,java的输出流对象,可以销毁了(gc)
2:告诉操作系统,可以回收“文件”相关的系统资源了
如何实现数据的换行?
windows自带的notepad 应用程序,对'\n' 不能解析为 换行操作
eclipse自带的 文件编辑器,可以对'\n'解析为换行操作
sublime Text 这种高级的文本编辑器,也可以对'\n'解析为换行操作
如果,我们非要用notepad来显示换行结果,那么需要将'\n' 换成'\r\n' 这两个字符
在windows操作系统,'\r\n'才显示换行
在linux操作系统,'\n'才表示换行
在mac操作系统,'\r'才表示换行
如何实现数据的追加写入?
FileOutputStream(File file, boolean append) throws FileNotFoundException 如果为 true,则将字节FileOutputStream(String name, boolean append) throws FileNotFoundException 如果为 true,则将字节写入文件末尾处,而不是写入文件开始处
InputStream 以及直接子类FileInputStream的常用方法演示
构造方法:
成员方法:
abstract int read() :从输入流中读取数据的下一个字节。
int read(byte[] b) :从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
int read(byte[] b, int off, int len) : 将输入流中最多 len 个数据字节读入 byte 数组。
IO流的输入输出示意图
字节缓冲流
BufferedOutputStream
BufferedOutputStream(OutputStream out):内部维护了一个默认的字节数组 81024 = 8192
BufferedInputStream
BufferedInputStream(OutputStream in):内部维护了一个默认的字节数组 81024 = 8192
转换流
InputStreamReader
public InputStreamReader(InputStream in):使用默认编码表,对字节输入流进行转换,转为字符流
public InputStreamReader(InputStream in,String charsetName):按照指定的编码表,对字节输入进行转换,转为字符流
OutputStreamWriter
public OutputStreamWriter(OutputStream out):使用默认编码表,对字节输出流进行转换,转换为字符流
public OutputStreamWriter(OutputStream out,String charsetName):按照指定的编码表,进行转换,转为字符流
转换流的简化形式
FileWriter
FileReader
字符的缓冲流
BufferedWriter
BufferedWriter(Writer out):默认内部有一个字符数组,大小为8192
BufferedWriter(Writer out, int sz):指定一个指定字符数组大小
BufferedReader
BufferedWriter
void newLine() :写入一个行分隔符。 newLine()方法自动可以区别
windows,linux,mac操作系统不同,而是使用不同的换行符号
BufferedReader
String readLine() :读取一个文本行。 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
专门简化 针对于八种基本数据类型的操作的输入输出字节流
DataInputStream
readInt()
readShort()
readByte()
readBoolean()
DataOutputStream
writeInt()
writeShort()
writeByte()
writeBoolean()
内存操作流
ByteArrayOutputStream
ByteArrayInputStream
字符串的内存操作流
StringWriter
StringWriter(): 内部维护了一个StringBuffer
StringReader
操作字符数据的内存操作流
CharArrayReader
CharArrayWrite
CharArrayWriter() :创建一个新的 CharArrayWriter。 内部维护了一个32位的char数组
字节打印流
PrintStream
序列化流
ObjectOutputStream
反序列化流
ObjectInputStream
序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?
java.io.InvalidClassException:com.newedu.jb.day18.Student;localclassincompatible:streamclassdescserialVersionUID=-5645637854964219108,localclassserialVersionUID=5801530254694984584
为了在序列化操作的过程中,辨识一个对象的身份的id号。
jvm会判断 本地的class的serialVersionUID 和从文件中反序列化出来的对象的serialVersionUID 作比较。
如果不相等,就抛出异常。
递归recursion的概念,以及注意事项:
递归概念:
方法内部调用方法本身的情况
递归导致栈空间溢出的问题图示