JAVA IO流总结
1、File的说明:
①如何创建File类的实例:
File(String filePath)
File(String parentPath, String childPath)
File(File parentPath,String childPath)
②路径:
相对路径:相较于某个路径下,指明的路径
绝对路径:包含盘符在内的文件或文件目录的路径
③路径分隔符:
windows:\\
linux:/
④File类的方法使用:
1、public String getAbsolutePath() 获取绝对路径
2、public String getPath() 获取路径
3、public String getName() 获取名称
4、public String getParent() 获取上层文件目录路径,如无,返回null
5、public long length() 获取文件长度(字节数),不能获取目录的长度
6、public long lastModified() 获取最后一次修改时间,毫秒值
8、public String[] list() 获取指定目录下的所有文件或文件目录的名称数组
9、public File[] listFiles() 获取指定目录下的所有文件或文件目录的File数组
10、public boolean isDirctory() 判断是否是文件目录
11、public boolean isFile() 判断是否是文件
12、public boolean exists() 判断是否存在
13、public boolean canRead() 判断是否可读
14、public boolean canWrite() 判断是否可写
15、public boolean isHidden() 判断是否隐藏
⑤File类的使用:
1、File类的一个对象,代表一个文件或一个文件目录(文件夹)
2、File类声明在java.io包下
3、File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容操作;
如果需要读取或写入文件内容,必须使用IO流来完成
4、后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点"
2、IO流的分类
①按操作数据单位不同分为:字节流(8bit)、字符类(16bit)
②按数据流的流向不同分为:输入流、输出流
③按流的角色不同分为:节点流、处理流
抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Write
1、Java的IO流共涉及40多个类,实际上非常规则,都是从如下四个抽象基类派生的
2、由这四个基类派生出来的子类名称都是以其父类名作为子类名后缀
3、IO流体系结构
抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
InputStream FileInputStream(read(byte[] buffer)) BufferInputStream(read(byte[] buffer))
OutputStream FileOutputStream(write(byte[] buffer,0,len)) BufferOutputStream(write(byte[] buffer,0,len)) / flush()
Reader FileReader(read(char[] cbuf)) BufferReader(read(char[] cbuf)) / readLine()
Write FileWrite(write(char[] cbuf,0,len)) BufferWrite(write(char[] cbuf,0,len)) / flush()
4、创建IO的读步骤:
①实例化File类的对象,指明要操作的文件
②提供具体的流(字符流、字节流)
③数据的读入
④流的关闭
说明:
read():返回读入的一个字符,如果到达文件末尾,返回-1
异常处理:为了保证流资源一定可以执行关闭操作,需要使用try-catch-finally处理
读入的文件一定要存在,否则报FileNotFoundException错误
5、创建IO的写步骤:
①实例化File类的对象,指明要操作的文件
②提供FileWrite对象,用数据的写出
③写出的具体操作
④流的关闭
说明:
输出操作,对应的File可以不存在,不会报异常
File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWrite(file,false) / FileWrite(file):对原有文件进行覆盖
如果流使用的构造器是:FileWrite(file,true):不会对原有文件覆盖,而是在原文件基础上追加操作
6、缓冲流:提高流的读取、写入的速度;提高速度的原因:内部提供了一个缓冲区
7、转换流:提供了字节流和字符流之间的转换;字节流中的数据都是字符时,转成字符流操作更高效
①Java API提供两个转换流:
InputStreamReader:将InputStream转换为Reader
OutputStreamWrite:将OutputStream转换为Write
②用转换流多数来处理文件乱码问题,实现编码和解码的功能
③解码:字节、字节数组 --> 字符串、字符数组
编码:字符串、字符数组 --> 字节、字节数组
④字符集:
ASCII:美国标准信息交换码,用一个字节7位可以表示
ISO8859-1:拉丁码表,欧洲码表,用一个字节8位可以表示
GB2312:中国中文编码表,最多两个字节编码所有字符
GBK:中国的中文编码表升级,融合了更多的中文字符号,最多两个字节编码所有字符
Unicode:国际标准码,融合了目前人类使用的所有字符,为每一个字符分配了唯一的字符码,所有的文字都用两个字节来表示
UTF-8:变长的编码方式,可以用1-4字节来表示一个字符
8、标准的输入、输出流:
System.in:类型是InputStream
System.out:类型是PrintStream,其是OutputStream子类、FileOutputStream子类
重定向:通过System类的setIn,SetOut方法对默认设备进行改变
public static void setIn(InputStream in)
public static void setOut(OutputStream Out)
9、打印流:将基本数据类型的数据格式转化为字符串输出
打印流:PrintStream和PrintWrite
①提供了一系列重载的print()和println()方法,用于多种数据类型的输出
②PrintStream和PrintWrite的输出不会抛出IOException异常
③PrintStream和PrintWrite有自动flush功能
④PrintStream打印的所有字符都使用平台的默认字符编码转换为字节;在需要写入字符而不是写入字节的情况下,应该使用PrintWrite类
⑤System.Out返回的是PrintStream的实例
10、数据流:方便操作Java语言的基本数据类型和String的数据,可以使用数据流
DataInputStream和DataOutputStream:用于读取或写出基本数据类型的变量或字符串
11、对象流:用于存储和读取基本数据类型数据或对象的处理流:
序列化:用ObjectOutputStream类保存基本数据类型或对象的机制
反序列化:用ObjectInputStream类读取基本数据类型或对象的机制
ObjectOutputStream和ObjectInputStream不能序列化static、transient修饰的成员变量
序列化要求:
①需要实现序列化接口:Serializable
②当前类提供一个全局常量:serializableUID
private static void final long serializableUID = 6645456564645L;
③除了当前xxx类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的(默认情况,基本数据类型是可序列化的)
12、随机存取文件流:RandomAccessFile既可以作为输入流,又可以作为输出流
①RandomAccessFile类支持"随机访问"的方式,程序可以直接调到文件的任意地方来读、写文件
只支持访问文件的部分内容
可以向已存在的文件后追加内容
②RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置
RandomAccessFile类对象可以自由移动记录指针:
long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到pos位置
③构造器:
public RandomAccessFile(File file,String mode)
public RandomAccessFile(String name,String mode)
创建RandomAccessFile类实例需要指定一个mode参数,该参数指定RandomAccessFile的访问模式:
r:只读方式打开,不会创建文件
rw:打开以便读取和写入,如果文件不存在则去创建文件
rwd:打开以便读取和写入,同步文件内容的更新
rws:打开以便读取和写入,同步文件内容和元数据的更新