hotspot 虛擬機(咱們平時開發(fā)用的sun公司的虛擬機,其他兩大商用虛擬機是BEA的JRockit和IBM的J9)里面兩個字節(jié)來限制大小,所以最多65536行,超過javac會無法編譯。而且一個Java方法不能超過64k。一般一個Java類不要有太多行數(shù),如果一個Java代碼超過幾千甚至過萬,個人覺得應(yīng)該考慮一些代碼優(yōu)化方式,比如繼承;或者重新構(gòu)思這個類。代碼行數(shù)太多可讀性查,不利于維護。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比烏拉特中網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式烏拉特中網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋烏拉特中地區(qū)。費用合理售后完善,十載實體公司更值得信賴。
Java生成CSV文件簡單操作實例
CSV是逗號分隔文件(Comma Separated Values)的首字母英文縮寫,是一種用來存儲數(shù)據(jù)的純文本格式,通常用于電子表格或數(shù)據(jù)庫軟件。在 CSV文件中,數(shù)據(jù)“欄”以逗號分隔,可允許程序通過讀取文件為數(shù)據(jù)重新創(chuàng)建正確的欄結(jié)構(gòu),并在每次遇到逗號時開始新的一欄。如:
123? ?1,張三,男2,李四,男3,小紅,女? ?
Java生成CSV文件(創(chuàng)建與導(dǎo)出封裝類)
package com.yph.omp.common.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;
/**
* Java生成CSV文件
*/
public class CSVUtil {
/**
* 生成為CVS文件
*
* @param exportData
*? ? ? ? ? ? 源數(shù)據(jù)List
* @param map
*? ? ? ? ? ? csv文件的列表頭map
* @param outPutPath
*? ? ? ? ? ? 文件路徑
* @param fileName
*? ? ? ? ? ? 文件名稱
* @return
*/
@SuppressWarnings("rawtypes")
public static File createCSVFile(List exportData, LinkedHashMap map,
String outPutPath, String fileName) {
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try {
File file = new File(outPutPath);
if (!file.exists()) {
file.mkdir();
}
// 定義文件名格式并創(chuàng)建
csvFile = File.createTempFile(fileName, ".csv",
new File(outPutPath));
// UTF-8使正確讀取分隔符","
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(csvFile), "GBK"), 1024);
// 寫入文件頭部
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
.next();
csvFileOutputStream
.write("\"" + (String) propertyEntry.getValue() != null ? (String) propertyEntry
.getValue() : "" + "\"");
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
csvFileOutputStream.newLine();
// 寫入文件內(nèi)容
for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
Object row = (Object) iterator.next();
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
.next();
/*-------------------------------*/
//以下部分根據(jù)不同業(yè)務(wù)做出相應(yīng)的更改
StringBuilder sbContext = new StringBuilder("");
if (null != BeanUtils.getProperty(row,(String) propertyEntry.getKey())) {
if("證件號碼".equals(propertyEntry.getValue())){
//避免:身份證號碼 ,讀取時變換為科學(xué)記數(shù) - 解決辦法:加 \t(用Excel打開時,證件號碼超過15位后會自動默認科學(xué)記數(shù))
sbContext.append(BeanUtils.getProperty(row,(String) propertyEntry.getKey()) + "\t");
}else{
sbContext.append(BeanUtils.getProperty(row,(String) propertyEntry.getKey()));? ? ? ? ? ? ? ? ? ? ? ? ?
}
}
csvFileOutputStream.write(sbContext.toString());
/*-------------------------------*/? ? ? ? ? ? ? ? ?
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
if (iterator.hasNext()) {
csvFileOutputStream.newLine();
}
}
csvFileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return csvFile;
}
/**
* 下載文件
*
* @param response
* @param csvFilePath
*? ? ? ? ? ? 文件路徑
* @param fileName
*? ? ? ? ? ? 文件名稱
* @throws IOException
*/
public static void exportFile(HttpServletRequest request,
HttpServletResponse response, String csvFilePath, String fileName)
throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/csv;charset=GBK");
response.setHeader("Content-Disposition", "attachment; filename="
+ new String(fileName.getBytes("GB2312"), "ISO8859-1"));
InputStream in = null;
try {
in = new FileInputStream(csvFilePath);
int len = 0;
byte[] buffer = new byte[1024];
OutputStream out = response.getOutputStream();
while ((len = in.read(buffer)) 0) {
out.write(buffer, 0, len);
}
} catch (FileNotFoundException e1) {
System.out.println(e1);
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e1) {
throw new RuntimeException(e1);
}
}
}
}
/**
* 刪除該目錄filePath下的所有文件
*
* @param filePath
*? ? ? ? ? ? 文件目錄路徑
*/
public static void deleteFiles(String filePath) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
for (int i = 0; i files.length; i++) {
if (files[i].isFile()) {
files[i].delete();
}
}
}
}
/**
* 刪除單個文件
*
* @param filePath
*? ? ? ? ? ? 文件目錄路徑
* @param fileName
*? ? ? ? ? ? 文件名稱
*/
public static void deleteFile(String filePath, String fileName) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
for (int i = 0; i files.length; i++) {
if (files[i].isFile()) {
if (files[i].getName().equals(fileName)) {
files[i].delete();
return;
}
}
}
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test
public void createFileTest() {
List exportData = new ArrayListMap();
Map row1 = new LinkedHashMapString, String();
row1.put("1", "11");
row1.put("2", "12");
row1.put("3", "13");
row1.put("4", "14");
exportData.add(row1);
row1 = new LinkedHashMapString, String();
row1.put("1", "21");
row1.put("2", "22");
row1.put("3", "23");
row1.put("4", "24");
exportData.add(row1);
LinkedHashMap map = new LinkedHashMap();
map.put("1", "第一列");
map.put("2", "第二列");
map.put("3", "第三列");
map.put("4", "第四列");
String path = "d:/export";
String fileName = "文件導(dǎo)出";
File file = CSVUtil.createCSVFile(exportData, map, path, fileName);
String fileNameNew = file.getName();
String pathNew = file.getPath();
System.out.println("文件名稱:" + fileNameNew );
System.out.println("文件路徑:" + pathNew );
}
}
//注:BeanUtils.getProperty(row,(String) propertyEntry.getKey()) + "\t" ,只為解決數(shù)字格式超過15位后,在Excel中打開展示科學(xué)記數(shù)問題。
1,java規(guī)范中一般不建議一個java類中超過500行
2,一行的長度不超過200個
3,按照規(guī)定格式將代碼格式化
package?test;
public?class?Complex?{
private?int?realpart;//復(fù)數(shù)的實數(shù)部分
private?int?imaginprt;//復(fù)數(shù)的虛數(shù)部分
//構(gòu)造函數(shù),將復(fù)數(shù)的實部和虛部都置0;
public?Complex(){
realpart=0;
imaginprt=0;
}
//構(gòu)造函數(shù),形參real為實部的初值,imagin為虛部的初值。
public?Complex(int?real,int?imagin){
realpart=real;
imaginprt=imagin;
}
//將當(dāng)前復(fù)數(shù)對象與形參復(fù)數(shù)對象相加
public?void?add(Complex?c){
realpart+=c.getRealpart();
imaginprt+=c.getImaginprt();
}
//把當(dāng)前復(fù)數(shù)對象的實部、虛部組合成a+bi的字符串形式
public?String?toString(){
return?realpart+"+"+imaginprt+"i";
}
//這個為測試函數(shù)
public?static?void?main(String[]?args){
Complex?c=new?Complex(1,2);
Complex?d=new?Complex(2,7);
c.add(c);//此句實現(xiàn)了c對象自身相加
System.out.println(c.toString());//輸出結(jié)果
c.add(d);//此句實現(xiàn)了將d對象與c對象相加
System.out.println(c.toString());//輸出結(jié)果
}
//下面四個函數(shù)為類的屬性的setter方法和getter方法.
public?int?getImaginprt()?{
return?imaginprt;
}
public?void?setImaginprt(int?imaginprt)?{
this.imaginprt?=?imaginprt;
}
public?int?getRealpart()?{
return?realpart;
}
public?void?setRealpart(int?realpart)?{
this.realpart?=?realpart;
}
}