Java读取本地文件的方法大全
下文是笔者编写的读取本地文件的方法大全,如下所示
方式1: 使用InputStreamReader读取本地文件 方式2: 使用NIO读取本地文件 方式3: 使用MappedByteBuffer读取本地文件例
1.java读取按行本地txt文件
public static void readTxt(String filePath) {
try {
File file = new File(filePath);
if(file.isFile() && file.exists()) {
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf-8");
BufferedReader br = new BufferedReader(isr);
String lineTxt = null;
int num =0;
long time1 = System.currentTimeMillis();
while ((lineTxt = br.readLine()) != null) {
System.out.println(lineTxt);
num++;
System.out.println("总共"+num+"条数据!");
}
//System.out.println("总共"+num+"条数据!");
long time2 = System.currentTimeMillis();
long time = time1 - time2;
System.out.println("共花费"+time+"秒");
br.close();
} else {
System.out.println("文件不存在!");
}
} catch (Exception e) {
System.out.println("文件读取错误!");
}
}
public static void main(String[] args) {
String filePath = "/test/java265.txt";
System.out.println(filePath);
readTxt(filePath);
}
2.java的NIO按行读取本地文件
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始) Java NIO提供了与标准IO不同的IO工作方式。 测试发现NIO 读取速度比其他方式快一倍
public static void readTxtByNIO(String filePath) {
long time1 = System.currentTimeMillis();
FileInputStream fis = null;
FileChannel inChannel = null;
int bufSize = 1024*10;
try {
fis = new FileInputStream(filePath);
inChannel = fis.getChannel();
System.out.println("file size --->"+inChannel.size());
ByteBuffer buffer = ByteBuffer.allocate(bufSize);
String enterStr = "\n";
StringBuffer strBuf = new StringBuffer("");
int lineNum = 0;
while(inChannel.read(buffer) != -1){
int rSize = buffer.position();
buffer.clear();
String tempString = new String(buffer.array(), 0, rSize);
if(fis.available() ==0){//最后一行,加入"\n分割符"
tempString+="\n";
}
int fromIndex = 0;
int endIndex = 0;
while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) {
String line = tempString.substring(fromIndex, endIndex);
line = new String(strBuf.toString() + line);
System.out.println(line);
strBuf.delete(0, strBuf.length());
fromIndex = endIndex + 1;
lineNum++;
}
if (rSize > tempString.length()) {
strBuf.append(tempString.substring(fromIndex, tempString.length()));
} else {
strBuf.append(tempString.substring(fromIndex, rSize));
}
System.out.println("lineNum ="+ lineNum);
}
} catch (Exception e) {
System.out.println("文件读取错误!");
} finally {
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inChannel != null){
try{
inChannel.close();
}catch (IOException e){
e.printStackTrace();
}
}
long time2 = System.currentTimeMillis();
long time = (time1-time2)/1000;
System.out.println("共花费"+time+"秒");
}
}
public static void main(String[] args) {
String filePath = "/test/java265.txt";
System.out.println(filePath);
readTxtByBuffer(filePath);
}
3.MappedByteBuffer
package com.java265; import java.io.*; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.util.list; public class importTest2 { public static void main(String[] args) { String filePath = "/test/java265.txt"; String filePath1 = "/test/java265-2.txt"; System.out.println(filePath1); readTxt(filePath); } static int length = 0x8000000; // 128 Mb public static void readTxt(String filePath){ long timeStar = System.currentTimeMillis();// 得到当前的时间 File file = new File(filePath); importTest2 mf = new importTest2(); try { mf.structXML(file); } catch (Exception e) { System.out.println("文件读取错误!"); e.printStackTrace(); } finally { long timeEnd = System.currentTimeMillis(); long time = (timeEnd-timeStar); System.out.println("共花费"+time+"ms"); } } private List structXML(File file) throws IOException{ try { if(file.length()<length){ length = (int)file.length(); } MappedByteBuffer buffer = new RandomAccessFile(file, "r") .getChannel().map(FileChannel.MapMode.READ_ONLY, 0, length); new Thread(new CompareThread(buffer)).start(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } class CompareThread implements Runnable{ private MappedByteBuffer buffer = null; final int BUFFER_SIZE = 0x1000; byte[] dst = new byte[BUFFER_SIZE]; public CompareThread(MappedByteBuffer buffer) { this.buffer = buffer; } public void run(){ long start = System.currentTimeMillis(); String enterStr = "\n"; StringBuffer strBuf = new StringBuffer(""); long total=0; for (int offset = 0; offset < this.buffer.capacity(); offset += BUFFER_SIZE) { if (this.buffer.capacity() - offset >= BUFFER_SIZE) { for (int i = 0; i < BUFFER_SIZE; i++) dst[i] = this.buffer.get(offset + i); } else { for (int i = 0; i < this.buffer.capacity() - offset; i++) dst[i] = this.buffer.get(offset + i); } int length = (this.buffer.capacity() % BUFFER_SIZE == 0) ? BUFFER_SIZE : this.buffer.capacity() % BUFFER_SIZE; String tempString = new String(dst, 0, length); int fromIndex = 0; int endIndex = 0; while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) { total++; String line = tempString.substring(fromIndex, endIndex); line = new String(strBuf.toString() + line); //System.out.println(line); fromIndex = endIndex + 1; strBuf.delete(0, strBuf.length()); } } System.out.println("total----->"+total+"====耗时==="+(System.currentTimeMillis()-start)); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


