java输⼊流编码格式_java获取inputstream输⼊流是什么编码
格式
错误笔记:
⼀开始使⽤的⽅法,正常运⾏没多久,出现⼀个情况,GBK⽂件会导致csv⽂件的第⼀⾏第⼀列乱码,百思不得其解,最终发现是因为在源头,早已使⽤byte,inputstream。read读取⼏个字节,所以导致后⾯的乱码。
错误⽰例如下:
⽂件:12345.csv,格式为GBK
主键,密码,创建时间,创建⼈,修改时间,修改⼈,是否删除
中⽂,123456,null,null,null,null,false
错误部分代码:
/**
* CSV⽂件编码
*/
private static final String ENCODE = "UTF-8";
/**
* GBK编码
* */
private static final String ENCODE_GBK = "GBK";
public static List getLines(InputStream fileName) {
List stringList=null;
try {
//判断⽂件格式
byte[] bytes=new byte[3];
if(bytes[0]==-17&&bytes[1]==-69&&bytes[2]==-65){
stringList=getLines(fileName, ENCODE);
}else{
stringList= getLines(fileName, ENCODE_GBK);
}
}catch (Exception e){
<("解析编码格式异常:"+e.getMessage());
}finally {
try {
if (fileName != null) {
fileName.close();
}
}catch (IOException e) {
<("解析编码格式异常Close stream failure :{}", e);
}
}
return stringList;
}
错误源头就在于,byte[] bytes=new byte[3];原本是想这样去判断bytes是什么编码格式,这样就会导致后⾯,丢失字节,造成乱码。后改为如下正确完整代码。
slf4j.Slf4j;
import org.ding.TikaEncodingDetector;
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class CSVFileUtil {
/**
* CSV⽂件编码
*/
private static final String ENCODE = "UTF-8";
/**
* GBK编码
* */
private static final String ENCODE_GBK = "GBK";
/**
* 读取CSV⽂件得到List,默认使⽤UTF-8编码
* @param fileName ⽂件路径
* @return
* 针对编码格式做处理,谨记关闭流,所以在此处初始化变量list,在获取⾏数⽅法执⾏完毕后,finally关闭流。
* 谨记对于流处理,如在调⽤getLines⽅法前,采⽤byte或者其他⽅法read之后,传参数fileName,其实已经把流读取完毕,为空引起报错。
*/
public static List getLines(InputStream fileName) {
List stringList=null;
ByteArrayOutputStream arraystream=ToolExcelUtils.cloneInputStream(fileName); InputStream inputStream=null;
InputStream stream=new ByteArray()); Charset charset= guessCharset(stream);
try {
if(charset!=null){
if(charset.name().equals(ENCODE)){
inputStream=new ByteArray());
stringList=getLines(inputStream, ENCODE);
}else{java stream
inputStream=new ByteArray());
stringList= getLines(inputStream, ENCODE_GBK);
}
}
}catch (Exception e){
<("解析编码格式异常:"+e.getMessage());
}finally {
try {
if (fileName != null) {
fileName.close();
}
if(inputStream!=null){
inputStream.close();
}
if(stream!=null){
stream.close();
}
}catch (IOException e) {
<("解析编码格式异常Close stream failure :{}", e);
}
}
return stringList;
}
/**
* 读取CSV⽂件得到List
* @param fileName ⽂件路径
* @param encode 编码
* @return
*/
public static List getLines(InputStream fileName, String encode) { List lines = new ArrayList();
BufferedReader br = null;
InputStreamReader isr = null;
try {
isr = new InputStreamReader(fileName, encode);
br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
StringBuilder sb = new StringBuilder();
sb.append(line);
boolean readNext = String(), '"', 0) % 2 == 1;
// 如果双引号是奇数的时候继续读取。考虑有换⾏的是情况
while (readNext) {
line = br.readLine();
if (line == null) {
return null;
}
sb.append(line);
readNext = String(), '"', 0) % 2 == 1;
}
lines.String());
System.out.String());
}
} catch (Exception e) {
<("Read CSV file failure :{}", e);
} finally {
try {
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
} catch (IOException e) {
<("Close stream failure :{}", e);
}
}
return lines;
}
public static String[] fromCSVLine(String source) {
return fromCSVLine(source, 0);
}
/**
* 把CSV⽂件的⼀⾏转换成字符串数组。指定数组长度,不够长度的部分设置为null * @param source
* @param size
* @return
*/
public static String[] fromCSVLine(String source, int size) {
List list = fromCSVLineToArray(source);
if (size < list.size()) {
size = list.size();
}
String[] arr = new String[size];
return arr;
}
public static List fromCSVLineToArray(String source) {
if (source == null || source.length() == 0) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论