java导出csv文件乱码_记一次java生成csv文件乱码的解决过程 (GB2312编码)
系统:win7 (格式:中文(简体,中国))
工具:Eclipse (默认编码utf-8)
服务两个:【restful接口】 和 【服务*** server】。
场景:【服务*** server】多次调用【restful接口】,每次【restful接口】会返回一个生成好的csv文件内容。【服务*** server】将每次【restful接口】返回的csv内容保存成一个csv文件。并将生成的多个csv文件打包成一个zip压缩包。
【restful接口】:根据一组数据生成csv文件
1. java代码生成csv文件,文件输出流编码设置为"UTF-8"时,生成的csv文件打开后,中文乱码。
2. 将文件输出流编码设置为"GB2312",生成的csv文件打开后,中文没有乱码。
java代码如下:
/*** 生成.csv格式文件*/
public static boolean createCsvFile(Listrows, String filePath, String fileName) {//标记文件生成是否成功
boolean flag = true;//文件输出流
BufferedWriter fileOutputStream = null;try{//含文件名的全路径
String fullPath = filePath + File.separator + fileName +Constants.SUFFIX_CSV;
File file= newFile(fullPath);if (!file.getParentFile().exists()) { //如果父目录不存在,创建父目录
file.getParentFile().mkdirs();
}if (file.exists()) { //如果已存在,删除旧文件
file.delete();
}
file= newFile(fullPath);
file.createNewFile();//格式化浮点数据
NumberFormat formatter =NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(10); //设置最大小数位为10//格式化日期数据
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//实例化文件输出流
fileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "GB2312"), 1024);//遍历输出每行
Iterator ite =rows.iterator();while(ite.hasNext()) {
Object[] rowData=(Object[]) ite.next();for (int i = 0; i < rowData.length; i++) {
Object obj= rowData[i]; //当前字段//格式化数据
String field = "";if (null !=obj) {if (obj.getClass() == String.class) { //如果是字符串
field =(String) obj;
}else if (obj.getClass() == Double.class || obj.getClass() == Float.class) { //如果是浮点型
field = formatter.format(obj); //格式化浮点数,使浮点数不以科学计数法输出
} else if (obj.getClass() == Integer.class || obj.getClass() == Long.class
|| obj.getClass() == Short.class || obj.getClass() == Byte.class) { //如果是整形
field +=obj;
}else if (obj.getClass() == Date.class) { //如果是日期类型
field =sdf.format(obj);
}
}else{
field= " "; //null时给一个空格占位
}//拼接所有字段为一行数据
if (i < rowData.length - 1) { //不是最后一个元素
fileOutputStream.write("\"" + field + "\"" + ",");
}else { //是最后一个元素
fileOutputStream.write("\"" + field + "\"");
}
}//创建一个新行
if(ite.hasNext()) {
fileOutputStream.newLine();
}
}
fileOutputStream.flush();
}catch(Exception e) {
flag= false;
log.error("生成数据文件是报错!", e);
e.printStackTrace();
}finally{try{
fileOutputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}returnflag;
}
View Code
【服务*** server】:通过restful接口来获取csv文件内容,并保存成csv文件
1. 【restful接口】通过流读取用"GB2312"编码生成的csv文件,此时数据流的编码是个仍旧是"GB2312".
2. 【服务*** server】通过【restful接口】来获取csv文件内容,因为 服务【服务*** server】的默认编码是"iso-8859-1"。此时接受到的csv内容编码由"GB2312"被强转成了"iso-8859-1". 此时,Eclipse中debug看到的csv内容中文是乱码的。
3. 【服务*** server】侧,重新编码csv内容,使汉字不再乱码。
// content是接收到的csv内容的字符串(String类型)
content = convertEncodingFormat(content, "iso-8859-1", "GB2312");
4. 【服务*** server】如果想在本地将接收到的csv文件保存起来,并且中文可见。还需要设置输出流编码设置为"GB2312"。
/*** 把内容写入文件csv,因为csv使用GB2312编码,需要单独处理*/@SuppressWarnings("resource")public static booleancreateCsvFileWithContent(String parentPath, String fileName, String contentStr) {//标记文件生成是否成功
boolean flag = true;//拼接文件完整路径
String fullPath = parentPath + File.separator +fileName;//文件输出流
BufferedWriter fileOutputStream = null;//生成json格式文件
try{// File file = newFile(fullPath);if (!file.getParentFile().exists()) { //如果父目录不存在,创建父目录
file.getParentFile().mkdirs();
}if (file.exists()) { //如果已存在,删除旧文件
file.delete();
}
file= newFile(fullPath);
file.createNewFile();//实例化文件输出流
fileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "GB2312"), 1024);
fileOutputStream.write(contentStr);
fileOutputStream.flush();
}catch(Exception e) {
flag= false;
log.error("生成数据文件是报错!", e);
e.printStackTrace();
}//返回是否成功的标记
returnflag;
}
View Code
至此结束。
java导出csv文件乱码_记一次java生成csv文件乱码的解决过程 (GB2312编码)相关推荐
- 网页java挂挖矿_记一次服务器被植入挖矿脚本的解决过程
记一次服务器被植入挖矿脚本的解决过程 删除挖矿脚本和对应的进程 找出并删除对应挖矿脚本文件 找出进程pid,并且kill掉 无法kill掉的是原进程的守护进程,原进程不在它也会自动关闭,所以不用管它 ...
- python写入文件中文乱码_记一次python写入txt文件正常,但是写入csv文件中文乱码问题...
今天在将已经爬取完存成txt文件批量导入保存csv格式时,文本中的汉字能够正常正常显示,但是用正常的方法保存到csv中就成了乱码. 最开始的写法:with open(city+'.csv','a+') ...
- Java调用系统解压_记一次Java利用cmd命令调用WinRAR压缩文件-压缩文件
前言 最近在和一个档案管理系统对接,需要把我方系统文件压缩成zip格式,通过ftp的方式upload到指定的服务器上,考虑到Java的平台无关性,一开始便使用Java自带的类库java.util.zi ...
- 【Java编程系列】log4j配置日志按级别分别生成日志文件
热门系列: [Java编程系列]WebService的使用 [Java编程系列]在Spring MVC中使用工具类调用Service层时,Service类为null如何解决 [Java编程系列]Spr ...
- vb.net服务器启动后cpu占用了70_记一次服务器被异常程序占用的解决过程(怀疑黑客攻击)...
最近在跑实验,但是突然发现程序运行变慢,然后top命令查看程序运行情况,发现有异常进程,名字叫 bash,占用 2400% CPU计算资源. 刚开始怀疑是挖矿程序,因实验室网络IP为教育网公网,怀疑被 ...
- java写出文本文档乱码_对象流如何写出到文件以及为什么乱码
在写入对象文件的过程中,采用了txt文件,发现文件乱码,引发了思考. 首先需要理解好IO流是如何处理文件的. 1.ObjectOutputStream 对Java对象进行序列化处理,处理后的数据,不是 ...
- java ios乱码_相同的后台java代码,txt文件解析,安卓解析正常,IOS却是乱码,PC解析也正常.......
中文乱码,之所以出现这种现象,根本原因是解析和编码所按照的字符集不 同,而字符集是什么呢? ``` 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同, ...
- linux 内存溢出排查_记一次JAVA 线上故障排查完整套路
JAVA线上故障排查全套路 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也 ...
- java 文件名乱码_详解关于java文件下载文件名乱码问题解决方案
JAVA文件下载时乱码有两种情况: 1,下载时中文文件名乱码 2,下载时因为路径中包含中文文件名乱码,提示找不到文件 解决方法见下面部分代码 response.setContentType(" ...
最新文章
- SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法(转)
- icon制作无白色背景_科研立项答辩ppt制作公司
- HighNewTech:【2019WAIC世界人工智能大会】上海正式开幕——现场精彩时刻
- 专科 java转go 翱翔之路(三)开发工具:goland2019.1安装一键到2089年试用期
- Web中Servlet
- BZOJ4503 两个串 【fft】
- 智能城市即将爆发,WiFi行业再迎机遇
- python docx table 边框_使用pythondocx指定表中的边框外观
- android viewholder静态,使用内部viewHolder时声明为static的原因
- rust哪家服务器便宜稳定,rust服务器选择
- 联通光猫IPV6配置
- uniapp通过mixin隐藏所有页面右上角分享按钮
- 《通天秘笈》学习笔记
- 快速部署OpenStack的操作笔记(珍藏版)
- 无需下载,优质网站分享
- iOS直播app原理
- java打印2到10000的所有素数(质数),每行显示8个素数
- 【VUE实战问题记录】Vue 父组件调用子组件的使用方法
- 基于复化梯度求积的求积步长自适应matlab实现
- 实时即未来,车联网项目之远程诊断实时故障分析【七】
热门文章
- 动画版雪碧_雪碧动画:老板凯蒂
- 【干货】群发开发信用什么邮箱?
- Windows server 没有网络适配器 找不到无线网卡
- 解锁iPad设备屏幕密码
- ABAP SQL取最大值及聚合函数OUNT, AVG, MAX的简单例子 SAP
- 「前端996」阿里智能事业群-达摩院-机器智能技术部-秋招面试经历(整理)
- 苹果怎么测是原装屏_实心的就是原装屏,空心的就是国产屏?
- 安卓字体样式设置java.lang.NoSuchMethodErrorNo direct method <init>(Landroid/graphics/Typeface;)
- C++知识点 —— 整合
- 51nod1455 宝石猎人