java字符流處理文件,編碼問題


@

字節流和字符流的區別?

1.字節流處理 換行 等字符不方便

2.字節流在 處理 文本文件的時候,如果做了人為的類型轉換,很可能會出現亂碼

3.字節流不能夠處理編碼問題

4.針對讀取一行或者讀取一部分的操作不方便

編碼、解碼

  • 編碼: 將字符/字符數組/字符串 轉換成 二進制
  • 解碼: 將二進制 轉換成 字符/字符數組/字符串
  • 編碼表: 字符和十進制數值對應的一張表而已

為什么會產生亂碼?

1.服務器,客戶端,數據庫,文件系統之間的編碼和解碼使用的編碼表不一致 (溝通)

2.人為在使用字節流讀取的過程中做了轉換 (使用字符流解決)

編碼解碼的三種情況

1.處理字符情況

    // 1.處理字符情況
    char ch = 'a';
    // 編碼
    System.out.println((int)ch);

    int i = 97;
    // 解碼
    System.out.println((char)97);

2.處理字符串情況

		// 2.處理字符串情況
		String s = "中國Hello";
		// 編碼
		byte[] bys = s.getBytes("UTF-8");
		System.out.println(Arrays.toString(bys)); // [-42, -48, -71, -6, 72, 101, 108, 108, 111]
		
		// 解碼
		String ss = new String(bys, "UTF-8");
		System.out.println(ss);

3.處理文本文件情況

OutputStreamWriter(轉換流,是字符流通向字節流的橋梁,可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平台默認字符集編碼。)

OutputStreamWriter(OutputStream out)  創建使用默認字符編碼的字符輸出轉換流

OutputStreamWriter(OutputStream out, Charset cs)  創建使用cs字符集的字符輸出轉換流

OutputStreamWriter(OutputStream out, CharsetEncoder enc)  創建使用enc字符集編碼器的

OutputStreamWriter(OutputStream out, String charsetName)  創建使用指定字符集的

Writer append(char c) 
		將指定字符添加到此 writer。 
Writer append(CharSequence csq) 
		將指定字符序列添加到此 writer。 
Writer append(CharSequence csq, int start, int end) 
		將指定字符序列的子序列添加到此 writer.Appendable。 
abstract  void close() 
		關閉此流,但要先刷新它。 
abstract  void flush() 
		刷新該流的緩沖。 
void write(char[] cbuf) 
		寫入字符數組。 
abstract  void write(char[] cbuf, int off, int len) 
		寫入字符數組的某一部分。 
void write(int c) 
    	寫入單個字符。 
void write(String str) 
    	寫入字符串。 
void write(String str, int off, int len) 
    	寫入字符串的某一部分。 
    String s = "HelloWorld";
    Writer w = new OutputStreamWriter(new FileOutputStream("out.txt"),"utf-8");
    w.write(s);
    w.append("good");
    w.append("morning");
    w.append('a');
    w.write(new char[] {'a','b','c'});
    w.write("中國你好");
    w.flush();
    w.close();

轉換字符輸入流

int read()
讀取單個字符。

int read(char[] cbuf)
將字符讀入數組。

abstract int read(char[] cbuf, int off, int len)
將字符讀入數組的某一部分。

    Reader r = new InputStreamReader(new FileInputStream("out.txt"), "UTF-8");		
    char[] chs = new char[5];
    int len = 0;
    while ((len = r.read(chs)) != -1) {
        System.out.println(new String(chs, 0, len));
    }

字符流拷貝一個文件

    InputStreamReader isr = new InputStreamReader(new FileInputStream("test.java"));
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt"));

    int len = 0;
    char[] chs = new char[1024];

    while ((len = isr.read(chs)) != -1) {
        osw.write(chs, 0, len);
        osw.flush();
    }

    isr.close();
    osw.close();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM