java文件读写操作指定编码格式

读文件:

BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。

可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,

 BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
 将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
可以对使用 DataInputStream 进行按原文输入的程序进行本地化,方法是用合适的 BufferedReader 替换每个 DataInputStream。

为了指定文件的编码方式,再进入如下修改:
//BufferedReader in = new BufferedReader(new FileReader(saveFilename));
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(saveFilename),"GB2312"));


写文件:

BufferedWriter

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (' ') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

通常 Writer 将其输出立即发送到基础字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

 PrintWriter out
   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
 将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。


为了指定文件的编码方式:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(saveFilename),"GB2312")));

package com.mkyong;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
 
public class UTF8To<a href="https://www.baidu.com/s?wd=GBK&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLPWfdnA7bnWN-uHRsmvu-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHnsnHbknW6YPWRsrHbYPWRLrf" target="_blank" class="baidu-highlight">GBK</a> {
    public static void main(String[] args) throws Exception {
 
        File fileDir = new File("/home/user/Desktop/Unsaved Document 1");
 
        BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream(fileDir), "UTF-8"));
 
        String str;
 
        while ((str = in.readLine()) != null) {
            System.out.println(str);// java内部只有unicode编码 所以str是unicode编码
            String str2 = new String(str.getBytes("<a href="https://www.baidu.com/s?wd=GBK&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLPWfdnA7bnWN-uHRsmvu-0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHnsnHbknW6YPWRsrHbYPWRLrf" target="_blank" class="baidu-highlight">GBK</a>"), "GBK");// str.getBytes("GBK")是gbk编码,但是str2是unicode编码
            System.out.println(str2);
        }
 
        in.close();
    }
}

 问题的关键是new String(xxx.getBytes("gbk"), "gbk")这句话是什么意思,xxx.getBytes("gbk")是GBK编码,所以java是不能够正确输出的,因此必须通过new String(xxx.getBytes("gbk"), "gbk")把xxx.getBytes("gbk")的GBK编码变成unicode编码,因此你要的GBK就是str.getBytes("GBK")这就是GBK编码,不过你是不能够输出的,因此java不支持输出GBK

String fullStr = new String(str.getBytes("UTF-8"), "UTF-8");//正常
String fullStr2 = new String(str.getBytes("UTF-8"), "GBK");//不正常,编码不一致搜索UTF-8的编码怎么能够解读为 GBK

看一下jdk文档是怎么说的

public String(byte[] bytes,
      Charset charset)

Constructs a new String by decoding the specified array of bytes using the specified charset.

str.getBytes("GBK")

应该就是你要传递给接口的

那现在的问题就是,我怎么在String中持有GBK编码的东西呢?

String str3 = new String(str.getBytes("GBK"),"ISO-8859-1");
System.out.println(new String(str3.getBytes("ISO-8859-1"),"GBK"));

str3就是可以传递给后台的的字符串

原文地址:https://www.cnblogs.com/aipan/p/6561279.html