`

io, nio常用代码收集

    博客分类:
  • java
阅读更多
关闭流:
public static void closeSilently(Closeable closeable) {
    if (closeable != null) {
        try {
            closeable.close();
        } catch (IOException ex) {
        }
    }
}


普通io方式的拷贝:
/***
 * <p> 使用字节流进行拷贝. 拷贝完成后不会关闭流, 流的位置将保持在最后一次读取和写入的位置. </p>
 */
public static void copy(InputStream src, OutputStream dst, int bufferSize) throws IOException {
    BufferedOutputStream bos = new BufferedOutputStream(dst);
    byte[] buffer = new byte[bufferSize];
    int len;
    while ((len = src.read(buffer)) != -1) {
        bos.write(buffer, 0, len);
    }
    bos.flush();
}

/***
 * <p> 使用字符流进行拷贝. 拷贝完成后不会关闭流, 流的位置将保持在最后一次读取和写入的位置. </p>
 */
public static void copy(Reader src, Writer dst, int bufferSize) throws IOException {
    BufferedWriter bw = new BufferedWriter(dst);
    char[] buffer = new char[bufferSize];
    int len;
    while ((len = src.read(buffer)) != -1) {
        bw.write(buffer, 0, len);
    }
    bw.flush();
}

/***
 * <p> 使用随机访问文件进行拷贝. 拷贝完成后不会关闭文件, 位置将保持在最后一次读取和写入的位置. </p>
 */
public static void copy(RandomAccessFile src, RandomAccessFile dst, int bufferSize) throws IOException {
    byte[] buffer = new byte[bufferSize];
    int len;
    while ((len = src.read(buffer)) != -1) {
        dst.write(buffer, 0, len);
    }
}


nio方式的拷贝:
/***
 * <p> 使用FileChannel的transferFrom进行拷贝. transferFrom最大支持的文件在2GB左右, 不同的jvm可能会有不同的限制. </p>
 */
public static void copy(String srcFile, String dstFile) throws IOException {
    FileChannel srcChannel = null;
    FileChannel dstChannel = null;
    try {
        srcChannel = new FileInputStream(srcFile).getChannel();
        dstChannel = new RandomAccessFile(dstFile, "rw").getChannel();
        dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
        // 或者
        // srcChannel.transferTo(0, dstChannel.size(), dstChannel);
    } finally {
        closeSilently(srcChannel);
        closeSilently(dstChannel);
    }
}

/***
 * <p> 使用Channel进行拷贝. 拷贝完成后不会关Channel, Channel将位置保持在最后一次读取和写入的位置.</p>
 */
public static void copy(ReadableByteChannel src, WritableByteChannel dst, int bufferSize) throws IOException {
    ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
    while (src.read(buffer) != -1) {
        buffer.flip();
        dst.write(buffer);
        buffer.clear();
    }
}


普通io方式读取文本:
/***
 * <p> 从指定的流读取文本. 读取结束后流不会关闭. </p>
 * @param is 要读取文本的流
 * @param enc 流中文本所使用的编码
 * @return
 * @throws IOException
 */
public static String readString(InputStream is, String enc) throws IOException {
    try {
        return readString(new InputStreamReader(is, enc));
    } catch (UnsupportedEncodingException ex) {
        throw new IllegalArgumentException(ex);
    }
}

private static String readString(Reader r) throws IOException {
    BufferedReader reader = new BufferedReader(r);
    StringBuilder buffer = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        buffer.append(line);
    }
    return buffer.toString();
}

/***
 * <p> 从指定的文件读取文本. </p>
 * @param filepath 要读取文本的文件
 * @return
 * @throws IOException
 */
public static String readString(String filepath) throws IOException {
    // 不像InputStreamReader, FileReader可以自动识别文件的编码
    FileReader reader = null;
    try {
        reader = new FileReader(filepath);
        return readString(reader);
    } finally {
        closeSilently(reader);
    }
}

public static String scanString(String filepath) throws IOException {
    Scanner sc = null;
    try {
        File file = new File(filepath);
        sc = new Scanner(file);
        StringBuilder buffer = new StringBuilder((int) (file.length()/3));
        while (sc.hasNextLine()) {
            buffer.append(sc.nextLine());
        }
        return buffer.toString();
    } finally {
        if (sc != null) {
            sc.close();                
        }
    }
}


nio读取文本:
/***
 * <p> 以nio的方式从指定Chanle读取文本. 读取完成后不会关Channel, Channel将位置保持在最后一次读取的位置. </p>
 */
public static void readString(ReadableByteChannel src, int bufferSize, String enc) throws IOException  {
    try {
        ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
        StringBuilder str = new StringBuilder();
        Charset cs = Charset.forName(enc);
        while (src.read(buffer) != -1) {
            buffer.flip();
            CharBuffer cbuffer = cs.decode(buffer);
            str.append(cbuffer.toString());
            buffer.clear();
            // 也可以使用
            /*
            int length = buffer.remaining();
            if (bytes == null || length > bytes.length) {
                bytes = new byte[length];
            }
            buffer.get(tmp, 0, length);
            String text = new String(tmp, enc);
            str.append(cbuffer.toString());
             */
        }
    } catch (UnsupportedEncodingException ex) {
        throw new IllegalArgumentException(ex);
    }
}


普通io方式写出文本:
/***
 * <p> 将文本写入到指定的输出流中. 写入完毕后流不会关闭. </p>
 * @param text
 * @param os
 * @param enc
 * @throws IOException
 */
public static void writeString(String text, OutputStream os, String enc) throws IOException {
    try {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, enc));
        bw.write(text);
        bw.flush();
    } catch (UnsupportedEncodingException ex) {
        throw new IllegalArgumentException(ex);
    }
}

public static void writeString(String text, Writer writer) throws IOException {
    BufferedWriter bw = new BufferedWriter(writer);
    bw.write(text);
}

/***
 * <p> 将文本写入到指定的文件中. </p>
 * @param text
 * @param filepath
 * @throws IOException
 */
public static void writeString(String text, String filepath) throws IOException {
    FileWriter fw = null;
    try {
        fw = new FileWriter(filepath);
        writeString(text, fw);
    } finally {
        closeSilently(fw);
    }
}

public static void printString(String text, String filepath) throws IOException {
    PrintWriter pw = null;
    try {
        pw = new PrintWriter(new File(filepath));
        pw.print(text);
    } finally {
        closeSilently(pw);
    }
}


nio写出文本:
/***
 * <p> 以nio的方式将文本写入Chanle. 写入完成后不会关Channel, Channel将位置保持在最后一次写入的位置. </p>
 * @param dst 要写入的channel
 * @param text 要写出的文本
 * @param enc 文本转换为字节时的编码
 * @param bufferSize ByteBuffer的大小
 */
public static void writeString(WritableByteChannel dst, String text, String enc, int bufferSize) throws IOException {
    byte[] textBytes = text.getBytes(enc);
    writeString(dst, textBytes, bufferSize);
}

/***
 * <p> 以nio的方式将文本写入Chanle. 写入完成后不会关Channel, Channel将位置保持在最后一次写入的位置. </p>
 * @param dst 要写入的channel
 * @param textBytes 文本经过编码后的字节
 * @param bufferSize ByteBuffer的大小
 */
public static void writeString(WritableByteChannel dst, byte[] textBytes, int bufferSize) throws IOException {
    int i = 0;
    int strBytesLength = textBytes.length;
    
    ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
    for (; i < strBytesLength && i + bufferSize < strBytesLength; i += bufferSize) {
        buffer.put(textBytes, i, bufferSize);
        buffer.flip();
        dst.write(buffer);
        buffer.clear();
    }
    int remind = textBytes.length - i;
    buffer.put(textBytes, i, remind);
    buffer.flip();
    dst.write(buffer);
}
分享到:
评论

相关推荐

    很少见的Java经典代码

    这些知识点只是Java编程中的一部分,"很少见的Java经典代码"可能会涵盖更多高级特性或不常用的技术,旨在帮助开发者提升技能和解决问题的能力。通过深入学习和实践这些代码,你可以成为更出色的Java程序员。

    java常用技术整理-基础架构方面.rar

    最后,Java的IO/NIO系统提供了处理输入输出的能力,而NIO2(New IO,也称Asynchronous File Channel)引入了非阻塞I/O和选择器,适用于高性能服务器应用。网络编程也是Java的一大应用场景,Socket编程和HTTP客户端库...

    疯狂Java讲义光盘代码

    通过光盘代码,读者可以学习ArrayList、LinkedList、HashSet、HashMap等常用类的使用方法。 5. **IO流与NIO**: 李刚的书详细讨论了Java的输入输出流和新IO(NIO)系统。光盘代码中包含的文件读写、网络通信等案例...

    java相关常用的的帮助文档

    4. **NIO(New IO)**:NIO是Java 1.4引入的新特性,它提供了非阻塞的I/O操作,提高了并发性能。通道(Channels)和缓冲区(Buffers)是其核心概念。 5. **多线程**:Java内置了对多线程的支持,通过Thread类或...

    达内sd1101Java代码

    6. **IO与NIO**:对比介绍传统的IO模型和非阻塞I/O模型,以及如何在Java中使用NIO进行高性能的I/O操作。 7. **多线程**:涵盖线程的创建、同步机制(如synchronized关键字、Lock接口)、线程池的使用等。 8. **...

    java 高级 课件 练习题

    传统的IO模型基于阻塞IO,而NIO引入了非阻塞和选择器的概念,提高了处理大量并发连接的能力,常用于网络服务器编程。同时,文件操作、流的使用、序列化和反序列化等都是Java IO中的关键知识点。 另外,Java反射API...

    JAVA高级知识点整理.rar

    本资料"JAVA高级知识点整理.rar"主要涵盖了多线程、虚拟机、Java IO/NIO以及Java集合框架等核心主题,旨在帮助开发者深入理解Java平台的高级特性和最佳实践。 首先,多线程是Java编程中的重要组成部分,它允许程序...

    张孝祥Java高新技术_源代码

    6. **IO/NIO**:Java的IO流模型支持顺序读写,而NIO(New Input/Output)引入了非阻塞I/O,提高了性能,尤其在处理大量连接和大数据传输时。NIO还引入了选择器(Selectors)和通道(Channels)的概念,简化了并发I/O...

    java面试优秀代码

    6. **IO流**:掌握字节流和字符流的区别,缓冲流的作用,以及NIO(New IO)的特性,这些都是面试中的常见知识点。 7. **网络编程**:Socket编程、HTTP协议的理解,以及TCP和UDP的区别,这些都是Java网络编程的基础...

    Java面试代码与编程题

    了解NIO(New IO)和NIO.2的区别和使用。 8. **反射**:理解Java反射机制,能够动态创建对象、调用方法、访问私有成员,以及Class类和反射API的使用。 9. **设计模式**:了解常用的设计模式,如单例、工厂、装饰器...

    jdk1.7源代码

    InputStream、OutputStream、Reader、Writer等类,以及NIO(New IO)的引入,提供了处理输入输出的强大工具。理解这些类的源码,可以让我们更好地控制数据传输,提高程序的效率。 6. 异常处理:Java的异常处理机制...

    java常用技术整理.rar

    6. **IO流**:输入输出流系统是Java处理数据交换的关键,包括字节流、字符流、对象流、缓冲流、转换流等,以及NIO(New IO)和NIO2(Java 7的通道和选择器)。 7. **反射API**:允许在运行时检查类、接口、字段和...

    Java深度历险

    - 介绍传统的Java IO流体系,以及后来引入的非阻塞IO(NIO)和新NIO.2 API,包括通道、选择器和缓冲区的使用。 10. **Java模块系统(Jigsaw)** - 讲解Java 9引入的模块系统,如何通过模块化提高代码的组织和隔离...

    java程序代码

    - HashMap和HashSet是基于哈希表的常用数据结构,提供快速的查找性能。 6. **IO流** - Java的IO流系统支持对文件、网络和内存的数据读写,包括字节流和字符流。 - NIO(非阻塞I/O)提供了一种更高效的I/O模型,...

    java私塾面试题----JAVA代码与编程3

    7. **IO流**:了解输入输出流的基本分类(字节流和字符流)、缓冲流、转换流、对象序列化,以及NIO(New IO)和NIO.2(Java 7引入的Channels和Selectors)的区别和应用场景。 8. **反射**:反射机制允许在运行时...

    Java面试题以及答案.zip

    7. **IO/NIO**:Java的IO流分为字节流和字符流,理解流的层次结构和转换,以及BufferedReader、FileWriter等常用类的使用。NIO(New IO)引入了通道、缓冲区的概念,提供非阻塞I/O操作。面试中可能需要你编写读写...

    J面试-AVA核心知识点整理.pdf

    以上总结涵盖了JVM的核心知识点,包括但不限于JVM内存区域、垃圾回收机制、垃圾收集器、IO/NIO以及JVM类加载机制等方面。对于Java开发者来说,掌握这些基础知识对于深入理解和优化Java应用程序具有重要意义。

    《java性能优化》源码

    9. **IO与NIO**:Java的IO和NIO模型对于处理输入输出操作有着不同的性能特点。NIO的非阻塞特性在高并发I/O场景下具有优势。 10. **JDK新特性**:Java不断推出新版本,每次更新都引入了一些优化特性,如Java 7的try-...

    java-cookbook-problems-solutions-developers-4th.rar

    6. **IO与NIO**:讨论了传统的Java I/O流以及现代的非阻塞I/O(New IO,NIO),包括文件操作、网络通信和数据传输。 7. **Lambda表达式与函数式编程**:介绍了Java 8引入的Lambda表达式,以及如何使用Stream API...

Global site tag (gtag.js) - Google Analytics