Java中的IO流(二)

Java中的IO流(一):
https://blog.csdn.net/Veer_c/article/details/103833045
Java中的IO流(二):
https://blog.csdn.net/Veer_c/article/details/103833423
Java中的IO流(三):
https://blog.csdn.net/Veer_c/article/details/103833811

編碼問題

String中的編碼和解碼問題。
編碼:把我們能夠看懂的字符轉換爲看不懂的數據
解碼:把我們看不懂的數據轉換爲看得懂的字符
public byte[] getBytes(String charsetName) 按照給定的編碼方式,編碼字節數組(gbk,utf-8)
String(byte[] bytes, String charsetName) 按照給定的編碼方式解碼字符數組

String s = "中國好";
byte[] bytes = s.getBytes("utf-8");
System.out.println(Arrays.toString(bytes));
//String(byte[] bytes, String charsetName)
System.out.println(new String(bytes,"gbk"));

注意:用什麼編碼,就必須用什麼解碼,否則會出現亂碼。

字符流

Reader
Writer

IO流中的編碼和解碼問題
OutputStreamWriter:把字節輸出流轉換爲字符輸出流
InputStreamReader:把字節輸入流轉換爲字符輸入流

轉換流

寫入數據,把字節輸出流轉換爲字符輸出流(不指定碼錶)
 	OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"));
把字節輸出流轉換爲字符輸出流(指定碼錶)
     OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"), "GBK");
     OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"), "UTF-8"); 
讀取數據, 把字節輸入流轉換爲字符輸入流(不指定碼錶)
     InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt"));
把字節輸入流轉換爲字符輸入流(指定碼錶)
     InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt"), "GBK");

總結:一般創建字符輸入或者輸出流一般情況下使用系統默認的碼錶就可以, 如果來來回回需要指定碼錶的話,就顯得非常的麻煩了。

將以上創建方式繼續簡化
如果採用剛纔的方式,創建對象寫起來比較複雜。
InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“b.txt”));
爲了簡化這種操作,java就針對這兩個轉換的字符流提供其子類。
FileReader
FileWriter
它們的默認編碼是採用系統編碼。
構造學習:
FileWriter(File file)
FileWriter(String fileName)
FileReader(File file)
FileReader(String fileName)

flush()和close()的區別:
flush: 刷新緩衝區,流對象可以繼續
close: 先刷新緩衝區,再關閉流對象。流對象不可以繼續使用了。

public class FileWriterDemo {
    public static void main(String[] args) throws IOException {
        /*要給字符輸出流中寫數據步驟:
         * 1.創建字符輸出流對象,並指向一個文件
         * 2.調用字符輸出流寫數據的方法給裏面寫數據
         * 3.刷新緩衝區
         * 4.關流 */
        // FileWriter(File file) 
        // FileWriter(String fileName) 
        //1.創建字符輸出流對象
        //FileWriter fw = new FileWriter(new File("c.txt"));
        FileWriter fw = new FileWriter("c.txt");
        //調用方法寫數據
        //一次寫一個字符  write(int c) 
        //fw.write('a');
        //一次寫一個字符數組write(char[] cbuf)
        //char[] chs = {'h','e','l','l','o'};
        //fw.write(chs);
        //一次寫一個字符數組的一部分write(char[] cbuf, int off,int len)
        //char[] chs = {'h','e','l','l','o'};
        //fw.write(chs, 2, 3);
        //一次寫一個字符串write(String str)
        //fw.write("helloworld");
        //一次寫一個字符串的一部分write(String str,int off,int len)
        fw.write("helloworld", 5, 5);
        //刷新緩衝區
        fw.flush();
        //關流
        fw.close();
    }
}
import java.io.FileNotFoundException;
import java.io.FileReader;
/*   FileReader(File file) 
     FileReader(String fileName)*/
public class FileReaderDemo {
    public static void main(String[] args) throws Exception {
        /**
         * 使用字符輸入流讀取c.txt真的個文件的步驟:
         * 1.創建字符輸入流對象,指向c.txt這個文件
         * 2.一次讀取一個字符
         * 3.關流
         */
        //1.創建字符輸入流對象,指向c.txt這個文件
        FileReader fr = new FileReader("c.txt");
        //2.一次讀取一個字符
        /*System.out.println((char)fr.read());
        System.out.println((char)fr.read());
        System.out.println((char)fr.read());
        System.out.println((char)fr.read());
        System.out.println((char)fr.read());
        System.out.println(fr.read());*/
        //使用循環改進
/*      int ch;
        while ((ch=fr.read())!=-1) {
            System.out.println((char)ch);
        }*/
        //一次讀取一個字符數組
/*      char[] chs = new char[2];
        System.out.println(fr.read(chs));//一次讀取一個字符數組,返回的是讀取到的實際的字符長度
        System.out.println(fr.read(chs));
        System.out.println(fr.read(chs));
        System.out.println(fr.read(chs));
        System.out.println(fr.read(chs));*/
        //使用循環改進上面代碼
        //定義一個字符數組
        char[] chs = new char[1024];
        int len;
        while ((len=fr.read(chs))!=-1) {
            System.out.println(new String(chs, 0, len));
        }
        //3.關流
        fr.close();
    }
}

練習:給字符輸出流裏面利用方法寫數據

  • 字符輸出流操作步驟:
  • A:創建字符輸出流對象
  • B:調用寫數據方法
  • C:釋放資源
  • 寫數據方法:
    一次寫一個字符 write(int c)
    一次寫一個字符數組write(char[] cbuf)
    一次寫一個字符數組的一部分write(char[] cbuf, int off,int len)
    一次寫一個字符串write(String str)
    一次寫一個字符串的一部分write(String str,int off,int len)

字符輸入流
字符輸入流操作步驟:
A:創建字符輸入流對象
FileReader fr = new FileReader(“a.txt”);
B:讀取數據並顯示在控制檯:
a:一次讀取一個字符
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
b:一次讀取一個字符數組
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
C:釋放資源:fr.close();
注意:字符流輸入輸出流複製的文件是有要求的,簡單來說只要是記事本打開文件的內容你能夠看得懂,就可以用字符流來進行復制,否則不行。
具體原因:像複製MP3或者一些視頻文件的時候,如果他的字節個數不是偶數的話,就會造成文件的缺損,因爲一個字符等於兩個字節

1.利用字符流複製java文件(兩種方式,一次讀寫一個字符,一次讀寫一個字符數組)

public class CopyFile {
    public static void main(String[] args) throws IOException {
        /* 1.封裝數據源和目的地
         * 2.一次讀寫一個字符或者一次讀寫一個字符數組
         * 3.關流 */
        //1.封裝數據源和目的地
        FileReader fr = new FileReader("InputStreamReaderDemo.java");
        FileWriter fw = new FileWriter("d.java");
        //2.1一次讀寫一個字符
        /*int ch;
        while ((ch=fr.read())!=-1) {
            fw.write(ch);//一次寫一個字符
            fw.flush();//每寫一次刷新緩衝區
        }*/
        //2.2一次讀寫一個字符數組
        char[] chs = new char[1024];
        int len;
        while ((len=fr.read(chs))!=-1) {
            fw.write(chs, 0, len);
            fw.flush();
        }
        //3.關流
        fw.close();
        fr.close();
    }
}

高效流:操作基本流的流
需求: 給文件中寫入十個”helloworld”,每寫一個換一行,每寫一行必須寫入一個換行符“/r/n”,這樣寫的弊端,windows系統下的換行符是“/r/n”,Linux是”\n”,Mac是”\r”,這樣會造成代碼的通用性不強。

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/* 	 BufferedWriter:字符緩衝輸出流
     構造:BufferedWriter(Writer out) 
     特殊方法:public void newLine():會根據系統來確定寫入不同的換行符 */
public class BufferedWriterDemo2 {
    public static void main(String[] args) throws IOException {
        //使用高效字符輸出流寫入10個helloworld,每寫一個換一行
        /* 1.創建字符高效輸出流,並指向一個txt文件
         * 2.調用裏面寫數據的方法,給文件中寫入數據
         * 3.調用換行的方法,給寫入的數據換行
         * 4.刷新換新區
         * 5.關流  */
        //1.創建字符高效輸出流,並指向一個txt文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("f.txt"));
        //2.調用裏面寫數據的方法,給文件中寫入數據
        for (int i = 0; i < 10; i++) {
            //給文件中寫入helloworld
            bw.write("helloworld");
            //寫入換行符
            bw.newLine();
            //刷新緩衝區
            bw.flush();
        }
        //關流
        bw.close();
    }
}

BufferedReader:字符緩衝輸入流
構造:BufferedReader(Reader in)
特殊方法:public String readLine():包含該行內容的字符串,不包含任何行終止符,如果已到達流末尾,則返回 null。

BufferedWriter:字符緩衝輸出流
構造:BufferedWriter(Writer out)
特殊方法:public void newLine():會根據系統來確定寫入不同的換行符

package com.edu_06;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderDemo {
    public static void main(String[] args) throws IOException {
        /*需求:使用高效字符輸入流讀取f.txt文件
         * 1.創建高效字符輸入流對象,指向f.txt
         * 2.一次讀取一行,readLine()
         * 3.關流  */
        //1.創建高效字符輸入流對象,指向f.txt
        //BufferedReader(Reader in) 
        BufferedReader br = new BufferedReader(new FileReader("f.txt"));
        //2.一次讀取一行,readLine(),當讀取文件末尾的時候返回null
/*      System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());
        System.out.println(br.readLine());*/
        //使用循環改進
        String line;
        while ((line= br.readLine())!=null) {
            System.out.println(line);
        }
        //3.關流
        br.close();
    }
}

Java中的IO流(一):
https://blog.csdn.net/Veer_c/article/details/103833045
Java中的IO流(二):
https://blog.csdn.net/Veer_c/article/details/103833423
Java中的IO流(三):
https://blog.csdn.net/Veer_c/article/details/103833811

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章