IO流內(nèi)容整理
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();
}
}