如果文件中含有中文字符,那么这时候直接进行读取,即new FileInputStream(要读取的文件),就会出现了乱码,所以这时候,我们需要设置对应的格式进行读取,所以还需要传递对应的编码,所以将代码改成下面那样:new InputStreamReader(new FileInputStream(要读取的文件),"utf-8"),那么就不会再发生乱码了.

同时,如果需要利用java来解析vcf文件,那么需要设置调用相关的方法来进行编码和解码,这个编码和解码的方式网上也有,可以自行百度的,这里主要来说,将对应的信息写入到.vcf文件需要注意的地方:

  • 利用FileWriter对象来写入文件中的时候,需要注意进行刷新,否则,当程序结束的时候,文件可能什么数据都没有
  • 如果写入的数据还有中文数据,那么记得要调用对应的方法来进行编码,否则对应的.vcf文件就是乱码的
  • 写入的数据不需要以分号结束

所以对应的代码为:

package service;import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import entity.Person;public class VCFService {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubVCFService service = new VCFService();File file = new File("src/a.vcf");FileInputStream fis = new FileInputStream(file);List<Person> persons = service.importVCF(fis);File des = new File("src/b.vcf");if(!des.exists()) {des.createNewFile();}service.exportVCF(persons,des);}private void exportVCF(List<Person> persons,File des) throws Exception {/** vcf文件:* 格式为:* 1、以BEGIN:VCARD开始* 2、说明版本:VERSION:3.0* 3、N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE: -->说明名字* 4、FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE -->说明英文名字* 5、TEL;TYPE=CELL: --> 说明电话* 6、EMAIL: -->说明邮箱* 7、END:VCARD*/FileWriter w = new FileWriter(des);for(Person person: persons) {addToVcf(person,w);}w.close();//关闭之前会自动刷新}public void addToVcf(Person person,FileWriter w) throws Exception {//注意不要有分号,否则,导入到手机的形式将会是它的编码形式,不是中文的形式出现//同时不可以直接将person.getName()输入到文件中,否则会出现乱码,需要进行编码w.write("BEGIN:VCARD\r\n");w.write("VERSION:3.0\r\n");w.write("N;CHARSET=UTF-8:" + encode(person.getName()) + "\r\n");w.write("FN;CHARSET=UTF-8:" + encode(person.getName())+ "\r\n");w.write("TEL;TYPE=CELL:" + encode(person.getCell())  + "\r\n");w.write("EMAIL:" + encode(person.getEmail())  + "\r\n");w.write("END:VCARD\r\n");w.flush();}public String decoding(String str) throws UnsupportedEncodingException {if(str == null) {return "";}str = str.trim();str = str.replaceAll("=\n","");byte[] bytes = str.getBytes("US-ASCII");if(bytes == null) {return "";}for(int i = 0; i < bytes.length; ++i) {if(bytes[i] == 95) {bytes[i] = 32;}}ByteArrayOutputStream buffer = new ByteArrayOutputStream();for(int i = 0; i < bytes.length; ++i) {if(bytes[i] == '=') {if(i + 2 >= bytes.length) {break;}int l = Character.digit((char)bytes[++i], 16);int r = Character.digit((char)bytes[++i], 16);if(l == -1 || r == -1) {continue;}buffer.write((char)((l << 4) + r));}else { buffer.write(bytes[i]);}}return new String(buffer.toByteArray(),"UTF-8");}public List<Person> importVCF(FileInputStream file) throws Exception {//导入对应的vcf文件//需要保证这个是utf-8,否则读取文件的时候发生了乱码BufferedReader bfr = new BufferedReader(new InputStreamReader(file,"utf-8"));String line = null;ArrayList<Person> persons = new ArrayList<>();    List<String> names = new ArrayList<>();List<String> cells = new ArrayList<>();List<String> emails = new ArrayList<>();while((line = bfr.readLine()) != null) {System.out.print(line); int index = line.indexOf(":");//获取第一个冒号的下标,冒号后面就是他的值//获取姓名和电话if(line.startsWith("N;CHARSET=UTF-8:")) {//这时候需要获取它的名字,名字有被进行编码过,所以需要解码/*并不是对整个line进行解码,而是对它的值进行解码,因为CHARSET=UTF-8中同样含有‘=’号,如果对整个line进行解码的话,那么就会影响到了CHARSET=UTF-8,从而没有办法获取数据的值了*/line = decoding(line.substring(index + 1));names.add(line);}else if(line.startsWith("TEL;TYPE=CELL:")) {//因为电话,邮箱等不是中文,所以不需要进行解码就可以得到line = line.substring(index + 1);cells.add(line);}else if(line.startsWith("EMAIL:")) {line = line.substring(index + 1);emails.add(line);}}int size = names.size();for(int i = 0; i < size; ++i) {persons.add(new Person(names.get(i),cells.get(i),emails.get(i)));}for(Person person: persons) {System.out.println(person);}return persons;}public String encode(String str) throws Exception {if (str != null) {char[] encode = str.toCharArray();StringBuffer sb = new StringBuffer();for (int i = 0; i < encode.length; i++) {if ((encode[i] >= '!') && (encode[i] <= '~')&& (encode[i] != '=') && (encode[i] != '\n')) {sb.append(encode[i]);} else if (encode[i] == '=') {sb.append("=3D");} else if (encode[i] == '\n') {sb.append("\n");} else {StringBuffer sbother = new StringBuffer();sbother.append(encode[i]);String ss = sbother.toString();byte[] buf = null;buf = ss.getBytes("utf-8");// UTF-8: buf.length == 3// GBK: buf.length == 2if (buf.length == 3) {for (int j = 0; j < buf.length; j++) {String s16 = String.valueOf(Integer.toHexString(buf[j]));char c16_6;char c16_7;if (s16.charAt(6) >= 97 && s16.charAt(6) <= 122) {c16_6 = (char) (s16.charAt(6) - 32);} else {c16_6 = s16.charAt(6);}if (s16.charAt(7) >= 97 && s16.charAt(7) <= 122) {c16_7 = (char) (s16.charAt(7) - 32);} else {c16_7 = s16.charAt(7);}sb.append("=" + c16_6 + c16_7);}}}}str = sb.toString();}return str;}
}

当生成了.vcf文件之后,我们可以将其发送到手机,然后利用电话来打开对应的文件,那么之后就可以发现我们定义的联系人的信息了。

java利用io流读取文件发生了乱码以及java解析vcf文件相关推荐

  1. IO流读取文件用户信息根据年龄排序后,写到文件

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java ...

  2. java字节流读取文件_字节流读取文件 java的几种IO流读取文件方式

    java字节流怎么读取数据 字节流读取数据例子如下: import java.io.File;import java.io.FileInputStream;import java.io.FileNot ...

  3. 利用IO流一次性读取文件中的所有内容,利用IO流下载文件

    利用IO流一次性读取文件中的所有内容 读取文件效率最快的方法就是一次全读进来,使用readline()之类的方法,可能需要反复访问文件,而且每次readline()都会调用编码转换,降低了速度,所以, ...

  4. java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理

    1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...

  5. java IO流读取保存图片文件

    java  IO流读取保存图片文件 package io; import java.io.BufferedInputStream; import java.io.BufferedOutputStrea ...

  6. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  7. Java裁剪音乐,利用IO流

    ** Java裁剪音乐,利用IO流 ** 主方法 public static void main(String[] args) throws IOException {//输入流对象,路径要裁剪文件路 ...

  8. 解决关于java的IO流进行文件拷贝时拒绝访问的问题

    解决关于java的IO流进行文件拷贝时拒绝访问的问题 1.在学习java IO流的时候,想进行文件的自动拷贝功能,我的代码是在idea中编写的,编写没有报红,但是运行时却出现了java.io.File ...

  9. java 文件读取中文乱码_java文件读取时发生中文乱码怎么解决

    java文件读取时发生中文乱码怎么解决 发布时间:2020-06-23 09:33:47 来源:亿速云 阅读:59 作者:Leah java文件读取时发生中文乱码怎么解决?这篇文章运用了实例代码展示, ...

最新文章

  1. python支持中文吗_Python中使用中文
  2. VirtualBox中为WinXP虚拟机添加主体机共享
  3. ubuntu 16.04 更换国内源(下载源)(阿里源)(换源)
  4. python反向缩进_在Pycharm中对代码进行注释和缩进的方法详解
  5. windows 编程 —— 消息与参数(定时器、初始化消息、改变大小)
  6. 二叉树的遍历(递归,非递归,Morris)
  7. 利用Contained Database和DAC来开发基于SQL Server Denali和SQL Azure之上的应用程序
  8. 使用有限状态机(FSM)解释shell 命令
  9. oracle一列有多个约束,在oracle中创建unique唯一约束(单列和多列)
  10. python基础逻辑判断语句(九)
  11. 向上累积频数怎么算_视频号怎么运营?小白也能迅速get的技巧
  12. C#+HtmlAgilityPack+Dapper走一波爬虫
  13. 修改notebook的默认路径_更改jupyter notebook默认存储路径
  14. Oracle安装步骤(自用)
  15. 显示upnp服务器 sonos,Kodi启用UPnP/DLNA及AirPlay 串流投屏设置教程
  16. 转载:ultraiso制作超过4G的系统U盘启动盘教程
  17. typescript元组
  18. Python实现自动给视频打码,减少不宜画面出现...
  19. dataframe 中的多层索引
  20. UML中各图形或图标表示的意思

热门文章

  1. RIQ编号,冲突处理
  2. 项目中沟通管理与干系人管理
  3. 如何理解过拟合=高方差、欠拟合=高偏差
  4. 如何批量注册邮箱?TOM VIP邮箱注册(简单实用)
  5. Embedding理解、Keras实现Embedding
  6. 解决新版本chrome浏览器跨域请求拦截
  7. List取交集、并集、差集
  8. 除了清空购物车,阿里年会的技术也超霸气!
  9. 《咸鱼翻身》centos7下安装docker
  10. 谷粒商城:如何通过笔记复盘实现事半功倍?