File 类的常用方法
public String getAbsolutePath();获取绝对路径
public String getPath();获取路径
public String getName();获取名称
public String getParent();获取上层文件目录路径(若无,返回null)
public long lengeh();获取文件长度。(不能获取目录的长度)
public long lastModified();获取最后一次修改的时间(毫秒值)
public String[] list();获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles();获取指定目录下所有文件或者文件目录的的File数组
public boolean mkdir();创建文件夹,创建一级路径
public boolean mkdirs();创建文件夹,创建多级路径
public boolean delete();删除文件
public boolean isDirectory();判断是否是文件目录
public boolean isFile();判断是否是文件
public boolean exists();判断是否存在
public boolean canWrite();判断是否可写
public boolean canRead();判断是否可写读
public boolean isHidden();判断是否隐藏
IO流
IO流原理:
输入input:读取外部数据到程序(内存)中
输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
流的分类
按处理数据单位划分:字节流 :字节输入流InputStream基类
字节输出流OutputStream基类
字符流:字符输入流Reader基类
字符输出流Writer基类
按照流向划分:输入流:InputStream和Reader作为基类
输出流:OutputStream和Writer作为基类
InputStream和OutputStream
read(int i)| write(int i):从输入流(输出流)中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到 达流末尾而没有可用的字节,则返回值 -1。
read(byte[] b) | write(byte[] b):从此输入流(输出流)中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经 到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取的字节数。
read(byte[] b, int off,int len) | read(byte[] b, int off,int len):将输入流(输出流)中最多 len 个数据字节读入 byte 数组。尝试读取 len 个 字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而 没有可用的字节,则返回值 -1。
public void close() throws IOException 关闭此输入流并释放与该流关联的所有系统资源。
Read和Writer
int read()读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的 Unicode码),如果已到达流的末尾,则返回 -1
int read(char[] cbuf)将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符 数。
int read(char[] cbuf,int off,int len)将字符读入数组的某一部分。存到数组cbuf中,从off处开始存 储,最多读len个字符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
public void close() throws IOException关闭此输入流并释放与该流关联的所有系统资源。
流的体系
缓冲流
分类:BufferedInputStream 和 BufferedOutputStream
BufferedReader 和 BufferedWriter
当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个 (8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。
向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才 会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流
转换流
提供字节流和字符流之间的转换
InputStreamReader:将InputStream转换为Reader
OutputStreamWriter:将Writer转换为OutputStream
注: 将字节流转换为字符流,可以传递编码格式,注意保证编码格式的统一
InputStream in = new FileInputStream("D:\\test\\cn8.txt");
//创建转换流对象
//InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表 读取,将会发生错误解码的错误
InputStreamReader isr = new InputStreamReader(in,"utf-8");
//使用转换流去读字节流中的字节
常见的编码表
ASCII:美国标准信息交换码。用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表用一个字节的8位表示。
GB2312:中国的中文编码表。最多两个字节编码所有字符
GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字 都用两个字节来表示。
UTF-8:变长的编码方式,可用1-4个字节来表示一个字符
标准流
System.in和System.out分别代表了系统标准的输入和输出设备
重定向:通过System类的setIn,setOut方法对默认设备进行改变。
public static void setIn(InputStream in)
public static void setOut(PrintStream out)
对象流
ObjectInputStream和OjbectOutputSteam:用于存储和读取基本数据类型数据或对象的处理流。它的强 大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化:用ObjectOutputStream类保存基本类型数据或对象的机制。
反序列化:用ObjectInputStream类读取基本类型数据或对象的机制。
Serializable接口
实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这 一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在 Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。 由于大部分作为参数的类如String、Integer等都实现了java.io.Serializable的接口,也可以利 用多态的性质,作为参数使接口更灵活
瞬态关键字transient
当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字 transient修饰。只要被transient修饰了,序列化时这个属性就不会琲序列化了。同时静态修饰也不会被 序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。
例题
实现文件的复制。
public class IO_Test {
public static void main(String[] args) {
copy();
}
public static void copy(){
InputStream inputStream=null;
OutputStream outputStream=null;
try {
inputStream=new FileInputStream("D://test.txt");
outputStream=new FileOutputStream("D://test_copy.txt");
int i;
while((i=inputStream.read())!=-1) {
outputStream.write(i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
} finally {
try {
if(null!=inputStream){
inputStream.close();
}
if (null!=outputStream){
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}