系统: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编码)相关推荐

  1. 网页java挂挖矿_记一次服务器被植入挖矿脚本的解决过程

    记一次服务器被植入挖矿脚本的解决过程 删除挖矿脚本和对应的进程 找出并删除对应挖矿脚本文件 找出进程pid,并且kill掉 无法kill掉的是原进程的守护进程,原进程不在它也会自动关闭,所以不用管它 ...

  2. python写入文件中文乱码_记一次python写入txt文件正常,但是写入csv文件中文乱码问题...

    今天在将已经爬取完存成txt文件批量导入保存csv格式时,文本中的汉字能够正常正常显示,但是用正常的方法保存到csv中就成了乱码. 最开始的写法:with open(city+'.csv','a+') ...

  3. Java调用系统解压_记一次Java利用cmd命令调用WinRAR压缩文件-压缩文件

    前言 最近在和一个档案管理系统对接,需要把我方系统文件压缩成zip格式,通过ftp的方式upload到指定的服务器上,考虑到Java的平台无关性,一开始便使用Java自带的类库java.util.zi ...

  4. 【Java编程系列】log4j配置日志按级别分别生成日志文件

    热门系列: [Java编程系列]WebService的使用 [Java编程系列]在Spring MVC中使用工具类调用Service层时,Service类为null如何解决 [Java编程系列]Spr ...

  5. vb.net服务器启动后cpu占用了70_记一次服务器被异常程序占用的解决过程(怀疑黑客攻击)...

    最近在跑实验,但是突然发现程序运行变慢,然后top命令查看程序运行情况,发现有异常进程,名字叫 bash,占用 2400% CPU计算资源. 刚开始怀疑是挖矿程序,因实验室网络IP为教育网公网,怀疑被 ...

  6. java写出文本文档乱码_对象流如何写出到文件以及为什么乱码

    在写入对象文件的过程中,采用了txt文件,发现文件乱码,引发了思考. 首先需要理解好IO流是如何处理文件的. 1.ObjectOutputStream 对Java对象进行序列化处理,处理后的数据,不是 ...

  7. java ios乱码_相同的后台java代码,txt文件解析,安卓解析正常,IOS却是乱码,PC解析也正常.......

    中文乱码,之所以出现这种现象,根本原因是解析和编码所按照的字符集不 同,而字符集是什么呢? ``` 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同, ...

  8. linux 内存溢出排查_记一次JAVA 线上故障排查完整套路

    JAVA线上故障排查全套路 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也 ...

  9. java 文件名乱码_详解关于java文件下载文件名乱码问题解决方案

    JAVA文件下载时乱码有两种情况: 1,下载时中文文件名乱码 2,下载时因为路径中包含中文文件名乱码,提示找不到文件 解决方法见下面部分代码 response.setContentType(" ...

最新文章

  1. SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法(转)
  2. icon制作无白色背景_科研立项答辩ppt制作公司
  3. HighNewTech:【2019WAIC世界人工智能大会】上海正式开幕——现场精彩时刻
  4. 专科 java转go 翱翔之路(三)开发工具:goland2019.1安装一键到2089年试用期
  5. Web中Servlet
  6. BZOJ4503 两个串 【fft】
  7. 智能城市即将爆发,WiFi行业再迎机遇
  8. python docx table 边框_使用pythondocx指定表中的边框外观
  9. android viewholder静态,使用内部viewHolder时声明为static的原因
  10. rust哪家服务器便宜稳定,rust服务器选择
  11. 联通光猫IPV6配置
  12. uniapp通过mixin隐藏所有页面右上角分享按钮
  13. 《通天秘笈》学习笔记
  14. 快速部署OpenStack的操作笔记(珍藏版)
  15. 无需下载,优质网站分享
  16. iOS直播app原理
  17. java打印2到10000的所有素数(质数),每行显示8个素数
  18. 【VUE实战问题记录】Vue 父组件调用子组件的使用方法
  19. 基于复化梯度求积的求积步长自适应matlab实现
  20. 实时即未来,车联网项目之远程诊断实时故障分析【七】

热门文章

  1. 动画版雪碧_雪碧动画:老板凯蒂
  2. 【干货】群发开发信用什么邮箱?
  3. Windows server 没有网络适配器 找不到无线网卡
  4. 解锁iPad设备屏幕密码
  5. ABAP SQL取最大值及聚合函数OUNT, AVG, MAX的简单例子 SAP
  6. 「前端996」阿里智能事业群-达摩院-机器智能技术部-秋招面试经历(整理)
  7. 苹果怎么测是原装屏_实心的就是原装屏,空心的就是国产屏?
  8. 安卓字体样式设置java.lang.NoSuchMethodErrorNo direct method <init>(Landroid/graphics/Typeface;)
  9. C++知识点 —— 整合
  10. 51nod1455 宝石猎人