zoukankan      html  css  js  c++  java
  • Java I/O系统

        目录、文件管理使用File类,可进行文件(夹)的创建、删除、目录跳转、文件查询等操作。
        Inputstream,OutputStream是Java I/O的基础,所以输入输出相关的类都应该继承自它们。Reader和Writer是后加入的用于兼容Unicode与面向字符的I/O功能。任何自Inputstream或Reader派生而来的类都含有read()基本方法,用于读取单个字节或者字节数组;任何自OutputStream或Writer派生而来的类都有write()方法,用于写单个字节或字节数组。所有的Inputstream,OutputStream都有相应的Reader,Writer来提供天然的Unicode操作。

    一、文件读写

    1、从文件读取字符

    //从文件读取字符
    BufferedReader reader;
    try {
        reader = new BufferedReader(new FileReader("path"));
        String line;
        while ((line = reader.readLine()) != null){
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        //注意一定要关闭流,避免内存泄漏
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    2、写入文件

     //写入文件
    PrintWriter writer;
    try {
        writer = new PrintWriter("filepath");
        writer.println("content ...");
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        //注意关闭流,以免造成内存泄漏
        if (writer != null)
            writer.close();
    }

    3、RandomAccessFile ,使用seek()来跳转到指定位置后进行读写操作,使用RandomAccessFile 需要对文件的排版很清楚。
    RandomAccessFile rf = new RandomAccessFile("filepath", "rw");//r只读,rw读写
    rf.seek(5 * 8);//定位到第五个字符位置
    rf.write("contents".getBytes());

    二、标准输入输出

    1、读写

    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String line = null;
    while (true) {
        try {
            if (!((line = reader.readLine()) != null && line.length() != 0)) break;
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(line);
    }

    2、标准输入、出重定向

    方便我们将内容存储到文件,以备后查

    System.setIn(InputStream);
    System.setOut(PrintStream);
    System.setErr(PrintStream);

    三、多线程文件加锁

    FileOutputStream fos =  new FileOutputStream("filepath");
    FileLock fileLock = fos.getChannel().tryLock();//非阻塞,如果文件已被其他线程locked且不能共享则返回false,否则则添加锁并返回true
    FileLock fileLock2 = fos.getChannel().lock();//阻塞,阻塞进程直至可以获取锁;
    fileLock.release();//释放锁
    fileLock.isShared();//查询是否是共享锁

    四、压缩、解压GZIP, Zip文件

    //1、gzip适用于单个数据流(而不是一系列互异数据)
    //压缩GZIP
    BufferedOutputStream gout = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("file.gz")));
    gout.write("content".getBytes());
    //解压GZIP数据
    BufferedReader greader = new BufferedReader(new InputStreamReader(
            new GZIPInputStream(new FileInputStream("filepath"))
    ));
    greader.readLine();
    
    //2、zip可添加多个参数
    // zip压缩
    ZipOutputStream zout = new ZipOutputStream(new CheckedOutputStream(
            new FileOutputStream("filepath"), new Adler32()));// 计算校验方法:Adler32快一些,CRC32慢一些但更准确
    zout.setComment("注释说明");
    zout.write("content".getBytes());
    
    //zip解压数据
    ZipInputStream zin = new ZipInputStream(new CheckedInputStream(new FileInputStream("filename"), new Adler32()));
    BufferedInputStream zins = new BufferedInputStream(zin);
    ZipEntry zipEntry;
    while ((zipEntry = zin.getNextEntry()) != null){
        int x ;
        while ((x = zins.read()) != -1)
            System.out.println(x);
    }
    //zip解压数据方式二
    ZipFile zfile = new ZipFile("filepath");
    Enumeration<? extends ZipEntry> zentries = zfile.entries();
    while (zentries.hasMoreElements()){
        ZipEntry ze = zentries.nextElement();
    }

    注意:所有的流用完都要记得手动关闭!

    参考:I/O系统主要的类

    ByteArrayInputStream    允许将内存缓冲区当作InputStream使用,与FilterInputStream一起使用;
    StringBufferInputStream 将String转换成InputStream(已弃用);
    FileInputStream         从文件中读取信息,与FilterInputStream一起使用;
    PipedInputStream        产生用于写入PipedOutputStream数据,实现“管道化”;
    SequenceInputStream     将两个或多个InputStream对象转换成一个,与FilterInputStream一起使用;
    FilterInputStream       抽象类,子类如下:
        DataInputStream     读取基本类型及String对象;
        BufferedInputStream 
        LineNumberInputStream   弃用;
        PushbackInputStream 
    
    ByteArrayInputStream    在内存中创建缓存区,所以送往流的数据都存储在这里;
    FileOutputStream        将信息写到文件里;
    PipedOutputStream       写入管道;
    FileOutputStream        抽象类,子类如下:
        DataOutputStream    
        PrintStream         
        BufferedOutputStream
  • 相关阅读:
    linux所有命令失效的解决办法
    第一章 网络基础知识
    RNQOJ 数列
    RNQOJ Jam的计数法
    RNQOJ 开心的金明
    RQNOJ 明明的随机数
    分类讨论的技巧
    Unity 碰撞检测
    Unity --yield return
    Unity 移动方式总结
  • 原文地址:https://www.cnblogs.com/aland-1415/p/14389391.html
Copyright © 2011-2022 走看看