Javaファイル読み書きIO/NiO及び性能比較詳細コード及びまとめ

10897 ワード

Javaをやるのはこんなに長くて、ずっとWEB関連のプロジェクトをしていて、いくつかの基礎類の差は多くなくてすべてすでに忘れました.いつも拾うことを考えていますが、いつもいくつかの原因で、望み通りにならない.
実は时间がないのではありませんて、ただ时には総括に疲れて、今暇を得て、决心してなくしたものをすべて拾ってあげます.
ファイルの読み書きはプロジェクトでよく出会う仕事で、メンテナンスのためか、新しい機能開発のためか.私たちの任務はいつも重くて、仕事のリズムが速くて、私たちが足を止めてまとめることができないほど速いです.
ファイルの読み書きには、以下のいくつかの一般的な方法があります.
1、バイト読み書き(InputStream/OutputStream)
2、文字読取(FileReader/FileWriter)
3、行読み出し(BufferedReader/BufferedWriter)
コード(読み込みの例):

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
/** 
 *      
* 1、
* 2、
* 3、
* @author qin_xijuan * */ public class FileOperate { private static final String FILE_PATH = "d:/work/the List of Beautiful Music.txt"; /** * * @param filePath: */ public static void readFileBybyte(String filePath) { File file = new File(filePath); // InputStream: 。 InputStream ins = null ; try{ // FileInputStream: 。 ins = new FileInputStream(file); int temp ; // read(): 。 while((temp = ins.read())!=-1){ System.out.write(temp); } } catch(Exception e){ e.getStackTrace(); } finally{ if (ins != null){ try{ ins.close(); } catch(IOException e){ e.getStackTrace(); } } } } /** * * @param filePath */ public static void readFileByCharacter(String filePath){ File file = new File(filePath); // FileReader: 。 FileReader reader = null; try{ reader = new FileReader(file); int temp ; while((temp = reader.read()) != -1){ if (((char) temp) != '\r') { System.out.print((char) temp); } } } catch(IOException e){ e.getStackTrace(); } finally{ if (reader != null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * * @param filePath */ public static void readFileByLine(String filePath){ File file = new File(filePath); // BufferedReader: , , 、 。 BufferedReader buf = null; try{ // FileReader: 。 buf = new BufferedReader(new FileReader(file)); // buf = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String temp = null ; while ((temp = buf.readLine()) != null ){ System.out.println(temp); } } catch(Exception e){ e.getStackTrace(); } finally{ if(buf != null){ try{ buf.close(); } catch (IOException e) { e.getStackTrace(); } } } } public static void main(String args[]) { readFileBybyte(FILE_PATH); readFileByCharacter(FILE_PATH); readFileByLine(FILE_PATH); } }

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
さらに2人の同業者のポイントで、前に書いたファイルを少し修正し、1.2 Mのテキストファイルを読み書きすることで各方法の性能をテストしました.数回のテスト結果から見ると、行の読み書きはJavaである.Nioの方が効率的です.
修正されたコードは次のとおりです.

package com.waddell.basic;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/** 
 *      
* 1、
* 2、
* 3、
* * @author qin_xijuan * */ public class FileOperate { private static final String FILE_PATH = "d:/work/jipinwodi.txt"; /** * * * @param filePath * : */ public static void readFileBybyte(String filePath) { File file = new File(filePath); // InputStream: 。 InputStream ins = null; OutputStream outs = null; try { // FileInputStream: 。 ins = new FileInputStream(file); outs = new FileOutputStream("d:/work/readFileByByte.txt"); int temp; // read(): 。 while ((temp = ins.read()) != -1) { outs.write(temp); } } catch (Exception e) { e.getStackTrace(); } finally { if (ins != null && outs != null) { try { outs.close(); ins.close(); } catch (IOException e) { e.getStackTrace(); } } } } /** * * * @param filePath */ public static void readFileByCharacter(String filePath) { File file = new File(filePath); // FileReader: 。 FileReader reader = null; FileWriter writer = null; try { reader = new FileReader(file); writer = new FileWriter("d:/work/readFileByCharacter.txt"); int temp; while ((temp = reader.read()) != -1) { writer.write((char)temp); } } catch (IOException e) { e.getStackTrace(); } finally { if (reader != null && writer != null) { try { reader.close(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * * * @param filePath */ public static void readFileByLine(String filePath) { File file = new File(filePath); // BufferedReader: , , 、 。 BufferedReader bufReader = null; BufferedWriter bufWriter = null; try { // FileReader: 。 bufReader = new BufferedReader(new FileReader(file)); bufWriter = new BufferedWriter(new FileWriter("d:/work/readFileByLine.txt")); // buf = new BufferedReader(new InputStreamReader(new // FileInputStream(file))); String temp = null; while ((temp = bufReader.readLine()) != null) { bufWriter.write(temp+"
"); } } catch (Exception e) { e.getStackTrace(); } finally { if (bufReader != null && bufWriter != null) { try { bufReader.close(); bufWriter.close(); } catch (IOException e) { e.getStackTrace(); } } } } /** * Java.nio ByteBuffer * * @param filePath */ public static void readFileByBybeBuffer(String filePath) { FileInputStream in = null; FileOutputStream out = null; try { // in = new FileInputStream(filePath); out = new FileOutputStream("d:/work/readFileByBybeBuffer.txt"); // FileChannel fcIn = in.getChannel(); FileChannel fcOut = out.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while (true) { // clear , buffer.clear(); // int r = fcIn.read(buffer); if (r == -1) { break; } // flip buffer.flip(); fcOut.write(buffer); } } catch (Exception e) { e.printStackTrace(); } finally { if (in != null && out != null) { try { in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static long getTime(){ return System.currentTimeMillis(); } public static void main(String args[]) { long time1 = getTime() ; // readFileByByte(FILE_PATH);// 8734,8281,8000,7781,8047 // readFileByCharacter(FILE_PATH);// 734, 437, 437, 438, 422 // readFileByLine(FILE_PATH);// 110, 94, 94, 110, 93 readFileByBybeBuffer(FILE_PATH); // 125, 78, 62, 78, 62 long time2 = getTime() ; System.out.println(time2-time1); } }

mainメソッドでは,各メソッドを呼び出した後,5組のデータがあり,私が5回ファイルを読み書きしてテストした時間(ミリ秒)であることが分かった.
Javaについてnio参考://www.jb 51.net/article/131338.htm
個人テスト:

public static void main(String args[]) {
	long time1 = getTime() ;
	//     readFileByByte(FILE_PATH);   //2338,2286 
	//     readFileByCharacter(FILE_PATH);//160,162,158 
	//     readFileByLine(FILE_PATH);   //46,51,57 
	//    readFileByBybeBuffer(FILE_PATH);//19,18,17 
	//    readFileByBybeBuffer(FILE_PATH);//2048: 11,13 
	//    readFileByBybeBuffer(FILE_PATH);//1024*100 100k,711k: 6,6 
	//    readFileByBybeBuffer(FILE_PATH);//1024*100 100k,1422k: 7 
	//    readFileByBybeBuffer(FILE_PATH);//1024*100 100k,9951k: 49,48 
	//    readFileByBybeBuffer(FILE_PATH);//1024*1000 1M,711k: 7,7 
	//    readFileByBybeBuffer(FILE_PATH);//1024*1000 1M,1422k: 7,8 
	//    readFileByBybeBuffer(FILE_PATH);//1024*1000 1M,9951k: 48,49 
	//    readFileByBybeBuffer(FILE_PATH);//1024*10000 10M,711k: 21,13,17 
	//    readFileByBybeBuffer(FILE_PATH);//1024*10000 10M,1422k: 16,17,14,15 
	//    readFileByBybeBuffer(FILE_PATH);//1024*10000 10M,9951k:64,60 
	long time2 = getTime() ;
	System.out.println(time2-time1);
}

まとめ
以上、JavaファイルのIO/NiOの読み書きとパフォーマンスの詳細コードとまとめについて、すべての内容を説明しました.興味のある方は引き続き当駅の他の関連テーマを参照することができます.不足点があれば、伝言を歓迎します.友达の本駅に対する支持に感谢します!