关闭流:
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的IO/NIO系统提供了处理输入输出的能力,而NIO2(New IO,也称Asynchronous File Channel)引入了非阻塞I/O和选择器,适用于高性能服务器应用。网络编程也是Java的一大应用场景,Socket编程和HTTP客户端库...
通过光盘代码,读者可以学习ArrayList、LinkedList、HashSet、HashMap等常用类的使用方法。 5. **IO流与NIO**: 李刚的书详细讨论了Java的输入输出流和新IO(NIO)系统。光盘代码中包含的文件读写、网络通信等案例...
4. **NIO(New IO)**:NIO是Java 1.4引入的新特性,它提供了非阻塞的I/O操作,提高了并发性能。通道(Channels)和缓冲区(Buffers)是其核心概念。 5. **多线程**:Java内置了对多线程的支持,通过Thread类或...
6. **IO与NIO**:对比介绍传统的IO模型和非阻塞I/O模型,以及如何在Java中使用NIO进行高性能的I/O操作。 7. **多线程**:涵盖线程的创建、同步机制(如synchronized关键字、Lock接口)、线程池的使用等。 8. **...
传统的IO模型基于阻塞IO,而NIO引入了非阻塞和选择器的概念,提高了处理大量并发连接的能力,常用于网络服务器编程。同时,文件操作、流的使用、序列化和反序列化等都是Java IO中的关键知识点。 另外,Java反射API...
本资料"JAVA高级知识点整理.rar"主要涵盖了多线程、虚拟机、Java IO/NIO以及Java集合框架等核心主题,旨在帮助开发者深入理解Java平台的高级特性和最佳实践。 首先,多线程是Java编程中的重要组成部分,它允许程序...
6. **IO/NIO**:Java的IO流模型支持顺序读写,而NIO(New Input/Output)引入了非阻塞I/O,提高了性能,尤其在处理大量连接和大数据传输时。NIO还引入了选择器(Selectors)和通道(Channels)的概念,简化了并发I/O...
6. **IO流**:掌握字节流和字符流的区别,缓冲流的作用,以及NIO(New IO)的特性,这些都是面试中的常见知识点。 7. **网络编程**:Socket编程、HTTP协议的理解,以及TCP和UDP的区别,这些都是Java网络编程的基础...
了解NIO(New IO)和NIO.2的区别和使用。 8. **反射**:理解Java反射机制,能够动态创建对象、调用方法、访问私有成员,以及Class类和反射API的使用。 9. **设计模式**:了解常用的设计模式,如单例、工厂、装饰器...
InputStream、OutputStream、Reader、Writer等类,以及NIO(New IO)的引入,提供了处理输入输出的强大工具。理解这些类的源码,可以让我们更好地控制数据传输,提高程序的效率。 6. 异常处理:Java的异常处理机制...
6. **IO流**:输入输出流系统是Java处理数据交换的关键,包括字节流、字符流、对象流、缓冲流、转换流等,以及NIO(New IO)和NIO2(Java 7的通道和选择器)。 7. **反射API**:允许在运行时检查类、接口、字段和...
- 介绍传统的Java IO流体系,以及后来引入的非阻塞IO(NIO)和新NIO.2 API,包括通道、选择器和缓冲区的使用。 10. **Java模块系统(Jigsaw)** - 讲解Java 9引入的模块系统,如何通过模块化提高代码的组织和隔离...
- HashMap和HashSet是基于哈希表的常用数据结构,提供快速的查找性能。 6. **IO流** - Java的IO流系统支持对文件、网络和内存的数据读写,包括字节流和字符流。 - NIO(非阻塞I/O)提供了一种更高效的I/O模型,...
7. **IO流**:了解输入输出流的基本分类(字节流和字符流)、缓冲流、转换流、对象序列化,以及NIO(New IO)和NIO.2(Java 7引入的Channels和Selectors)的区别和应用场景。 8. **反射**:反射机制允许在运行时...
7. **IO/NIO**:Java的IO流分为字节流和字符流,理解流的层次结构和转换,以及BufferedReader、FileWriter等常用类的使用。NIO(New IO)引入了通道、缓冲区的概念,提供非阻塞I/O操作。面试中可能需要你编写读写...
以上总结涵盖了JVM的核心知识点,包括但不限于JVM内存区域、垃圾回收机制、垃圾收集器、IO/NIO以及JVM类加载机制等方面。对于Java开发者来说,掌握这些基础知识对于深入理解和优化Java应用程序具有重要意义。
9. **IO与NIO**:Java的IO和NIO模型对于处理输入输出操作有着不同的性能特点。NIO的非阻塞特性在高并发I/O场景下具有优势。 10. **JDK新特性**:Java不断推出新版本,每次更新都引入了一些优化特性,如Java 7的try-...
6. **IO与NIO**:讨论了传统的Java I/O流以及现代的非阻塞I/O(New IO,NIO),包括文件操作、网络通信和数据传输。 7. **Lambda表达式与函数式编程**:介绍了Java 8引入的Lambda表达式,以及如何使用Stream API...