读取文件大小:1.45G
第一种,OldIO:
public static void oldIOReadFile() throws IOException{
BufferedReader br = new BufferedReader(new FileReader("G://lily_947.txt"));
PrintWriter pw = new PrintWriter("G://oldIO.tmp");
char[] c = new char[100*1024*1024];
for(;;){
if(br.read(c)!=-1){
pw.print(c);
}else{
break;
}
}
pw.close();
br.close();
}
耗时70.79s
第二种,newIO:
public static void newIOReadFile() throws IOException{
FileChannel read = new RandomAccessFile("G://lily_947.txt","r").getChannel();
FileChannel writer = new RandomAccessFile("G://newIO.tmp","rw").getChannel();
ByteBuffer bb = ByteBuffer.allocate(200*1024*1024);
while(read.read(bb)!=-1){
bb.flip();
writer.write(bb);
bb.clear();
}
read.close();
writer.close();
}
耗时47.24s
第三种,RandomAccessFile:
public static void randomReadFile() throws IOException{
RandomAccessFile read = new RandomAccessFile("G://lily_947.txt","r");
RandomAccessFile writer = new RandomAccessFile("G://random.tmp","rw");
byte[] b = new byte[200*1024*1024];
while(read.read(b)!=-1){
writer.write(b);
}
writer.close();
read.close();
}
耗时46.65
第四种,MappedByteBuffer:
public static void mappedBuffer() throws IOException{
FileChannel read = new FileInputStream("G://lily_947.txt").getChannel();
FileChannel writer = new RandomAccessFile("G://buffer.tmp","rw").getChannel();
long i = 0;
long size = read.size()/30;
ByteBuffer bb,cc = null;
while(i<read.size()&&(read.size()-i)>size){
bb = read.map(FileChannel.MapMode.READ_ONLY, i, size);
cc = writer.map(FileChannel.MapMode.READ_WRITE, i, size);
cc.put(bb);
i+=size;
bb.clear();
cc.clear();
}
bb = read.map(FileChannel.MapMode.READ_ONLY, i, read.size()-i);
cc.put(bb);
bb.clear();
cc.clear();
read.close();
writer.close();
}
耗时:36
前三种读法对应的资源占用图如下:
相对于最后一种内存直接映射方式前面的测试其实无意义,基本秒杀。。。。。
对于很大的文件直接分块映射时内存会不够,这是因为MappedByteBuffer未被释放造成的,sun未提供直接回收MappedByteBuffer区域的方法,这个时候有两种方法解决,第一种比较愚笨的:
System.gc();
System.runFinalization();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
第二种网上找来的,利用反射调用clean方法:
public static void unmap(final MappedByteBuffer buffer) {
if (buffer == null) {
return;
}
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
try {
Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
if (getCleanerMethod != null) {
getCleanerMethod.setAccessible(true);
Object cleaner = getCleanerMethod.invoke(buffer, new Object[0]);
Method cleanMethod = cleaner.getClass().getMethod("clean", new Class[0]);
if (cleanMethod != null) {
cleanMethod.invoke(cleaner, new Object[0]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
});
}
以上两种方法感觉都别扭,还有就是可以自己分割成物理文件再循环调用,这个也不太美观。
速度也会减慢好多。
- 描述: OldIO
- 大小: 36.1 KB
- 描述: NIO
- 大小: 35.1 KB
- 描述: RandomAccessFile
- 大小: 33.4 KB
分享到:
相关推荐
### Java IO流几种经典使用方式 #### 一、输入输出流(Input/Output Stream) 在Java中,`java.io`包提供了处理输入/输出操作的基本类,主要包括`InputStream`和`OutputStream`。 ##### 1. 字节流(Byte Stream) **...
使用 Java 实现对 dbf 文件的简单读写需要使用以下几个类: 1. DBFWriter:用于 dbf 文件的写操作,提供了写入 dbf 文件的方法。 2. JDBField:用于表示 dbf 文件中的字段信息,包括字段名、字段类型、字段长度等。...
- **Java IO**:采用流(Stream)的方式进行数据读写,数据以字节流或字符流的形式进行传输。 - **Java NIO**:采用缓冲区(Buffer)的方式进行数据读写。所有的数据都会先加载到缓冲区中,再通过通道(Channel)进行读写...
7. **NIO(New IO)**:从Java 1.4开始引入,NIO提供了一种非阻塞的I/O模型,适合高并发和大容量数据传输场景。关键组件包括选择器(Selector)、通道(Channel)和缓冲区(Buffer)。 8. **文件系统操作**:Java还提供了...
文件读取操作是 java IO 操作的基础,主要有以下几种方式: 1. 按字节读取文件内容:以字节为单位读取文件内容,常用于读取二进制文件。 2. 按字符读取文件内容:以字符为单位读取文件内容,常用于读取文本、数字等...
Java IO系统提供了以下几种转换流: - `InputStreamReader`:将字节流转换为字符流。 - `OutputStreamWriter`:将字符流转换为字节流。 #### 6. 过滤器流 过滤器流是在原有流的基础上添加额外功能的流,它可以对...
### Java IO 流详解 #### 一、Java IO 流概念及作用 Java IO(Input/Output)流是Java编程语言中的一个重要组成部分,主要用于...无论是简单的文件读写还是复杂的网络通信,Java IO流都能提供灵活且高效的解决方案。
### 常见几种IO操作 #### 1. 文件IO - **FileInputStream/FileOutputStream**:用于处理文件的字节流读写。 - **FileReader/FileWriter**:用于处理文件的字符流读写。 - **BufferedReader/BufferedWriter**:提供...
Java IO的基本概念之一是流,它是一种数据传输的方式。Java中的流被抽象成一系列连续的数据元素,这些数据元素可以是字节或字符。流分为两种基本类型:输入流和输出流。输入流是从外部源读取数据到程序,而输出流则...
Java提供了多种方式来读取文件内容,主要分为以下几种: - **按字节读取**:适用于读取二进制文件,如图片、音频或视频文件。使用`FileInputStream`类,通过`read()`方法一次读取一个字节,或一次读取多个字节到...
Java中的IO流主要分为输入流和输出流两大类,每类又可以根据数据处理方式的不同细分为多种具体实现。本知识点将深入探讨Java IO流的相关细节,包括节点流与处理流的概念,以及文件流、标准输入输出流、缓冲流、转换...
首先,我们需要理解Java中的几个关键类,如`java.io.File`、`java.io.FileReader`、`java.io.FileWriter`、`java.io.BufferedReader`和`java.io.BufferedWriter`,它们在文件操作中起着核心作用。 `File`类是Java中...
本文将详细介绍几种常见的Java文件读写方式,包括按行读取和写入、随机读取以及按字节读取。 1. **按行读取和写入** 在Java中,我们可以使用`BufferedReader`和`PrintWriter`类来实现按行读取和写入文件。`...
### Java流(文件读写操作) #### 一、流的分类 Java中处理文件和数据时,使用流的概念来进行操作。根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入...
Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...
Java IO(输入/输出)是Java编程语言中的一个重要部分,用于处理各种数据流,包括从文件、网络、设备等读取数据以及向这些地方写入数据。本案例将深入探讨Java IO流的基本概念、主要类库及其在实际编程中的应用。 ...
- **PrintWriter**:`java.io.PrintWriter`提供了一种方便的方式来写入文本,支持自动换行。 ```java File file = new File("path_to_output_file"); PrintWriter writer = new PrintWriter(file); writer....
java基础中的IO流是Java提供的一套用于文件读写操作的流式API,它包括字节流和字符流两种基本类型。字节流主要用在处理二进制数据,而字符流则是处理文本数据。 首先,文档中提到了`File`类,它是IO流操作中用于...