最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java文件讀寫IO/NIO及性能比較詳細代碼及總結(jié)

 更新時間:2017年12月23日 15:01:22   作者:Java我人生  
這篇文章主要介紹了Java文件讀寫IO/NIO及性能比較詳細代碼及總結(jié),具有一定借鑒價值,需要的朋友可以參考下。

干Java這么久,一直在做WEB相關(guān)的項目,一些基礎(chǔ)類差不多都已經(jīng)忘記。經(jīng)常想得撿起,但總是因為一些原因,不能如愿。

其實不是沒有時間,只是有些時候疲于總結(jié),今得空,下定決心將丟掉的都給撿起來。

文件讀寫是一個在項目中經(jīng)常遇到的工作,有些時候是因為維護,有些時候是新功能開發(fā)。我們的任務(wù)總是很重,工作節(jié)奏很快,快到我們不能停下腳步去總結(jié)。

文件讀寫有以下幾種常用的方法

1、字節(jié)讀寫(InputStream/OutputStream)

2、字符讀?。‵ileReader/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;
/** 
 * <b>文件讀取類</b><br /> 
 * 1、按字節(jié)讀取文件內(nèi)容<br /> 
 * 2、按字符讀取文件內(nèi)容<br /> 
 * 3、按行讀取文件內(nèi)容<br /> 
 * @author qin_xijuan 
 * 
 */
public class FileOperate {
	private static final String FILE_PATH = "d:/work/the List of Beautiful Music.txt";
	/** 
   * 以字節(jié)為單位讀取文件內(nèi)容 
   * @param filePath:需要讀取的文件路徑 
   */
	public static void readFileBybyte(String filePath) {
		File file = new File(filePath);
		// InputStream:此抽象類是表示字節(jié)輸入流的所有類的超類。 
		InputStream ins = null ;
		try{
			// FileInputStream:從文件系統(tǒng)中的某個文件中獲得輸入字節(jié)。 
			ins = new FileInputStream(file);
			int temp ;
			// read():從輸入流中讀取數(shù)據(jù)的下一個字節(jié)。 
			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();
				}
			}
		}
	}
	/** 
   * 以字符為單位讀取文件內(nèi)容 
   * @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();
				}
			}
		}
	}
	/** 
   * 以行為單位讀取文件內(nèi)容 
   * @param filePath 
   */
	public static void readFileByLine(String filePath){
		File file = new File(filePath);
		// BufferedReader:從字符輸入流中讀取文本,緩沖各個字符,從而實現(xiàn)字符、數(shù)組和行的高效讀取。 
		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);
	}
}

//-----------------------------------------------------------------分割線-----------------------------------------------------------------------------

再經(jīng)過兩位同行的提點下,我對之前寫的文件做了點修改,并通過讀寫一個1.2M的文本文件來測試各方法的性能。從多次測試結(jié)果來看,行讀寫卻是是Java.nio更有效率。

經(jīng)過修改之后的代碼如下:

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;
/** 
 * <b>文件讀取類</b><br /> 
 * 1、按字節(jié)讀取文件內(nèi)容<br /> 
 * 2、按字符讀取文件內(nèi)容<br /> 
 * 3、按行讀取文件內(nèi)容<br /> 
 * 
 * @author qin_xijuan 
 * 
 */
public class FileOperate {
	private static final String FILE_PATH = "d:/work/jipinwodi.txt";
	/** 
   * 以字節(jié)為單位讀寫文件內(nèi)容 
   * 
   * @param filePath 
   *      :需要讀取的文件路徑 
   */
	public static void readFileBybyte(String filePath) {
		File file = new File(filePath);
		// InputStream:此抽象類是表示字節(jié)輸入流的所有類的超類。 
		InputStream ins = null;
		OutputStream outs = null;
		try {
			// FileInputStream:從文件系統(tǒng)中的某個文件中獲得輸入字節(jié)。 
			ins = new FileInputStream(file);
			outs = new FileOutputStream("d:/work/readFileByByte.txt");
			int temp;
			// read():從輸入流中讀取數(shù)據(jù)的下一個字節(jié)。 
			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();
				}
			}
		}
	}
	/** 
   * 以字符為單位讀寫文件內(nèi)容 
   * 
   * @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();
				}
			}
		}
	}
	/** 
   * 以行為單位讀寫文件內(nèi)容 
   * 
   * @param filePath 
   */
	public static void readFileByLine(String filePath) {
		File file = new File(filePath);
		// BufferedReader:從字符輸入流中讀取文本,緩沖各個字符,從而實現(xiàn)字符、數(shù)組和行的高效讀取。 
		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+"\n");
			}
		}
		catch (Exception e) {
			e.getStackTrace();
		}
		finally {
			if (bufReader != null && bufWriter != null) {
				try {
					bufReader.close();
					bufWriter.close();
				}
				catch (IOException e) {
					e.getStackTrace();
				}
			}
		}
	}
	/** 
   * 使用Java.nio ByteBuffer字節(jié)將一個文件輸出至另一文件 
   * 
   * @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方法重設(shè)緩沖區(qū),使它可以接受讀入的數(shù)據(jù) 
				buffer.clear();
				// 從輸入通道中將數(shù)據(jù)讀到緩沖區(qū) 
				int r = fcIn.read(buffer);
				if (r == -1) {
					break;
				}
				// flip方法讓緩沖區(qū)可以將新讀入的數(shù)據(jù)寫入另一個通道  
				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方法中,調(diào)用各方法之后,有五組數(shù)據(jù),分辨是我5次讀寫文件測試出來的時間(毫秒)。

關(guān)于Java.nio請參考:http://m.fzitv.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);
}

總結(jié)

以上就是本文關(guān)于Java文件讀寫IO/NIO及性能比較詳細代碼及總結(jié)的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Java 判斷數(shù)組是否相等的方法示例

    Java 判斷數(shù)組是否相等的方法示例

    這篇文章主要介紹了Java 判斷數(shù)組是否相等的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Java自動化測試中多數(shù)據(jù)源的切換(實例講解)

    Java自動化測試中多數(shù)據(jù)源的切換(實例講解)

    下面小編就為大家?guī)硪黄狫ava自動化測試中多數(shù)據(jù)源的切換(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 在win10系統(tǒng)下,如何配置Spring Cloud alibaba Seata以及出現(xiàn)問題時怎么解決

    在win10系統(tǒng)下,如何配置Spring Cloud alibaba Seata以及出現(xiàn)問題時怎么解決

    今天教大家如何在win10系統(tǒng)下,配置Spring Cloud alibaba Seata以及出現(xiàn)問題時怎么解決,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 使用hibernate和struts2實現(xiàn)分頁功能的示例

    使用hibernate和struts2實現(xiàn)分頁功能的示例

    本篇文章主要介紹了使用hibernate和struts2實現(xiàn)分頁功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • java實現(xiàn)即時通信的完整步驟分享

    java實現(xiàn)即時通信的完整步驟分享

    這篇文章主要給大家介紹了關(guān)于java實現(xiàn)即時通信的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Scala 操作Redis使用連接池工具類RedisUtil

    Scala 操作Redis使用連接池工具類RedisUtil

    這篇文章主要介紹了Scala 操作Redis使用連接池工具類RedisUtil,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • Maven引入本地Jar包并打包進War包中的方法

    Maven引入本地Jar包并打包進War包中的方法

    本篇文章主要介紹了Maven引入本地Jar包并打包進War包中的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java中JWT的使用的詳細教程

    Java中JWT的使用的詳細教程

    JWT的本質(zhì)就是一個字符串,它是將用戶信息保存到一個Json字符串中,然后進行編碼后得到一個JWT token,并且這個JWT token帶有簽名信息,接收后可以校驗是否被篡改,所以可以用于在各方之間安全地將信息作為Json對象傳輸,本文介紹了Java中JWT的使用,需要的朋友可以參考下
    2023-02-02
  • SpringBoot整合Redis實現(xiàn)訪問量統(tǒng)計的示例代碼

    SpringBoot整合Redis實現(xiàn)訪問量統(tǒng)計的示例代碼

    本文主要介紹了SpringBoot整合Redis實現(xiàn)訪問量統(tǒng)計的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 淺談JackSon的幾種用法

    淺談JackSon的幾種用法

    這篇文章主要介紹了淺談JackSon的幾種用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01

最新評論

夏河县| 延长县| 凌云县| 新乡县| 如东县| 邯郸市| 阿巴嘎旗| 专栏| 天门市| 平武县| 曲水县| 丘北县| 宽甸| 荣昌县| 龙川县| 丰都县| 会昌县| 襄城县| 新乡市| 元阳县| 昌图县| 阿拉善右旗| 页游| 宜兴市| 顺义区| 大田县| 九龙城区| 凯里市| 大姚县| 衢州市| 翼城县| 河西区| 遂川县| 嘉义市| 固阳县| 祁东县| 泰宁县| 吴桥县| 内江市| 邯郸县| 东光县|