【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異常的常見原因有以下幾種:
- 記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料;
- 集合類中有對物件的引用,使用完後未清空,使得JVM不能回收;
- 程式碼中存在死迴圈或迴圈產生過多重複的物件實體;
- 使用的第三方軟體中的BUG;
- 啟動引數記憶體值設定的過小;
此錯誤常見的錯誤提示:
- tomcat:java.lang.OutOfMemoryError: PermGen space
- tomcat:java.lang.OutOfMemoryError: Java heap space
- weblogic:Root cause of ServletException java.lang.OutOfMemoryError
- resin:java.lang.OutOfMemoryError
- java:java.lang.OutOfMemoryError
解決方法:
- 增大jvm記憶體大小
1)在執行某個class檔案時候,可以使用java -Xmx256M aa.class來設定執行aa.class時jvm所允許佔用的最大記憶體為256M
2)對tomcat容器,可以在啟動時對jvm設定記憶體限度
3)對resin容器,同樣可以在啟動時對jvm設定記憶體限度。 - 優化程式,釋放垃圾
主要包括避免死迴圈,應該及時釋放種資源:記憶體, 資料庫的各種連線,防止一次載入太多的資料
對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基礎】int和Integer
Java中存在8種基本資料型別:byte(8位)、short(16位)、int(32位)、long(64位)、float(32位)、double(64位)、char(16位,0x0000~0xffff)、boolean(true/false) java中不存在無符號數字型別,
【Java基礎】equals和hashcode
一、equals equals是Object類的其中一個方法,預設的實現方法為 public boolean equals(Object obj) { return (this == obj); } 可以看到,預設方法僅僅是判斷是否為同一
【Java程式碼】——base64和file轉換
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條資料的檔案時,不但耗時長而且會記憶體溢位,即你