问题
  • 在用Java中读写含中文的文件时,读出或写入的内容经常会出现乱码的问题

原因

  • 系统的编码和程序的编码采用了不同的编码格式
  • windows自身采用的编码格式是gbk. 而gbk和gb2312基本上是一样的编码方式
  • IDEA中Encode默认是utf-8的编码
  • 当在windows中创建并写入的文件编码为gbk. 用程序直接去读会以utf-8方式读取,这样就会乱码
  • 为了避免可能的中文乱码问题,最好在文件写入和读出的时候显式指定编码格式

解决

  • 在Java中,使用java.io.FileReader或者java.io.FileWriter来读写文件
  • 虽然可以通过java.io.BufferedReader和java.io.BufferedWriter来提高效率
  • 但是在FileReader和FileWriter中只能获取编码方式,不能设置编码方式
  • 这样导致在FileReader和FileWriter中的编码设置只能服从底层的编码设置,这样就会在读写多种语言编码的文件时出现乱码

  • 采用java.io.FileInputStream或者java.io.InputStreamReader和java.io.FileOutputStream或者java.io.OutputStreamWriter来解决这个问题
  • InputStreamReader和OutputStreamWriter中,可以通过指定编码方式来完成gbk文件的读写
public class ReadAndWrite {  
private static void test(){
File firstFile = new File("D://fileone.txt");
File secondFile=new File("D://filesecond.txt");
BufferedReader in = null;
BufferedWriter out = null;
try {
//加入编码字符集
in = new BufferedReader(new InputStreamReader(new FileInputStream(firstFile), "gbk"));
//加入编码字符集
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(secondFile), "gbk"));
String line = "";
while((line = in.readLine())!=null){
System.out.println(line);
out.write(line+"\r\n");
}
} catch (FileNotFoundException e) {
System.out.println("file is not fond");
} catch (IOException e) {
System.out.println("Read or write Exceptioned");
}finally{
if(null!=in){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}}
if(null!=out){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

总结

  • BufferedWriter最后一定要关闭,否则内容不会被写入到文件中
  • 使用readLine() 方法时,换行写出要添加 \r\n

python 文本处理 python文本处理匹配关键词

网上翻了很多文章。。。居然没有一个有用的。。倒是找到一篇java的,但java的正则表达式和python的还有点不同。 那篇java的文章是用"[keywd1]|[keywod2]|[keywd3]"的模式来匹配,这个在py中就不行了,[]会匹配[]中的任何一个分字。 在python中的应该是"keywd1|keywd2|keywd3"就行了。