溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

IO流內(nèi)容整理

發(fā)布時(shí)間:2020-05-26 00:22:08 來(lái)源:網(wǎng)絡(luò) 閱讀:261 作者:龍逸塵 欄目:編程語(yǔ)言

IO流概述
IO流用來(lái)處理設(shè)備之間的數(shù)據(jù)傳輸
Java對(duì)數(shù)據(jù)的操作是通過(guò)流的方式
Java用于操作流的對(duì)象都在IO包中
IO流分類
按照數(shù)據(jù)流向
輸入流 讀入數(shù)據(jù)
輸出流 寫(xiě)出數(shù)據(jù)
按照數(shù)據(jù)類型
字節(jié)流 可以讀寫(xiě)任何類型的文件 比如音頻 視頻 文本文件
字符流 只能讀寫(xiě)文本文件
什么情況下使用哪種流呢?
如果數(shù)據(jù)所在的文件通過(guò)windows自帶的記事本打開(kāi)并能讀懂里面的內(nèi)容,就用字符流。其他用字節(jié)流。
如果你什么都不知道,就用字節(jié)流
IO流基類概述
a:字節(jié)流的抽象基類:
InputStream ,OutputStream。
b:字符流的抽象基類:
Reader , Writer。
注:由這四個(gè)類派生出來(lái)的子類名稱都是以其父類名作為子類名的后綴。
如:InputStream的子類FileInputStream。
如:Reader的子類FileReader。
FileOutputStream的構(gòu)造方法,
FileOutputStream(File file)
創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫(xiě)入數(shù)據(jù)的文件輸出流
FileOutputStream(File file, boolean append)
創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫(xiě)入數(shù)據(jù)的文件輸出流。
FileOutputStream(FileDescriptor fdObj)
創(chuàng)建一個(gè)向指定文件描述符處寫(xiě)入數(shù)據(jù)的輸出文件流,該文件描述符表示一個(gè)到文件 系統(tǒng)中的某個(gè)實(shí)際文件的現(xiàn)有連接。
FileOutputStream(String name)
創(chuàng)建一個(gè)向具有指定名稱的文件中寫(xiě)入數(shù)據(jù)的輸出文件流。
FileOutputStream(String name, boolean append)
創(chuàng)建一個(gè)向具有指定 name 的文件中寫(xiě)入數(shù)據(jù)的輸出文件流。
使用具體子類FileOutputStream
Io流的分類:

  • (1): 按照流向進(jìn)行劃分
    輸入流
    輸出流
    • (2): 按照操作的數(shù)據(jù)類型進(jìn)行劃分
    • 字節(jié)流
    • 字節(jié)輸入流 InputStream 讀
    • 字節(jié)輸出流 OutputStream 寫(xiě)
    • 字符流
    • 字符輸入流 Reader 讀
    • 字符輸出流 Writer 寫(xiě)
      注意事項(xiàng):
      創(chuàng)建字節(jié)輸出流對(duì)象了做了幾件事情?
      a:調(diào)用系統(tǒng)資源創(chuàng)建a.txt文件
      b:創(chuàng)建了一個(gè)fos對(duì)象
      c:把fos對(duì)象指向這個(gè)文件
      為什么一定要close()?
      a: 通知系統(tǒng)釋放關(guān)于管理a.txt文件的資源
      b: 讓Io流對(duì)象變成垃圾,等待垃圾回收器對(duì)其回收
      FileInputStream
      構(gòu)造方法:FileInputStream(File file)
      通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè) FileInputStream,該文件通過(guò)文件系統(tǒng)中 的 File 對(duì)象 file 指定。
      FileInputStream(FileDescriptor fdObj)
      通過(guò)使用文件描述符 fdObj 創(chuàng)建一個(gè) FileInputStream,該文件描述符表示到文件系統(tǒng) 中某個(gè)實(shí)際文件的現(xiàn)有連接。
      FileInputStream(String name)
      通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè) FileInputStream,該文件通過(guò)文件系統(tǒng)中 的路徑名 name 指定。
      BufferedOutputStream
      A:緩沖思想
      字節(jié)流一次讀寫(xiě)一個(gè)數(shù)組的速度明顯比一次讀寫(xiě)一個(gè)字節(jié)的速度快很多,
      這是加入了數(shù)組這樣的緩沖區(qū)效果,java本身在設(shè)計(jì)的時(shí)候,
      也考慮到了這樣的設(shè)計(jì)思想(裝飾設(shè)計(jì)模式后面講解),所以提供了字節(jié)緩沖區(qū)流
      B:BufferedOutputStream的構(gòu)造方法
      BufferedOutputStream(OutputStream out)
      創(chuàng)建一個(gè)新的緩沖輸出流,以將數(shù)據(jù)寫(xiě)入指定的底層輸出流。
      BufferedOutputStream(OutputStream out, int size)
      創(chuàng)建一個(gè)新的緩沖輸出流,以將具有指定緩沖區(qū)大小的數(shù)據(jù)寫(xiě)入指定的底層輸出流。
      BufferedInputStream
      A:BufferedInputStream的構(gòu)造方法
      BufferedInputStream(InputStream in)
      創(chuàng)建一個(gè) BufferedInputStream 并保存其參數(shù),即輸入流 in,以便將來(lái)使用。
      BufferedInputStream(InputStream in, int size)
      創(chuàng)建具有指定緩沖區(qū)大小的 BufferedInputStream 并保存其參數(shù),即輸入流 in,以便 將來(lái)使用。
      具體案例演示
      基本字節(jié)流一次讀寫(xiě)一個(gè)字節(jié)
      public class t7 {
      public static void main(String[] args) throws IOException {
      FileInputStream inputStream = new FileInputStream("Student.txt");
      FileOutputStream outputStream = new FileOutputStream("sss.txt");
      int num=0;
      while ((num=inputStream.read())!=-1){
      outputStream.write(num);
      }
      inputStream.close();
      outputStream.close();
      }
      }
      基本字節(jié)流一次讀寫(xiě)一個(gè)字節(jié)數(shù)組
      public class t8 {
      public static void main(String[] args) throws IOException {
      FileInputStream inputStream = new FileInputStream("Student.txt");
      FileOutputStream outputStream = new FileOutputStream("sss.txt");
      int num=0;
      byte[] bytes = new byte[1024 1024];
      while ((num=inputStream.read(bytes))!=-1){
      outputStream.write(bytes,0,num);
      }
      inputStream.close();
      outputStream.close();
      }
      }
      高效字節(jié)流一次讀寫(xiě)一個(gè)字節(jié)
      public class t9 {
      public static void main(String[] args) throws IOException {
      BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("Student.txt"));
      BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("sss.txt"));
      int num=0;
      while ((num=inputStream.read())!=-1){
      outputStream.write(num);
      }
      inputStream.close();
      outputStream.close();
      }
      }
      高效字節(jié)流一次讀寫(xiě)一個(gè)字節(jié)數(shù)組
      public class t10 {
      public static void main(String[] args)throws IOException {
      BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("Student.txt"));
      BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("sss.txt"));
      int num=0;
      byte[] bytes = new byte[1024
      1024];
      while ((num=inputStream.read(bytes))!=-1){
      outputStream.write(bytes,0,num);
      }
      inputStream.close();
      outputStream.close();
      }
      }

字符流出現(xiàn)的原因:由于字節(jié)流操作中文不是特別方便,所以,java就提供了字符流。

字符流: 字符流 = 字節(jié)流 + 編碼表
編碼: 就是把字符串轉(zhuǎn)換成字節(jié)數(shù)組

  • 把一個(gè)字符串轉(zhuǎn)換成一個(gè)字節(jié)數(shù)組
  • public byte[] getBytes();使用平臺(tái)的默認(rèn)字符集將此 String編碼為 byte 序列,并將結(jié)果存儲(chǔ)到一個(gè)新的 byte 數(shù)組中。
  • public byte[] getBytes(String charsetName) 使用指定的字符集將此 String 編碼為 byte 序列,并將結(jié)果存儲(chǔ)到一個(gè)新的 byte 數(shù)組中。
  • 解碼: 把字節(jié)數(shù)組轉(zhuǎn)換成字符串
  • public String(byte[] bytes): 通過(guò)使用平臺(tái)的默認(rèn)字符集解碼指定的 byte 數(shù)組,構(gòu)造一個(gè)新的 String。
  • public String(byte[] bytes, String charsetName) 通過(guò)使用指定的 charset 解碼指定的 byte 數(shù)組,構(gòu)造一個(gè)新的 String。
  • 使用什么字符集進(jìn)行編碼,那么就是使用什么字符集進(jìn)行解碼
  • 老地方 ----- 十進(jìn)制 ---- 二進(jìn)制 ---- 發(fā)出去
  • 接收 ---- 二進(jìn)制 ---- 十進(jìn)制 --- 老地方
    編碼:把看得懂的變成看不懂的: String -- byte[]
    解碼:把看不懂的變成看得懂的: byte[] -- String
    OutputStreamWriter
    OutputStreamWriter的構(gòu)造方法
    OutputStreamWriter(OutputStream out):根據(jù)默認(rèn)編碼(GBK)把字節(jié)流的數(shù)據(jù)轉(zhuǎn)換為字符流
    OutputStreamWriter(OutputStream out,String charsetName):根據(jù)指定編碼把字節(jié)流數(shù)據(jù)轉(zhuǎn)換為字符流
    方法概述
    public void write(int c) 寫(xiě)一個(gè)字符
    public void write(char[] cbuf) 寫(xiě)一個(gè)字符數(shù)組
    public void write(char[] cbuf,int off,int len) 寫(xiě)一個(gè)字符數(shù)組的 一部分
    public void write(String str) 寫(xiě)一個(gè)字符串
    public void write(String str,int off,int len) 寫(xiě)一個(gè)字符串的一部分
    InputStreamReader
    InputStreamReader的構(gòu)造方法
    InputStreamReader(InputStream is):用默認(rèn)的編碼(GBK)讀取數(shù)據(jù)
    InputStreamReader(InputStream is,String charsetName):用指定的編碼讀取數(shù)據(jù)
    方法概述
    public int read() 一次讀取一個(gè)字符
    public int read(char[] cbuf) 一次讀取一個(gè)字符數(shù)組 如果沒(méi)有讀到 返回-1
    FileWriter和FileReader
    FileReader和FileWriter的出現(xiàn)
    轉(zhuǎn)換流的名字比較長(zhǎng),而我們常見(jiàn)的操作都是按照本地默認(rèn)編碼實(shí)現(xiàn)的,
    所以,為了簡(jiǎn)化我們的書(shū)寫(xiě),轉(zhuǎn)換流提供了對(duì)應(yīng)的子類。
    FileWriter
    FileReader
    字符流便捷類: 因?yàn)檗D(zhuǎn)換流的名字太長(zhǎng)了,并且在一般情況下我們不需要制定字符集,
    于是java就給我們提供轉(zhuǎn)換流對(duì)應(yīng)的便捷類
    轉(zhuǎn)換流 -------------------------- 便捷類
    OutputStreamWriter ------- FileWriter
    InputStreamReader ------- FileReader
    字符緩沖流的特殊功能
    BufferedWriter: public void newLine():根據(jù)系統(tǒng)來(lái)決定換行符 具有系統(tǒng)兼容性的換行符
    BufferedReader: public String readLine():一次讀取一行數(shù)據(jù) 是以換行符為標(biāo)記的 讀到換行符就換行 沒(méi)讀到數(shù)據(jù)返回null
    包含該行內(nèi)容的字符串,不包含任何行終止符,如果已到達(dá)流末尾,則返回 null
    字符流復(fù)制文件
    基本的流一次一個(gè)字符
    public class t1 {
    public static void main(String[] args) throws IOException {
    InputStreamReader reader = new InputStreamReader(new FileInputStream("Student.txt"));
    OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("SSS.txt"));
    int len=0;
    while ((len=reader.read())!=-1){
    writer.write(len);
    writer.flush();
    }
    writer.close();
    reader.close();
    }
    }
    基本的流一次一個(gè)字符數(shù)組
    public class t2 {
    public static void main(String[] args) throws IOException {
    InputStreamReader reader = new InputStreamReader(new FileInputStream("Student.txt"));
    OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("sss.txt"));
    int len=0;
    char[] chars = new char[1024 * 1024];
    while ((len=reader.read(chars))!=-1){
    writer.write(chars,0,len);
    writer.flush();
    }
    reader.close();
    writer.close();
    }
    }
    高效的流一次一個(gè)字符
    public class t3 {
    public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader("Student.txt"));
    BufferedWriter writer = new BufferedWriter(new FileWriter("sss.txt"));
    int len=0;
    while ((len=reader.read())!=-1){
    writer.write(len);
    writer.flush();
    }
    reader.close();
    writer.close();
    }
    }

高效的流一次一個(gè)字符數(shù)組
public class t4 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("Student.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("sss.txt"));
int len=0;
char[] chars = new char[1024 * 1024];
while ((len=reader.read(chars))!=-1){
writer.write(chars,0,len);
writer.flush();
}
reader.close();
writer.close();
}
}
高效的流一次一行字符串
public class t5 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("Student.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("sss.txt"));
String len=null;
while ((len=reader.readLine())!=null){
writer.write(len);
writer.newLine();
writer.flush();
}
reader.close();
writer.close();

}

}
IO流(鍵盤(pán)錄入學(xué)生信息按照總分排序并寫(xiě)入文本文件)
public class Student implements Comparable<Student>{
private String name;
private int chinese;
private int math;
private int English;
private int all;

public Student() {
}

public Student(String name, int chinese, int math, int english, int all) {
    this.name = name;
    this.chinese = chinese;
    this.math = math;
    English = english;
    this.all = all;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getChinese() {
    return chinese;
}

public void setChinese(int chinese) {
    this.chinese = chinese;
}

public int getMath() {
    return math;
}

public void setMath(int math) {
    this.math = math;
}

public int getEnglish() {
    return English;
}

public void setEnglish(int english) {
    English = english;
}

public int getAll() {
    return all;
}

public void setAll(int all) {
    this.all = all;
}

@Override
public String toString() {
    return "學(xué)生: " + "姓名~┏" + name + '┒' +
            ", 語(yǔ)文~" + chinese +
            ", 數(shù)學(xué)~" + math +
            ", 英語(yǔ)~" + English +
            ",總分~" + all ;
}

@Override
public int compareTo(Student student) {
    int num=-(this.all-student.all);
    int num2=num==0?this.name.compareTo(student.name):num;
    return num2;
}

}

public class text3 {
/ 3.A:案例演示: 需求:鍵盤(pán)錄入3個(gè)學(xué)生信息(
姓名,語(yǔ)文成績(jī)(chineseScore),數(shù)學(xué)成績(jī)(mathScore),英語(yǔ)成績(jī)(englishScore)),
/
public static void main(String[] args) throws IOException {
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Student.txt"));
Scanner scanner = new Scanner(System.in);
TreeSet<Student> students = new TreeSet<>();
for (int i = 0, n = 1; i < 3; i++, n++) {
Student student = new Student();
System.out.println("請(qǐng)輸入第" + n + "個(gè)學(xué)生的姓名");
String name = scanner.nextLine();
student.setName(name);
System.out.println("請(qǐng)輸入第" + n + "個(gè)學(xué)生的語(yǔ)文成績(jī)");
int chinese = scanner.nextInt();
student.setChinese(chinese);
System.out.println("請(qǐng)輸入第" + n + "個(gè)學(xué)生的數(shù)學(xué)成績(jī)");
int math = scanner.nextInt();
student.setMath(math);
System.out.println("請(qǐng)輸入第" + n + "個(gè)學(xué)生的英語(yǔ)成績(jī)");
int English = scanner.nextInt();
student.setEnglish(English);
scanner = new Scanner(System.in);
int num = chinese + math + English;
student.setAll(num);
students.add(student);
}

    for (Student s : students) {
        String s1 = String.valueOf(s);
        out.write(s1.getBytes());
        out.write("\n\r".getBytes());
    }
    out.close();

}

}

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI