一.问题,CSVWriter生成文件时使用writer.writeRecord();方法保存的文件末尾多一个空行,效果图如下:

目标结果:(去掉末尾空行)

二.关键代码如下(修改前代码):

 /**
* 生成CSV文件
* @param filePath 文件保存路径,例如:D:/temp/test.csv
* @param headerBeans 实体对象集合
* @param detailBeans 实体对象集合
* @param trailerBeans 实体对象集合
* @param <T>
*/
public static <T> void createFile(String filePath, List<T> headerBeans, List<T> detailBeans, List<T> trailerBeans) {
CsvWriter writer = null;
try {
// 创建文件对象
File file = createFile(filePath);
// 生成文件
writer = new CsvWriter(filePath, ',', Charset.forName("GBK"));
// 获取内容
List<String[]> contents = new ArrayList<>();
List<String[]> headerContents = getStringArrayFromBean(headerBeans);
List<String[]> detailContents = getStringArrayFromBean(detailBeans);
List<String[]> trailerContents = getStringArrayFromBean(trailerBeans);
contents.addAll(headerContents);
contents.addAll(detailContents);
contents.addAll(trailerContents);
// 写入内容
for (String[] each : contents) {
writer.writeRecord(each);
}
} catch (Exception e) {
LOGGER.error("生成CSV文件失败", e);
} finally {
if (writer != null) {
writer.close();
}
}
}

输出文件就在第26行,writer.writeRecord(each);点进去跳到import com.csvreader.CsvWriter;这个包中,如下截图(序号为程序执行调用顺序):

可以看到执行到endRecord()方法时,总是会执行else中的内容,因为useCustomRecordDeliniter定义的为false...(就是这导致了末尾多一空行)

三.解决问题:

.class文件又不能改, 在这里是换了一种写法 ( 由原来的CSVWriter的writeRecord() 改为用PrintWriter的pw.write() )

 /**
* 生成CSV文件
* @param filePath 文件保存路径,例如:D:/temp/test.csv
* @param headerBeans 实体对象集合
* @param detailBeans 实体对象集合
* @param trailerBeans 实体对象集合
* @param <T>
*/
public static <T> void createFile(String filePath, List<T> headerBeans, List<T> detailBeans, List<T> trailerBeans) {
CsvWriter writer = null;
try {
// 创建文件对象
File file = createFile(filePath);
// 生成文件
writer = new CsvWriter(filePath, ',', Charset.forName("GBK"));
// 获取内容
List<String[]> contents = new ArrayList<>();
List<String[]> headerContents = getStringArrayFromBean(headerBeans);
List<String[]> detailContents = getStringArrayFromBean(detailBeans);
List<String[]> trailerContents = getStringArrayFromBean(trailerBeans);
contents.addAll(headerContents);
contents.addAll(detailContents);
contents.addAll(trailerContents);
// 重组内容
String result = "";
for (String[] each : contents) {
for (String s : each){
writer.writeRecord(each);
result += s ;
result += ",";
}
result = result.substring(0,result.length()-1);
result += "\r\n";
}
result = result.substring(0,result.length()-2); writeFileContent(filePath,result);//写入
} catch (Exception e) {
LOGGER.error("生成CSV文件失败", e);
} finally {
if (writer != null) {
writer.close();
}
}
}

调用的writeFileContent()方法如下:

/**
* 向文件中写入内容
*
* @param filepath 文件路径与名称
* @param newstr 写入的内容
* @return
* @throws IOException
*/
public static boolean writeFileContent(String filepath, String newstr) throws IOException {
Boolean bool = false;
String temp = "";
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
FileOutputStream fos = null;
PrintWriter pw = null;
try {
/* File file = new File(filepath);*///文件路径(包括文件名称)
//将文件读入输入流
fis = new FileInputStream(filepath);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr); // StringBuffer buffer = new StringBuffer();
// //文件原有内容
// for (int i = 0; (temp = br.readLine()) != null; i++) {
// buffer.append(temp);
// // 行与行之间的分隔符 相当于“\n”
// buffer = buffer.append(System.getProperty("line.separator"));
// }
// buffer.append(newstr); fos = new FileOutputStream(filepath);
pw = new PrintWriter(fos);
pw.write(newstr.toCharArray());
pw.flush();
bool = true;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
throw e;
} finally {
//不要忘记关闭
if (pw != null) {
pw.close();
}
if (fos != null) {
fos.close();
}
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (fis != null) {
fis.close();
}
}
return bool;
}

贴上完整的新utils留个备份:

 package com.sp.ppms.console.finance.CSV;

 import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.util.ReflectionUtils;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter; /**
* CSV工具类
*/
public class CSVUtil {
/**
* 日志对象
**/
private static final Logger LOGGER = Logger.getLogger(CSVUtil.class); /**
* 生成CSV文件
* @param filePath 文件保存路径,例如:D:/temp/test.csv
* @param headerBeans 实体对象集合
* @param detailBeans 实体对象集合
* @param trailerBeans 实体对象集合
* @param <T>
*/
public static <T> void createFile(String filePath, List<T> headerBeans, List<T> detailBeans, List<T> trailerBeans) {
CsvWriter writer = null;
try {
// 创建文件对象
File file = createFile(filePath);
// 生成文件
writer = new CsvWriter(filePath, ',', Charset.forName("GBK"));
// 获取内容
List<String[]> contents = new ArrayList<>();
List<String[]> headerContents = getStringArrayFromBean(headerBeans);
List<String[]> detailContents = getStringArrayFromBean(detailBeans);
List<String[]> trailerContents = getStringArrayFromBean(trailerBeans);
contents.addAll(headerContents);
contents.addAll(detailContents);
contents.addAll(trailerContents);
// 重组内容
String result = "";
for (String[] each : contents) {
for (String s : each){
result += s ;
result += ",";
}
result = result.substring(0,result.length()-1);
result += "\r\n";
}
result = result.substring(0,result.length()-2); writeFileContent(filePath,result);//写入
} catch (Exception e) {
LOGGER.error("生成CSV文件失败", e);
} finally {
if (writer != null) {
writer.close();
}
}
} /**
* 向文件中写入内容
*
* @param filepath 文件路径与名称
* @param newstr 写入的内容
* @return
* @throws IOException
*/
public static boolean writeFileContent(String filepath, String newstr) throws IOException {
Boolean bool = false;
String temp = "";
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
FileOutputStream fos = null;
PrintWriter pw = null;
try {
/* File file = new File(filepath);*///文件路径(包括文件名称)
//将文件读入输入流
fis = new FileInputStream(filepath);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr); // StringBuffer buffer = new StringBuffer();
// //文件原有内容
// for (int i = 0; (temp = br.readLine()) != null; i++) {
// buffer.append(temp);
// // 行与行之间的分隔符 相当于“\n”
// buffer = buffer.append(System.getProperty("line.separator"));
// }
// buffer.append(newstr); fos = new FileOutputStream(filepath);
pw = new PrintWriter(fos);
pw.write(newstr.toCharArray());
pw.flush();
bool = true;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
throw e;
} finally {
//不要忘记关闭
if (pw != null) {
pw.close();
}
if (fos != null) {
fos.close();
}
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (fis != null) {
fis.close();
}
}
return bool;
} /**
* 读取CSV文件内容
*
* @param filePath 文件存放的路径,如:D:/csv/xxx.csv
* @param bean 类类型
* @return List<T>
*/
public static <T> List<T> readFile(String filePath, Class<T> bean) {
List<String[]> dataList = new ArrayList<String[]>();
CsvReader reader = null;
try {
// 创建CSV读对象 例如:CsvReader(文件路径,分隔符,编码格式);
reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
if (reader != null) {
// 跳过表头,如果需要表头的话,这句可以忽略
//reader.readHeaders();
// 逐行读入除表头的数据
while (reader.readRecord()) {
dataList.add(reader.getValues());
}
if (!dataList.isEmpty()) {
// 数组转对象
return getBeanFromStringArray(dataList, bean);
}
}
} catch (Exception e) {
LOGGER.error("读取CSV文件失败", e);
} finally {
if (reader != null) {
reader.close();
}
}
return Collections.emptyList();
} /**
* 删除该目录下所有文件
*
* @param filePath 文件目录路径,如:d:/test
*/
public static boolean deleteFiles(String filePath) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isFile() && f.delete()) {
LOGGER.info("删除" + f.getName() + "文件成功");
}
}
return true;
}
}
return false;
} /**
* 删除单个文件
*
* @param filePath 文件目录路径,如:d:/test
* @param fileName 文件名称,如:110.csv
*/
public static boolean deleteFile(String filePath, String fileName) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isFile() && f.getName().equals(fileName)) {
return f.delete();
}
}
}
}
return false;
} /**
* 泛型实体转换为数组
*
* @param beans
* @return List<String[]>
*/
private static <T> List<String[]> getStringArrayFromBean(List<T> beans) {
List<String[]> result = new ArrayList<String[]>();
Class<? extends Object> cls = beans.get(0).getClass();
Field[] declaredFields = cls.getDeclaredFields();
List<Field> annoFields = new ArrayList<Field>();
// 筛选出标有注解的字段
for (Field field : declaredFields) {
CSVField anno = field.getAnnotation(CSVField.class);
if (anno != null) {
annoFields.add(field);
}
}
// 获取注解的值,即内容标题
String[] title = new String[annoFields.size()];
/*for (int i = 0; i < annoFields.size(); i++) {
title[i] = annoFields.get(i).getAnnotation(CSVField.class).name();
}
result.add(title);*/
try {
// 获取内容
for (T t : beans) {
String[] item = new String[annoFields.size()];
int index = 0;
for (Field field : annoFields) {
String fieldName = field.getName();
String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method method = ReflectionUtils.findMethod(t.getClass(), methodName);
if (method != null) {
Object value = ReflectionUtils.invokeMethod(method, t);
if (value == null) {
item[index] = "";
} else {
item[index] = value.toString();
}
}
index++;
}
result.add(item);
}
} catch (Exception e) {
LOGGER.info("实体对象转数组失败", e);
}
return result;
} /**
* 数组转为对象集合
*
* @param dataList
* @param bean
* @return List<T>
*/
private static <T> List<T> getBeanFromStringArray(List<String[]> dataList, Class<T> bean) {
List<T> list = new ArrayList<>();
List<Map<String, String>> titles = getTitles(dataList);
Map<String, Field> fields = getFields(bean);
try {
for (Map<String, String> map : titles) {
T t = bean.newInstance();
for (Entry<String, String> entry : map.entrySet()) {
if (fields.containsKey(entry.getKey())) {
Field field = fields.get(entry.getKey());
Class<?> valType = field.getType();
String fieldName = field.getName();
String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method method = ReflectionUtils.findMethod(bean, methodName, valType);
if (method != null) {
ReflectionUtils.invokeMethod(method, t, entry.getValue());
}
}
}
list.add(t);
}
} catch (Exception e) {
LOGGER.error("创建实体失败", e);
}
return list;
} /**
* 数组标题与值的对应关系
*
* @param dataList
* @return
*/
private static <T> List<Map<String, String>> getTitles(List<String[]> dataList) {
List<Map<String, String>> list = new ArrayList<>();
String[] titles = dataList.get(0);
dataList.remove(0);
for (String[] values : dataList) {
Map<String, String> titleMap = new HashMap<>();
for (int i = 0; i < values.length; i++) {
titleMap.put(titles[i], values[i]);
}
list.add(titleMap);
}
return list;
} /**
* 注解名称与字段属性的对应关系
*
* @param clazz 实体对象类类型
* @param <T> 泛型类型
* @return Map<String , Field>
*/
private static <T> Map<String, Field> getFields(Class<T> clazz) {
Map<String, Field> annoMap = new HashMap<>();
Field[] fileds = clazz.getDeclaredFields();
for (Field filed : fileds) {
CSVField anno = filed.getAnnotation(CSVField.class);
if (anno != null) {
// 获取name属性值
if (StringUtils.isNotBlank(anno.name())) {
annoMap.put(anno.name(), filed);
}
}
}
return annoMap;
} /**
* 创建文件对象
*
* @param filePath 文件路径,例如:temp/test.csv
* @return File
*/
private static File createFile(String filePath) {
File file = null;
try {
// 创建文件目录
file = new File(filePath.substring(0, filePath.lastIndexOf('/')));
if (!file.exists()) {
file.mkdirs();
}
// 创建文件对象
file = new File(filePath);
if (!file.exists() && file.createNewFile()) {
LOGGER.info("创建文件对象成功");
}
} catch (IOException e) {
LOGGER.error("创建文件对象失败", e);
}
return file; }
}

废弃utils:

 package com.sp.ppms.console.finance.CSV;

 import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.util.ReflectionUtils;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter; /**
* CSV工具类
*/
public class CSVUtil {
/**
* 日志对象
**/
private static final Logger LOGGER = Logger.getLogger(CSVUtil.class); /**
* 生成CSV文件
* @param filePath 文件保存路径,例如:D:/temp/test.csv
* @param headerBeans 实体对象集合
* @param detailBeans 实体对象集合
* @param trailerBeans 实体对象集合
* @param <T>
*/
public static <T> void createFile(String filePath, List<T> headerBeans, List<T> detailBeans, List<T> trailerBeans) {
CsvWriter writer = null;
try {
// 创建文件对象
File file = createFile(filePath);
// 生成文件
writer = new CsvWriter(filePath, ',', Charset.forName("GBK"));
// 获取内容
List<String[]> contents = new ArrayList<>();
List<String[]> headerContents = getStringArrayFromBean(headerBeans);
List<String[]> detailContents = getStringArrayFromBean(detailBeans);
List<String[]> trailerContents = getStringArrayFromBean(trailerBeans);
contents.addAll(headerContents);
contents.addAll(detailContents);
contents.addAll(trailerContents);
// 写入内容
for (String[] each : contents) {
writer.writeRecord(each);
}
} catch (Exception e) {
LOGGER.error("生成CSV文件失败", e);
} finally {
if (writer != null) {
writer.close();
}
}
} /**
* 读取CSV文件内容
*
* @param filePath 文件存放的路径,如:D:/csv/xxx.csv
* @param bean 类类型
* @return List<T>
*/
public static <T> List<T> readFile(String filePath, Class<T> bean) {
List<String[]> dataList = new ArrayList<String[]>();
CsvReader reader = null;
try {
// 创建CSV读对象 例如:CsvReader(文件路径,分隔符,编码格式);
reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
if (reader != null) {
// 跳过表头,如果需要表头的话,这句可以忽略
//reader.readHeaders();
// 逐行读入除表头的数据
while (reader.readRecord()) {
dataList.add(reader.getValues());
}
if (!dataList.isEmpty()) {
// 数组转对象
return getBeanFromStringArray(dataList, bean);
}
}
} catch (Exception e) {
LOGGER.error("读取CSV文件失败", e);
} finally {
if (reader != null) {
reader.close();
}
}
return Collections.emptyList();
} /**
* 删除该目录下所有文件
*
* @param filePath 文件目录路径,如:d:/test
*/
public static boolean deleteFiles(String filePath) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isFile() && f.delete()) {
LOGGER.info("删除" + f.getName() + "文件成功");
}
}
return true;
}
}
return false;
} /**
* 删除单个文件
*
* @param filePath 文件目录路径,如:d:/test
* @param fileName 文件名称,如:110.csv
*/
public static boolean deleteFile(String filePath, String fileName) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isFile() && f.getName().equals(fileName)) {
return f.delete();
}
}
}
}
return false;
} /**
* 泛型实体转换为数组
*
* @param beans
* @return List<String[]>
*/
private static <T> List<String[]> getStringArrayFromBean(List<T> beans) {
List<String[]> result = new ArrayList<String[]>();
Class<? extends Object> cls = beans.get(0).getClass();
Field[] declaredFields = cls.getDeclaredFields();
List<Field> annoFields = new ArrayList<Field>();
// 筛选出标有注解的字段
for (Field field : declaredFields) {
CSVField anno = field.getAnnotation(CSVField.class);
if (anno != null) {
annoFields.add(field);
}
}
// 获取注解的值,即内容标题
String[] title = new String[annoFields.size()];
/*for (int i = 0; i < annoFields.size(); i++) {
title[i] = annoFields.get(i).getAnnotation(CSVField.class).name();
}
result.add(title);*/
try {
// 获取内容
for (T t : beans) {
String[] item = new String[annoFields.size()];
int index = 0;
for (Field field : annoFields) {
String fieldName = field.getName();
String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method method = ReflectionUtils.findMethod(t.getClass(), methodName);
if (method != null) {
Object value = ReflectionUtils.invokeMethod(method, t);
if (value == null) {
item[index] = "";
} else {
item[index] = value.toString();
}
}
index++;
}
result.add(item);
}
} catch (Exception e) {
LOGGER.info("实体对象转数组失败", e);
}
return result;
} /**
* 数组转为对象集合
*
* @param dataList
* @param bean
* @return List<T>
*/
private static <T> List<T> getBeanFromStringArray(List<String[]> dataList, Class<T> bean) {
List<T> list = new ArrayList<>();
List<Map<String, String>> titles = getTitles(dataList);
Map<String, Field> fields = getFields(bean);
try {
for (Map<String, String> map : titles) {
T t = bean.newInstance();
for (Entry<String, String> entry : map.entrySet()) {
if (fields.containsKey(entry.getKey())) {
Field field = fields.get(entry.getKey());
Class<?> valType = field.getType();
String fieldName = field.getName();
String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method method = ReflectionUtils.findMethod(bean, methodName, valType);
if (method != null) {
ReflectionUtils.invokeMethod(method, t, entry.getValue());
}
}
}
list.add(t);
}
} catch (Exception e) {
LOGGER.error("创建实体失败", e);
}
return list;
} /**
* 数组标题与值的对应关系
*
* @param dataList
* @return
*/
private static <T> List<Map<String, String>> getTitles(List<String[]> dataList) {
List<Map<String, String>> list = new ArrayList<>();
String[] titles = dataList.get(0);
dataList.remove(0);
for (String[] values : dataList) {
Map<String, String> titleMap = new HashMap<>();
for (int i = 0; i < values.length; i++) {
titleMap.put(titles[i], values[i]);
}
list.add(titleMap);
}
return list;
} /**
* 注解名称与字段属性的对应关系
*
* @param clazz 实体对象类类型
* @param <T> 泛型类型
* @return Map<String , Field>
*/
private static <T> Map<String, Field> getFields(Class<T> clazz) {
Map<String, Field> annoMap = new HashMap<>();
Field[] fileds = clazz.getDeclaredFields();
for (Field filed : fileds) {
CSVField anno = filed.getAnnotation(CSVField.class);
if (anno != null) {
// 获取name属性值
if (StringUtils.isNotBlank(anno.name())) {
annoMap.put(anno.name(), filed);
}
}
}
return annoMap;
} /**
* 创建文件对象
*
* @param filePath 文件路径,例如:temp/test.csv
* @return File
*/
private static File createFile(String filePath) {
File file = null;
try {
// 创建文件目录
file = new File(filePath.substring(0, filePath.lastIndexOf('/')));
if (!file.exists()) {
file.mkdirs();
}
// 创建文件对象
file = new File(filePath);
if (!file.exists() && file.createNewFile()) {
LOGGER.info("创建文件对象成功");
}
} catch (IOException e) {
LOGGER.error("创建文件对象失败", e);
}
return file; }
}

另:

  严格讲\n是换行,\r是回车。但不同的系统、不同的应用可能做不同的处理。在文本文件中,换行是两者的组合"\r\n"。

感谢:https://bbs.csdn.net/topics/40116687.

  https://jingyan.baidu.com/article/0aa223754f1fc288cd0d6479.html

拓展:https://blog.csdn.net/pfm685757/article/details/47806469#commentBox

CSVWriter生成文件时writer.writeRecord();方法保存的文件末尾多一个空行的更多相关文章

  1. JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了。

    JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了.因为tomc ...

  2. asp.net上传文件时出现 404 - 找不到文件或目录。

    昨天客户网站反应上传较大文件时出现404-找不到文件或目录的错误.如图: 网站上给出的提示是上传文件不能超过50M,但是在38M和40M这样的文件都不能上传了,显然不对. 在网上查了很久,第一个是检查 ...

  3. python 编辑文件时路径问题解决方法:文件或者目录不存在、文件编辑后无法保存等(以编辑xml文件为例)

    1.获取工程所在根路径:根路径=os.path.dirname(os.path.abspath('__file__')) 2.将获取的根路径和相对路径组合:组合路径=os.path.join(根路径, ...

  4. java项目导出jar文件时指定main方法的类

    需要先运行一下main函数,eclipse的Export-->Runnable JAR File ---> 下的Launch configuration下拉列表才会有记录.如果想要删除下拉 ...

  5. 【Jenkins】通过ANT构建JMeter任务时提示找不到jtl文件时的解决方法

  6. python写文件时,使用代码强制刷新文件

    一.实验环境 1.Windows10x64 2.anaconda4.6.9 + python3.7.1(anaconda集成,不需单独安装) 3.pyinstaller3.5 二.任务需求 三.问题描 ...

  7. 屏蔽打开文件时提示“您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文 件?”

    修改注册表解决 1.打开注册表编辑器 方法:开始 -> 运行 -> 输入regedit -> 确定 2.找到注册表子项 HKEY_CURRENT_USER\Software\Micr ...

  8. html5 拖拽上传文件时,屏蔽浏览器默认打开文件

    参考: https://www.cnblogs.com/kingsm/p/9849339.html

  9. shell小技巧(2)查找文件时,排除几种类型文件

    代码: find -type f ! -name "*.jpg" ! -name "*.png" ! -name "*.jpeg" ! -n ...

随机推荐

  1. 使用MDS Switch基本命令的一个例子

    笔者有幸摆弄一套vBlock的环境, 刚刚接手, 对其上的很多配置都不了解. 下面我们就例举一下我们通过运行哪些命令来搞清楚我们的UCS是如何连接到VNX storage array上的. 首先, 通 ...

  2. CSS- 横向和纵向时间轴

    时间轴在展示公司发展信息,服务流程中用的比较多,常见的注册登录有的是通过引导,一步一步的来完成,上面会通过时间轴告诉用户当前在哪一步,公司在关于我们或者发展流程的时候也特别喜欢用时间轴来展示,简单的实 ...

  3. python 字符串操作常用函数总结

    说明:并不完善,只是记录自己使用到的,没使用到或会用的不会出现在本文. 1.字符串截取 (1)基于索引 s = 'ilovepython' s[0]='i' s[-1] = 'n' (2)取其中一段 ...

  4. 转:在centos7上安装memcache

    转:https://www.liquidweb.com/kb/how-to-install-memcached-on-centos-7/ http://devdocs.magento.com/guid ...

  5. Mongoose JS findOne always returns null

      [问题] I've been fighting with trying to get Mongoose to return data from my local MongoDB instance; ...

  6. BitNami

    BitNami 提供wordpress.joomla.drupal.bbpress等开源程序的傻瓜式安装包下载,所有的安装包内置了服务器环境,就是说,不需要在本地 电脑上另外搭建服务器,就可以一次性傻 ...

  7. 扩展一个boot的插件—tooltip&做一个基于boot的表达验证

    在线演示 本地下载 (代码太多请查看原文) 加班,加班加班,我爱加班··· 我已经疯了,哦也. 这次发一个刚接触boot的时候用boot做的表单验证,我们扩展一下tooltip的插件,让他可以换颜色. ...

  8. oracle 对表赋权限

    grant select,insert,delete,update on yizhen123.tpp_t_dz_yinglian to wangyd;

  9. Python脚本生成sitemap

    项目须要用脚本生成sitemap,中间学习了一下sitemap的格式和lxml库的使用方法.把结果记录一下,方便以后须要直接拿来用. 来自Python脚本生成sitemap 安装lxml 首先须要pi ...

  10. ios 开发 ping

    在win 或 mac系统的终端下都有方便的ping命令来检测网络的连通性! 在iOS上可以使用苹果封装好的工具来开发ping连接测试 SimplePing 下载 1. 主要接口 //初始化一个地址 - ...