Java-I/O用法总结

一、File类

1、File类基本使用

java,io,File类是普通类,直接实例化对象即可使用。

构造方法:

  • public File(String pathname) 
  • public File(String parent, String child)

 判断文件是否存在:

  • public boolean exists()

文件创建与删除:

  • 创建:public boolean createNewFile() throws IOException
  • 删除:public boolean delete()

2、常用目录操作

  • 获取父路径:public String getParent()
  • 获取父File对象:public File getParentFile()
  • 创建多级目录:public boolean mkdirs()

下面通过例子来看上面这些方法的简单使用:

public static void main(String[] args) {
        //为支持跨平台,路径分隔符使用File.separator
        File file = new File("E:" + File.separator + "java" +
                File.separator + "MyExercise" + File.separator + "javaIO" + File.separator + "IO.txt");

        if (file.getParentFile().exists()) {
            System.out.println("目录已存在,正在创建文件...");
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("文件创建成功!");
        } else {
            System.out.println("目录不存在,先创建目录...");
            file.getParentFile().mkdirs();
            System.out.println("目录创建成功,正在创建文件...");
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("文件创建成功!");
        }
    }

3、取得文件信息

  • 判断路径是否是文件: public boolean isFile()
  • 判断路径是否是目录: public boolean isDirectory()
  • 取得文件大小(字节): public long length()
  • 最后一次修改日期 : public long lastModified()

4、查看目录的组成

  • public File[]  listFiles()

思考:利用上面这些方法,如何打印出指定目录的全部组成?

public static void main(String[] args) {
        File file = new File("E:" + File.separator + "java" + File.separator + "MyExercise");
        listAllFiles(file);
    }
    private static void listAllFiles(File file){
        if(file != null){
            if(file.isDirectory()){
                //当前文件对象为文件夹,递归
                File[] files = file.listFiles();
                for (File temp:files){
                    listAllFiles(temp);
                }
            }else{
                //若为文件则直接打印
                System.out.println(file);
            }
        }
    }

二、字节流与字符流:

字符流用于文字处理,尤其是处理中文时支持较好,除此之外均使用字节流(文件存储、网络传输)。

1、IO流的使用

IO流的使用,基本流程都是一样的,一般操作分以下四步:

  • 根据文件路径创建File对象
  • 根据字节流或字符流的子类实例化父类对象 
  • 进行数据的读取或写入操作
  • 关闭流

2、字节流:InputStream、OutputStream

(1)字节输出流:OutputStream

  • public abstract class OutputStream implements Closeable, Flushable

OutputStream是一个抽象类,如果要进行文件操作,可使用子类FileOutputStream实例化

常用的方法:write()  参数可以是单个字节、也可以是字节数组

  • write()操作默认为覆盖文件内容,若需要在文件中追加内容,创建输出流时加一个参数true 。

       OutputStream out = new FileOutputStream(file,true);

OutputStream简单使用:

public static void main(String[] args) throws IOException {
        //1、取得终端对象File
        File file = new 
        File("E:"+File.separator+"java"+File.separator+"TestOutputStream.txt");
        //2、取得相应终端的输出流
        OutputStream out = new FileOutputStream(file,true);
        //3、将数据通过流输出
        out.write("hello world\n".getBytes());
        //4、关闭流
        out.close();
}

  (2)字节输入流:InputStream

  •  public abstract class InputStream implements Closeable

InputStream也是抽象类,通过子类FileInputStream实例化。

常用方法:public int read()  有返回值,返回的是读取的字节数,返回-1说明读取完毕。

思考:如何利用字节输入流和字节输出流实现文件拷贝?

public class TestStream{
    /*文件拷贝*/
    public static void main(String[] args) throws IOException{
        //源文件:
        File sourceFile = new File("E:/java/MyExercise/desktop.jpg");
        //目标文件
        File destFile = new File("E:/java/MyExercise/new.jpg");
        //输入输出流
        InputStream in = new FileInputStream(sourceFile);
        OutputStream out = new FileOutputStream(destFile);
        //文件拷贝
        copyFile(in,out);
    }
    private static void copyFile(InputStream in,OutputStream out) throws IOException {
        System.out.println("开始文件拷贝。。。");
        long start =System.currentTimeMillis();
        int len = 0;
        byte[] data = new byte[1024];
        while((len=in.read(data)) != -1){
            out.write(data,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("文件拷贝结束!");
        System.out.println("共用时 "+(end-start)+" 毫秒");
    }
}

3、字符流:Reader、Writer

(1)字符输出流:Writer

  • public abstract class Writer implements Appendable, Closeable, Flushable
  • Writer的使用方法和OutputStream很相似,但对中文的支持更好。也提供了write()方法,可直接输出字符串:
    public void write(String str) throws IOException
    
  • 字符有缓冲区,若未刷新或者关闭,则数据默认在缓冲区不会输出到终端。

    强制刷新缓冲区:flush();       关闭:close()

(2)字符输入流:Reader

用法和InputStream相似。Writer可以直接输出字符串,但Reader不支持直接读取字符串,只能通过字符数组读取。


三、打印流与输入流

1、认识打印流

java提供有专门的打印流:字节打印流PrintStream、字符打印流PrintWriter。(打印流是对OutputStream的封装)

构造方法:
public PrintStream(OutputStream out)
public PrintWriter(OutputStream out)

我们常用的System.out.println() 系统输出,其实就是IO流的范畴:

System类定义了三个操作的常量:

1. 标准输出(显示器) : public final static PrintStream out
2. 错误输出 : public final static PrintStream err
3. 标准输入(键盘):public final static InputStream in

系统输入:

  • System.in :从键盘输入,直接是InputStream的对象,没有任何包装

系统输出:

  • System.out :实际上就是PrintStream对象
  • System.err:标准错误输出,也是打印流对象

2、认识输入流:

目前常用的输入使用Scanner类,利用这个类可以方便处理各种数据类型,同时还可以结合正则表达式使用。

使用Scanner类专门处理输入流

java.util.Scanner类

  • 构造方法public Scanner(InputStream source)

3、总结:

通常输出使用PrintStream,输入使用Scanner。

示例:输出内容到文件:

示例:从文件读取内容后打印:


四、序列化与反序列化

对象的序列化是指将内存中的对象转为二进制传输或保存。反之,将二进制数据转为对象即为反序列化。

1、前提:

序列化使用java.io.serializable接口,只要类实现了这个接口,就具备序列化的能力。Serializable接口称为标记接口(里面无任何方法)

2、对象序列化,用到以下两个类:

ObjectOutputStream :将对象序列化输出

  • public class ObjectOutputStream extends OutputStream implements ObjectOutput
  • public ObjectOutputStream(OutputStream out) :指出要输出的端
  • public final void writeObject(Object obj):将指定对象变为二进制

ObjectInputStream :将对象反序列化输入

  • public final Object readObject():反序列化为对象

3、transient关键字:

实现Serializable接口的类,在进行序列化时默认会将所有的属性进行序列化,如果某些属性不想被序列化,则可使用transient关键字修饰此属性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值