奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語言

Java讀取、寫入文件如何解決亂碼問題

時間:2024-08-24 13:25:44 java語言 我要投稿
  • 相關推薦

Java讀取、寫入文件如何解決亂碼問題

  在我們讀取文件流時,經常會遇到亂碼的現象,那么Java讀取、寫入文件如何解決亂碼問題呢?下面小編為大家解答一下,希望能幫到大家!

  首先,我們要明確一點,文本文件與二進制文件的概念與差異。

  文本文件是基于字符編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼、ANSI編碼等等。二進制文件是基于值編碼的文件,你可以根據具體應用,指定某個值是什么意思(這樣一個過程,可以看作是自定義編碼。)

  因此可以看出文本文件基本上是定長編碼的(也有非定長的編碼如UTF-8)。而二進制文件可看成是變長編碼的,因為是值編碼嘛,多少個比特代表一個值,完全由你決定。

  對于二進制文件,是千萬不能使用字符串的,因為字符串默認初始化時會使用系統默認編碼,然而,二進制文件因為自定義編碼自然與固定格式的編碼會有所沖突,所以對于二進制的文件只能采用字節流讀取、操作、寫入。

  對于文本文件,因為編碼固定,所以只要在讀取文件之前,采用文件自身的編碼格式解析文件,然后獲取字節,再然后,通過指定格式初始化字符串,那么得到的文本是不會亂碼的。雖然,二進制文件也可以獲取到它的文本編碼格式,但是那是不準確的,所以不能同日而語。

  具體操作如下:

  1)獲取文本文件的格式

  public static String getFileEncode(String path) { String charset ="asci"; byte[] first3Bytes = new byte[3]; BufferedInputStream bis = null; try {  boolean checked = false;  bis = new BufferedInputStream(new FileInputStream(path));  bis.mark(0);  int read = bis.read(first3Bytes, 0, 3);  if (read == -1)  return charset;  if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {  charset = "Unicode";//UTF-16LE  checked = true;  } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) {  charset = "Unicode";//UTF-16BE  checked = true;  } else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2] == (byte) 0xBF) {  charset = "UTF8";  checked = true;  }  bis.reset();  if (!checked) {  int len = 0;  int loc = 0;  while ((read = bis.read()) != -1) {   loc++;   if (read >= 0xF0)   break;   if (0x80 <= read && read <= 0xBF) //單獨出現BF以下的,也算是GBK   break;   if (0xC0 <= read && read <= 0xDF) {   read = bis.read();   if (0x80 <= read && read <= 0xBF)    //雙字節 (0xC0 - 0xDF) (0x80 - 0xBF),也可能在GB編碼內    continue;   else    break;   } else if (0xE0 <= read && read <= 0xEF) { //也有可能出錯,但是幾率較小   read = bis.read();   if (0x80 <= read && read <= 0xBF) {    read = bis.read();    if (0x80 <= read && read <= 0xBF) {    charset = "UTF-8";    break;    } else    break;   } else    break;   }  }  //TextLogger.getLogger().info(loc + " " + Integer.toHexString(read));  } } catch (Exception e) {  e.printStackTrace(); } finally {  if (bis != null) {  try {   bis.close();  } catch (IOException ex) {  }  } } return charset; } private static String getEncode(int flag1, int flag2, int flag3) { String encode=""; // txt文件的開頭會多出幾個字節,分別是FF、FE(Unicode), // FE、FF(Unicode big endian),EF、BB、BF(UTF-8) if (flag1 == 255 && flag2 == 254) {  encode="Unicode"; } else if (flag1 == 254 && flag2 == 255) {  encode="UTF-16"; } else if (flag1 == 239 && flag2 == 187 && flag3 == 191) {  encode="UTF8"; } else {  encode="asci";// ASCII碼 } return encode; }

  2)通過文件的編碼格式讀取文件流

  /** * 通過路徑獲取文件的內容,這個方法因為用到了字符串作為載體,為了正確讀取文件(不亂碼),只能讀取文本文件,安全方法! */ public static String readFile(String path){ String data = null; // 判斷文件是否存在 File file = new File(path); if(!file.exists()){  return data; } // 獲取文件編碼格式 String code = FileEncode.getFileEncode(path); InputStreamReader isr = null; try{  // 根據編碼格式解析文件  if("asci".equals(code)){  // 這里采用GBK編碼,而不用環境編碼格式,因為環境默認編碼不等于操作系統編碼   // code = System.getProperty("file.encoding");  code = "GBK";  }  isr = new InputStreamReader(new FileInputStream(file),code);  // 讀取文件內容  int length = -1 ;  char[] buffer = new char[1024];  StringBuffer sb = new StringBuffer();  while((length = isr.read(buffer, 0, 1024) ) != -1){  sb.append(buffer,0,length);  }  data = new String(sb); }catch(Exception e){  e.printStackTrace();  log.info("getFile IO Exception:"+e.getMessage()); }finally{  try {  if(isr != null){   isr.close();  }  } catch (IOException e) {  e.printStackTrace();  log.info("getFile IO Exception:"+e.getMessage());  } } return data; }

  3)通過文件指定的格式寫入文件

  /** * 按照指定的路徑和編碼格式保存文件內容,這個方法因為用到了字符串作為載體,為了正確寫入文件(不亂碼),只能寫入文本內容,安全方法 * * @param data *  將要寫入到文件中的字節數據 * @param path *  文件路徑,包含文件名 * @return boolean *  當寫入完畢時返回true; */ public static boolean writeFile(byte data[], String path , String code){ boolean flag = true; OutputStreamWriter osw = null; try{  File file = new File(path);  if(!file.exists()){  file = new File(file.getParent());  if(!file.exists()){   file.mkdirs();  }  }  if("asci".equals(code)){  code = "GBK";  }  osw = new OutputStreamWriter(new FileOutputStream(path),code);  osw.write(new String(data,code));  osw.flush(); }catch(Exception e){  e.printStackTrace();  log.info("toFile IO Exception:"+e.getMessage());  flag = false; }finally{  try{  if(osw != null){   osw.close();  }  }catch(IOException e){  e.printStackTrace();  log.info("toFile IO Exception:"+e.getMessage());  flag = false;  } } return flag; }

  4)對于二進制文件而且內容很少的,例如Word文檔等,可以使用如下方式讀取、寫入文件

  /** * 從指定路徑讀取文件到字節數組中,對于一些非文本格式的內容可以選用這個方法 *  457364578634785634534 * @param path *  文件路徑,包含文件名 * @return byte[] *  文件字節數組 *   */ public static byte[] getFile(String path) throws IOException { FileInputStream stream=new FileInputStream(path); int size=stream.available(); byte data[]=new byte[size]; stream.read(data); stream.close(); stream=null; return data; }  /** * 把字節內容寫入到對應的文件,對于一些非文本的文件可以采用這個方法。 * @param data *  將要寫入到文件中的字節數據 * @param path *  文件路徑,包含文件名 * @return boolean isOK 當寫入完畢時返回true; * @throws Exception */ public static boolean toFile(byte data[], String path) throws Exception { FileOutputStream out=new FileOutputStream(path); out.write(data); out.flush(); out.close(); out=null; return true; }

【Java讀取、寫入文件如何解決亂碼問題】相關文章:

如何解決java亂碼06-07

Java如何讀取文本文件07-06

php使用fgetcsv讀取csv文件出現亂碼的解決方法10-22

從Java的jar文件中如何讀取數據的方法10-18

php使用fgetcsv讀取csv文件出現亂碼09-23

講述java讀取properties文件的方法08-13

java讀取解析xml文件實例08-05

Java的jar文件中讀取數據的方法09-27

JSP環境下如何解決Ajax亂碼問題06-28

完美解決PHP中文亂碼問題07-18

主站蜘蛛池模板: 肥乡县| 金沙县| 德昌县| 莱西市| 方城县| 申扎县| 桑日县| 东明县| 休宁县| 康定县| 大邑县| 吉林市| 新宾| 诸城市| 新源县| 楚雄市| 聊城市| 九寨沟县| 金寨县| 建阳市| 尼木县| 东平县| 垫江县| 北安市| 龙南县| 双柏县| 黑龙江省| 堆龙德庆县| 三门峡市| 建湖县| 谷城县| 神池县| 上蔡县| 景洪市| 城步| 东光县| 北辰区| 布拖县| 抚远县| 滕州市| 安庆市|