1. 程式人生 > >【Java練習】建立和讀取大檔案

【Java練習】建立和讀取大檔案

一、建立大檔案


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

public class CreateFile {
    //建立1GB的大檔案
    public static void create(File file) throws IOException {
        FileWriter fileWriter = new FileWriter(file);
        BufferedWriter bufferedWriter = new
BufferedWriter(fileWriter); while(file.length()<(1024*1024*1024)){ String temp=createTemp(); bufferedWriter.write(temp); } bufferedWriter.close(); } //建立1KB的字串 public static String createTemp(){ String temp=""; while(temp.length()<1024
) { char random = createRandom(65, 122);//通過Ascii碼來建立隨機字串,比從字串中擷取字串來構建高效 temp += random; } return temp; } //建立min和max範圍內的隨機字元 public static char createRandom(int min,int max){ Random random = new Random(); int i = random.nextInt(max-min+1
)+min; char ch=(char)i; return ch; } public static void main(String[] args) throws IOException { long starttime = System.currentTimeMillis(); File file = new File("D:\\a.txt"); file.createNewFile(); create(file); long endtime = System.currentTimeMillis(); System.out.println("程式執行時間"+(endtime-starttime));//程式執行時間325737 } }

二、讀取大檔案

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadFile {
    public static void read(File file) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] bytes = new byte[1024*1024*1024];
        int length=0;
        while((length=fileInputStream.read(bytes))!=-1){
            System.out.println(new String(bytes,0,length));
        }
        fileInputStream.close();
    }

    public static void main(String[] args) throws IOException {
        long starttime = System.currentTimeMillis();
        File file = new File("D:\\a.txt");
        read(file);
        long endtime = System.currentTimeMillis();
        System.out.println("執行時間為:"+(endtime-starttime));//緩衝陣列為1kb執行時間為:36440;緩衝陣列為1MB執行時間為:22641
        //緩衝陣列為1GB報java.lang.OutOfMemoryError,因為預設的Java虛擬機器最大記憶體僅為64MB
        //緩衝陣列為60MB執行時間為:30180
        //緩衝陣列為30MB執行時間為:27764
    }
}

導致OutOfMemoryError異常的常見原因有以下幾種:

  1. 記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料;
  2. 集合類中有對物件的引用,使用完後未清空,使得JVM不能回收;
  3. 程式碼中存在死迴圈或迴圈產生過多重複的物件實體;
  4. 使用的第三方軟體中的BUG;
  5. 啟動引數記憶體值設定的過小;

此錯誤常見的錯誤提示:

  1. tomcat:java.lang.OutOfMemoryError: PermGen space
  2. tomcat:java.lang.OutOfMemoryError: Java heap space
  3. weblogic:Root cause of ServletException java.lang.OutOfMemoryError
  4. resin:java.lang.OutOfMemoryError
  5. java:java.lang.OutOfMemoryError

解決方法:

  1. 增大jvm記憶體大小
    1)在執行某個class檔案時候,可以使用java -Xmx256M aa.class來設定執行aa.class時jvm所允許佔用的最大記憶體為256M
    2)對tomcat容器,可以在啟動時對jvm設定記憶體限度
    3)對resin容器,同樣可以在啟動時對jvm設定記憶體限度。
  2. 優化程式,釋放垃圾
    主要包括避免死迴圈,應該及時釋放種資源:記憶體, 資料庫的各種連線,防止一次載入太多的資料

對tomcat,可以在catalina.bat中新增:

set CATALINA_OPTS=-Xms128M -Xmx256M
set JAVA_OPTS=-Xms128M -Xmx256M

或者把%CATALINA_OPTS%和%JAVA_OPTS%代替為-Xms128M -Xmx256M

對對resin容器,在bin資料夾下建立一個startup.bat檔案,內容如下:

@echo off
call "httpd.exe"  "-Xms128M" "-Xmx256M"
:end

其中”-Xms128M”為最小記憶體,”-Xmx256M”為最大記憶體

相關推薦

Java練習建立讀取檔案

一、建立大檔案 import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.

Java程式設計寫入、讀取、遍歷Properties檔案

在Java開發中通常我們會儲存配置引數資訊到屬性檔案。這種屬性檔案能夠是擁有鍵值對的屬性檔案,也能夠是XML檔案。關於XML檔案的操作,請參考博文【Java程式設計】DOM XML Parser 解析、遍歷、建立XML。 在該篇博文中,我將展示怎樣向屬性檔案寫入鍵值對。怎樣讀取屬性檔案

java練習SDUT 實驗四之集合框架類

I 2714下沉的船 一艘船很不幸的撞上了暗礁,船長組織大家上救生艇,而且船長決定女人(woman)和小孩(child)先上船,然後其次是男人(man),最後是船長(captain)。給出原來的順序,通過程式設計得到按船長要求排列後的順序。 身份優先順序: woman = child >

java練習SDUT 實驗四之常用類

述: 1.這個實驗涉及到:Date類,String類(str.toCharArray()字串轉陣列;a=a.replace(in1, out1);字串替換),Integer類(Integer.parseInt(t[0])字元轉數字,BigInteger類(=new BigInteger(str1

java練習SDUT 2499 數字(思維+數論)

 Problem Description 定義f(x) = {比x小,不可以被x整除並且不和x互質的數的個數}(x為正整數)。 當f(x) 是奇數的時候我們稱x為“奇真數”。 給出兩個數x,y求區間[x,y]內的“奇真數”的個數。 Input  第一行輸入一個

java練習SDUT 2618 手機鍵盤

Problem Description 大家應該都見過那種九鍵的手機鍵盤,鍵盤上各字母的分佈如下圖所示。 當我們用這種鍵盤輸入字母的時候,對於有些字母,往往會需要按多次鍵才能輸入。 比如:a, b, c 都在“2”鍵上,輸入 a 只需要按一次,而輸入&

Java練習獲取兩個字串中最長的相同欄位

獲取兩個字串中最長的子串並輸出。 思路解析: 1.首先考慮我們要知道長度最短的字串,這樣子在比較的次數會更少。 2.我們首先從長度最小的字串每次擷取一小段判斷是否在大串中 3.考慮到有可能有多個長度相同的子串,那麼我們就應該將他們同時儲存到集合中 4.要多考慮到各種異常的發生。

Java併發Lock Condition

Lock 和 Condition Lock 介面 ReentrantLock ReentrantReadWriteLock Condition 參考 Lock 介面 在Lock接口出現之前,Java程式是靠synchro

Java併發volatile final

volatile 和 final 重排序 資料依賴性 as-if-serial語義 重排序對多執行緒的影響 happens - before 規則 volatile記憶體語義 final記憶體語義 參考

Java基礎intInteger

Java中存在8種基本資料型別:byte(8位)、short(16位)、int(32位)、long(64位)、float(32位)、double(64位)、char(16位,0x0000~0xffff)、boolean(true/false) java中不存在無符號數字型別,

Java基礎equalshashcode

一、equals equals是Object類的其中一個方法,預設的實現方法為 public boolean equals(Object obj) { return (this == obj); } 可以看到,預設方法僅僅是判斷是否為同一

Java程式碼——base64file轉換

File轉成編碼成BASE64 /** * * @param path * @return String * @description 將檔案轉base

Java入門運算子表示式

package com.itheima_01; * * 運算子:就是用於對常量和變數進行操作的符號 * 表示式:用於運算子連結起來的符合Java語法的式子,不同的運算子連線的表示式是不同型別的表示式 * 舉例:a,b * a + b * 運算子分類

Java程式設計寫入、讀取、遍歷配置檔案 Properties類

在Java開發中通常我們會儲存配置引數資訊到屬性檔案,這樣的屬性檔案可以是擁有鍵值對的屬性檔案,也可以是XML檔案,關於XML檔案的操作,請參考博文【Java程式設計】DOM XML Parser 解析、遍歷、建立XML。在該篇博文中,我將展示如何向屬性檔案寫入鍵值對,如

java基礎變數方法的訪問許可權

public protected private 什麼訪問許可權修飾符也沒加稱為友好變數/方法。(有些情況下未加是有預設的) 適用物件和範圍:類 類中的成員方法和成員變數 介面 。不可在區域性變數前加訪問許可權修飾符。 public 的方法和欄位可以被

VBA研究儲存開啟Excel檔案的程式碼

iamlaosong文 經常用到儲存處理之後的Excel檔案,儲存的格式有xls和xlsx兩種,這裡記錄一下儲存程式碼,因為經常用到。不同版本下指定儲存檔案格式的常數略有不同,下面是2010版將已開啟的檔案儲存為xlsx格式的程式碼:        

用NetCDF建立讀取NC檔案

參考網站: 1.https://www.unidata.ucar.edu/ 2.http://crawler.iteye.com/blog/1059995 3.https://www.unidata.ucar.edu/software/netcdf/exampl

Java編譯含package的類檔案編譯

含package的類檔案編譯: package com.zhangxueliang.setdemo; public class Demo1 { public static void main(String[] args) { System.out.println("1234

在C#中建立讀取XML檔案

專案中需要將前臺頁面中的資訊儲存下來並存儲為xml檔案格式到資料庫中去。因此我先在這裡通過一個小例項來學習xml的建立與讀取。 1.建立簡單的XML檔案 為了便於測試,我們首先建立控制檯應用程式,專案命名為CreateXml,Program.cs程式碼如下: u

JAVA之NIO按行讀取檔案

        做專案過程中遇到要解析100多M的TXT檔案,併入庫。用之前的FileInputStream、BufferedReader顯然不行了,雖然readLine這方法可以直接按行讀取,但是去讀一個140M左右,68W條資料的檔案時,不但耗時長而且會記憶體溢位,即你