Java第三階段學習(三、字符流、轉換流)

一、字節流讀取中文時出現的問題:

?文件中有中文時,用字節流讀取會出現亂碼的問題,因為一個中文為兩個字節

二、字符編碼表

編碼表:其實就是生活中字符和計算機二進制的對應關系表

1、ascii一個字節中的7位就可以表示。對應的字節都是正數。0-xxxxxxx

2、iso-8859-1:拉丁碼表 latin用了一個字節用的8位。1-xxxxxxx? 負數。

3、GB2312:簡體中文碼表。包含6000-7000中文和符號。用兩個字節表示。兩個字節第一個字節是負數,第二個字節可能是正數

? ??? GBK:目前最常用的中文碼表,2萬的中文和符號。用兩個字節表示,其中的一部分文字,第一個字節開頭是1,第二字節開頭是0

?? ?? GB18030:最新的中文碼表,目前還沒有正式使用。

4、unicode國際標準碼表:無論是什么文字,都用兩個字節存儲

? ? ? Java中的char類型用的就是這個碼表。char c = 'a';占兩個字節。

????? Java中的字符串是按照系統默認碼表來解析的。簡體中文版 字符串默認的碼表是GBK。

5、UTF-8:基于unicode,一個字節就可以存儲數據,不要用兩個字節存儲,而且這個碼表更加的標準化,在每一個字節頭加入了編碼信息(后期到api中查找)。

能識別中文的碼表:GBK、UTF-8;正因為識別中文碼表不唯一,涉及到了編碼解碼問題。

對于我們開發而言,常見的編碼 GBK? UTF-8? ISO-8859-1

文字--->(數字) :編碼 “abc”.getBytes()? byte[]??? //數字就是字節

(數字)--->文字? : 解碼 byte[] b={97,98,99}? new String(b) ?用new String 傳一個字節數組

三、字符輸入流? Reader類

Reader類:讀取字符流的超類。

方法:

1.read():讀取單個字符并返回

2.read():將數據讀取到數組中,并返回讀取的個數

四、字符輸入類 FileReader類

Reader類的子類,用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是適當的。

?構造方法:FileReader fr=new FileReader(文件路徑/文件對象);

package com.oracle.demo01;
import java.io.FileReader;
import java.io.IOException;
//字符輸入流
public class ReaderDemo {//因為是一個字符一個字符讀取的,所以讀取中文不會出現亂碼,專門用來處理文本文件public static void main(String[] args) throws IOException {// 1.獲取數據源FileReader fr=new FileReader("d:\\java\\writer.txt");//2.讀取數據int len=0;while((len=fr.read())!=-1){System.out.println((char)len);}fr.close();}}

?

?五、字符輸出流 Writer類

Writer是寫入字符流的抽象類。其中描述了相應的寫的動作。

?方法:

六、字符輸出類 FileWriter類

Writer類的子類,用來寫入字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是可接受的。

?構造方法:FileWriter fw=new FileWriter(文件路徑/文件對象);

package com.oracle.demo01;import java.io.FileWriter;
import java.io.IOException;
//字符輸出流   
public class WriteDemo {//字符流處理的是文本文件public static void main(String[] args) throws IOException {// 文本文件:打開人能看懂的就是文本文件//1.確定目的地FileWriter fw=new FileWriter("d:\\java\\writer.txt",true);//2.寫入數據//fw.write(100);   // 如果不刷新,會保存在內存中
//        char[] ch={'猴','賽','雷'};   //字符數組
//        fw.write(ch,0,2);    //可以輸出字符數組,也可以控制輸出的長度fw.write("崔永元實話實說",0,3);     //單引號是  字符,雙引號是字符串//3.刷新
        fw.flush();//4.釋放資源
        fw.close();}}

?

?flush()方法與colse()方法的區別:

flush():將流中的緩沖區緩沖的數據刷新到目的地中,刷新后,流還可以繼續使用,還可以繼續輸出。

close():關閉資源,但在關閉前會將緩沖區中的數據先刷新到目的地,否則丟失數據,然后再關閉流。關閉后流不可以使用。

注意:如果寫入數據多,一定要一邊寫一邊刷新,最后一次可以不刷新,由close完成刷新并關閉。

?練習題:用字符流復制文件

?

package com.oracle.demo01;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//用字符流復制文本文件,不要用來復制圖片與視頻等
public class Copy {public static void main(String[] args) throws IOException {// 1.獲取數據源FileReader fr=new FileReader("e:\\java\\outint.PNG");//2.獲取目標FileWriter fw=new FileWriter("D:\\java\\outin.png");//3.讀取并寫入int len =0;char[] ch=new char[1024];while((len=fr.read(ch))!=-1){fw.write(ch,0,len);}fw.flush();fr.close();fw.close();}}

?七、轉換流

?如果需要指定編碼和緩沖區大小時可以在字節流的基礎上構造一個InputStreamReader或者OutputStreamWriter。比如,如果文件內為UTF-8格式,但是電腦系統默認的格式為GBK格式,直接讀取的話會出現讀取內容與文件內容不符的問題,這個時候就需要轉換流來轉換。

7.1輸出轉換類OutputStreamWriter類

?

OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的字符編碼表,將要寫入流中的字符編碼成字節。它的作用的就是,將字符串按照指定的編碼表轉成字節再使用字節流將這些字節寫出去

?

package com.oracle.demo01;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
//轉換流    輸出
public class OutputStreamDemo {//結尾為Streatm的為字節流     結尾為reader或writer的為字符流public static void main(String[] args) throws IOException {//1.確定目的地//字節流輸出對象FileOutputStream fos=new FileOutputStream("e:\\java\\writer.txt",true);//2.設置走哪個碼表       碼表是文本文件內容所使用的碼表OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");//3.寫入數據//寫入時就轉換為了指定碼表的字符流osw.write("野豬佩奇");osw.flush();osw.close();}}

?

OutputStreamWriter流對象,它到底如何把字符轉成字節輸出的呢?

其實在OutputStreamWriter流中維護自己的緩沖區,當我們調用OutputStreamWriter對象的write方法時,會拿著字符到指定的碼表中進行查詢,把查到的字符編碼值轉成字節數存放到OutputStreamWriter緩沖區中。然后再調用刷新功能,或者關閉流,或者緩沖區存滿后會把緩沖區中的字節數據使用字節流寫到指定的文件中。

7.2轉換輸入流 InputStreamReader類

InputStreamReader 是字節流通向字符流的橋梁它使用指定的字符編碼表讀取字節并將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。

package com.oracle.demo01;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class InputStreamDemo {
//轉換流   先走碼表,根據碼表解析,然后再進行讀寫操作public static void main(String[] args) throws IOException {//1.獲取數據源FileInputStream fis=new FileInputStream("e:\\java\\writer.txt");//2.設置走哪個碼表InputStreamReader isr=new InputStreamReader(fis,"utf-8");//3.讀取數據int len=0;while((len=isr.read())!=-1){System.out.print((char)len);}isr.close();}}

?

注意:在讀取指定的編碼的文件時,一定要指定編碼格式,否則就會發生解碼錯誤,而發生亂碼現象。

?

7.3轉換流和字符類區別

發現有如下繼承關系:

父類:OutputStreamWriter:

????????????????? 子類:FileWriter:

父類:InputStreamReader:

     子類:FileReader;

OutputStreamWriter和InputStreamReader是字符和字節的橋梁:也可以稱之為字符轉換流。字符轉換流原理:字節流+編碼表

FileWriter和FileReader:作為子類,僅作為操作字符文件的便捷類存在操作的字符文件,使用的是默認編碼表時可以不用父類,而直接用子類就完成操作了,簡化代碼

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默認字符集。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

FileReader fr = new FileReader("a.txt");

這三句代碼的功能是一樣的,其中第三句最為便捷。

注意:一旦要指定其他編碼時,絕對不能用子類,必須使用字符轉換流。什么時候用子類呢?

條件:

1、操作的是文件。2、使用默認編碼。

總結:

字節--->字符 : 看不懂的--->看的懂的。? 需要讀。輸入流。 InputStreamReader

字符--->字節 : 看的懂的--->看不懂的。? 需要寫。輸出流。 OutputStreamWriter

練習題:

?

package com.oracle.demo01;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
//轉換流復制文本文件
public class CopyTwo {public static void main(String[] args) throws IOException {FileInputStream fis=new FileInputStream("e:\\java\\writer.txt");InputStreamReader osr=new InputStreamReader(fis,"utf-8");FileOutputStream fos=new FileOutputStream("d:\\java\\writer.txt");OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");int len=0;while((len=osr.read())!=-1){osw.write(len);}osr.close();osw.flush();osw.close();}}

?

?

?

轉載于:https://www.cnblogs.com/0328dongbin/p/9223750.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397621.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows下OpenSSL加密證書安裝步驟與使用方法

OpenSSL加密證書一般用于簽名認證,含私鑰和公鑰。在Linux系統中,OpenSSL一般是已經安裝好了,可以直接使用。而在Windows系統中,是需要安裝使用的。 最近在使用支付平臺時,用到了OpenSSL,鑒于此分享給大家&a…

linux運維(五)

頭有點大,也浪費了一些時間。明天過后緩沖一下1、存儲過程與觸發器的區別?答:(1)觸發器主要是通過事件執行觸發而被執行的,而存儲過程可以通過存儲過程名稱而直接調用。(call/execute&#xff0…

django web 自定義通用權限控制

需求:web系統有包含以下5個url,分別對于不同資源; 1、stu/add_stu/ 2、stu/upload_homework/ 3、stu/query_homework/ 4、stu/add_record/ ----------------------------------------------------------------------------------------------…

java源碼影視源碼搭建教程_新版千月影視app源碼+搭建教程

使用notepad批量替換URL【http://】為你的域名(被替換的域名訪問有成品不能發布 需要修改的到前臺confing里面查詢),替換名稱【鯨鷹影視】為你的應用名稱;服務端:1.將替換好的后端源碼打包上傳至站點根目錄后解壓;2.配置網站偽靜態…

git學習相關的博客地址

Git分支管理策略: http://www.ruanyifeng.com/blog/2012/07/git.html Git 使用規范流程: http://www.ruanyifeng.com/blog/2015/08/git-use-process.html 基于git的源代碼管理模型——git flow: http://www.ituring.com.cn/article/56870 Git…

Django框架基礎學習

Django安裝python下載地址 http://www.python.org/download/releases/3.3.4/Django的下載地址:https://www.djangoproject.com/download/1)安裝(進到解壓目錄)python setup.py install2、配置環境變量(PATH&#xff09…

Uboot USB模式(RK3288變磚頭的解決辦法)

RK3288啟動后有三種模式,可以分別進行操作。 第一種是normal也就是正常的啟動模式。這個模式無法刷固件。一般板子通電就是這個模式 第二種是loader模式。就是刷固件模式。這個模式可以刷各種image。按住recover按鍵再通電,通過uboot的檢測進入這個模式 …

java郵件實例_java郵件小實例

新建一個包,名為mail第一個類:MailSenderInfo.java###########################################package com.util.mail;/*** 發送郵件需要使用的基本信息*author by wangfunhttp://www.5a520.cn 小說520*/import java.util.Properties;public class Mai…

DEV GridView嵌套

/// <summary> /// 綁定主表和明顯表到GridView /// </summary> /// <param name"machineProduct">主表</param> /// <param name"configureData">字表</param> private void Mas…

局域網大型文件分發的可能解決方案

客戶原來的做法是把文件上傳到服務器&#xff0c;然后后形成一個普通的HTTP地址下入網站后臺系統&#xff0c;然后客戶端用戶看到后&#xff0c;則下載下來。但是隨著文件越來越大&#xff0c;客戶端下載量增加&#xff0c;在局域內網環境中這種文件分發方式的弊端立現。服務器…

android——獲取ImageView上面顯示的圖片bitmap對象

獲取的函數方法為&#xff1a;Bitmap bitmapimageView.getDrawingCache(); 但是如果只是這樣寫我們得到的bitmap對象可能為null值&#xff0c;正確的方式為&#xff1a; imageView.setDrawingCacheEnabled(true);Bitmap bitmapimageView.getDrawingCache();imageView.setDrawin…

java監聽com口_簡單了解Java接口+事件監聽機制

1.接口&#xff1a;定義方法&#xff1a;public interface interName //extends interName2, interName3...可繼承多個接口在接口里只能定義常量和抽象方法。public static final String Name;public abstract void method(String Name);//這里不能用大括號&#xff0c;不然就不…

例子:好友列表選中效果

<style type"text/css"> *{ margin:0px auto; padding:0px; font-family:微軟雅黑; font-size:16px;} .f{ width:200px; height:30px; background-color:#63C; color:white; text-align:center; line-height:30px; vertical-align:middle; margin-top:3px} .f:…

sublime 常用插件

AutoFileName 文件提示路徑&#xff0c;在img,script的[src]屬性。link,a的[href]屬性&#xff0c;background 的[url]屬性后提示文件的路徑 CSS Format css格式化工具 Pretty JSON json格式化工具轉載于:https://www.cnblogs.com/zhangtao1990/p/9231608.html

有一句說一千句,是作家....

有一句說一千句&#xff0c;是作家&#xff0c;這叫文采&#xff1b;有一句說一百句&#xff0c;是演說家&#xff0c;這叫口才&#xff1b;有一句說十句&#xff0c;是教授&#xff0c;這叫學問&#xff1b;有一句說一句&#xff0c;是律師&#xff0c;這叫嚴謹&#xff1b;說…

java jsoup爬取動態網頁_java通過Jsoup爬取網頁(入門教程)

一&#xff0c;導入依賴org.jsoupjsoup1.10.3org.apache.httpcomponentshttpclient二&#xff0c;編寫demo類注意不要導錯包了,是org.jsoup.nodes下面的package com.taotao.entity;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResp…

Java設計模式之七大結構型模式

總體來說設計模式分為三大類&#xff1a;創建型模式、結構型模式和行為型模式。 結構型模式&#xff0c;共有七種&#xff1a;適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。 其中適配器模式主要分為三類&#xff1a;類的適配器模式、對象的適配…

一個Option請求引發的深度解析

在當前項目中&#xff0c;前端通過POST方式訪問后端的REST接口時&#xff0c;發現兩條請求記錄&#xff0c;一條請求的Request Method為Options&#xff0c;另一條請求的Reuest Method為Post。想要解決這個疑惑還得從以下3個概念說起。 Http Options Method RFC2616標準&#x…

ionic+AnjularJs實現省市縣三級聯動效果

建議對ionic和AnjularJs有一定了解的人可以用到&#xff0c;很多時候我們要用到選擇省份、城市、區縣的功能&#xff0c;現在就跟著我來實現這個功能吧&#xff0c;用很少的代碼&#xff08;我這里是根據客戶的要求&#xff0c;只顯示想要顯示的部分省份和其相對應的城市、區縣…

md5和SHA校驗碼

md5已經不安全了,中國山東大學女學霸王小云破解了一系列密碼,當真是巾幗不讓須眉.說是破解,其實就是給你一個md5碼,讓你求出這個md5碼所對應的原始信息,顯然一個md5對應無數種原始信息.而md5的特性就是難以還原初始信息,但是王小云可以迅速找到給定md5碼的可行解.md5的解空間雖…