java-IO

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();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值