一、輸入輸出流介紹
IO流【輸入輸出流】:
按照流向劃分:
輸入流:外部資料 -> java程式
輸出流:java程式 -> 外部資料
按照資料型別劃分【根據使用記事本開啟是否能夠看懂來決定】:
位元組流【萬能流】:
位元組輸出流:
OutputStream(抽象類)
- FileOutputStream(實現子類)
位元組輸入流:
InputStream(抽象類)
- FileInputStream(實現子類)
字元流【記事本能看懂】:
字元輸入流:
字元輸出流:
FileInputStream:
構造方法:
FileInputStream(File file)
FileInputStream(String name)
成員方法:
public int read()
public int read(byte[] b)
二、位元組輸入流
public class FileInputStreamDemo1 {
public static void main(String[] args) throws Exception {
// FileInputStream fis = new FileInputStream(new File("java/src/com/shujia/day16/a1.txt"));
FileInputStream fis = new FileInputStream("java/src/com/shujia/day16/a1.txt");
//public int read() 一次只讀取一個位元組
// 如果沒有讀到資料,返回-1
// System.out.print((char)fis.read());
// System.out.print((char)fis.read());
// System.out.print((char)fis.read());
// System.out.print((char)fis.read());
// System.out.print((char)fis.read());
// System.out.print((char)fis.read());
// System.out.print((char)fis.read());
// int i = 0;
// while ((i = fis.read()) != -1) {
// System.out.print((char) i);
// }
//public int read(byte[] b) 一次讀取一個位元組陣列
//建立一個位元組陣列,用作接收讀取到的位元組
byte[] bytes = new byte[7];
int length = 0;
while ((length = fis.read(bytes))!=-1){
//讀取到的位元組在位元組陣列中
//返回的是實際讀取到的位元組數
//將位元組陣列轉字串
String s = new String(bytes,0,length);
System.out.print(s);
}
// 釋放資源
fis.close();
}
}
使用位元組輸入流讀取檔案內容
import java.io.FileInputStream;
/*
使用位元組輸入流讀取漢字
*/
public class FileInputStreamDemo2 {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("java/src/com/shujia/day16/a2.txt");
// 一次讀取一個位元組
System.out.println((char) fis.read());
//一次讀取一個位元組陣列
// byte[] bytes = new byte[1024];
// int length = fis.read(bytes);
// String s = new String(bytes, 0, length);
// System.out.println(s);
// 釋放資源
fis.close();
}
}
三、位元組輸出流
import java.io.File;
import java.io.FileOutputStream;
/*
IO流【輸入輸出流】:
按照流向劃分:
輸入流:外部資料 -> java程式
輸出流:java程式 -> 外部資料
按照資料型別劃分【根據使用記事本開啟是否能夠看懂來決定】:
位元組流【萬能流】:
位元組輸出流:
OutputStream(抽象類)
- FileOutputStream(實現子類)
位元組輸入流:
InputStream(抽象類)
字元流【記事本能看懂】:
字元輸入流:
字元輸出流:
FileOutputStream:
構造方法:
FileOutputStream(File file)
FileOutputStream(String name)
*/
public class FileOutputStreamDemo1 {
public static void main(String[] args) throws Exception{
// FileOutputStream(File file) 將目標檔案封裝成File物件
// 若目標檔案不存在,則會自動建立
// FileOutputStream fos = new FileOutputStream(new File("java/src/com/shujia/day16/a1.txt"));
//FileOutputStream(String name)
FileOutputStream fos = new FileOutputStream("java/src/com/shujia/day16/a1.txt");
}
}
向檔案中寫入資料
import java.io.FileOutputStream;
/*
public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len)
思考:
1、如何實現檔案內容追加寫? 使用另一個過載的構造方法傳入append引數值
2、如何實現寫的時候換行?寫一個換行符
*/
public class FileOutputStreamDemo2 {
public static void main(String[] args) throws Exception{
// FileOutputStream fos = new FileOutputStream("java/src/com/shujia/day16/a1.txt");
//public FileOutputStream(String name, boolean append)
FileOutputStream fos = new FileOutputStream("java/src/com/shujia/day16/a1.txt", true);
//public void write(int b) 寫一個ASCII碼值
// fos.write(97);
// public void write(byte[] b) 寫一個位元組陣列到檔案中
// byte[] bytes = {97,98,99,100,101,102};
// fos.write(bytes);
//public void write(byte[] b,int index,int len)
// fos.write(bytes,2,3);
fos.write("\r\n".getBytes());
fos.write("李剛真帥!".getBytes());
//釋放資源
fos.close();
}
}
四、位元組緩衝輸入流
import java.io.BufferedInputStream;
import java.io.FileInputStream;
/*
InputStream:
FileInputStream【普通的位元組輸入流】:
BufferedInputStream【位元組緩衝輸入流】:
*/
public class BufferedInputStreamDemo1 {
public static void main(String[] args) throws Exception {
//BufferedInputStream(InputStream in)
//建立一個 BufferedInputStream並儲存其引數,輸入流 in ,供以後使用。
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("java/src/com/shujia/day16/a1.txt"));
// 一次讀一個位元組
// int i = 0;
// while ((i=bis.read())!=-1){
// System.out.print((char) i);
// }
// 一次都一個位元組陣列
byte[] bytes = new byte[1024];
int length = 0;
while ((length = bis.read(bytes)) != -1) {
String s = new String(bytes, 0, length);
System.out.print(s);
}
//釋放資源
bis.close();
}
}
五、位元組緩衝輸出流
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
/*
OutputStream:
FileOutputStream【普通的位元組輸出流】:
BufferedOutputStream【位元組緩衝輸出流】:
*/
public class BufferedOutputStreamDemo1 {
public static void main(String[] args) throws Exception{
//BufferedOutputStream(OutputStream out)
//建立一個新的緩衝輸出流,以將資料寫入指定的底層輸出流。
//建立一個位元組緩衝輸出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("java/src/com/shujia/day16/a2.txt"));
bos.write("李剛是世界上最帥的男人!".getBytes());
bos.write("好好學習".getBytes());
bos.flush();
//釋放資源
bos.close(); // 關閉緩衝流的時候,會先將記憶體中的資料刷到磁碟中
}
}
六、字元輸入流
import java.io.FileInputStream;
import java.io.InputStreamReader;
/*
字元流:
字元輸入流:
Reader【抽象類】
- InputStreamReader【具體實現子類】
字元輸出流:
Writer【抽象類】
- OutputStreamWriter【具體實現子類】
InputStreamReader:
構造方法:
InputStreamReader(InputStream in) 建立一個使用預設字符集的InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 建立一個使用命名字符集的InputStreamReader。
成員方法:
public int read()
public int read(char[] cbuf)
*/
public class InputStreamReaderDemo1 {
public static void main(String[] args) throws Exception {
// InputStreamReader isr = new InputStreamReader(new FileInputStream("java/src/com/shujia/day16/a3.txt"));
//InputStreamReader(InputStream in, String charsetName)
InputStreamReader isr = new InputStreamReader(new FileInputStream("java/src/com/shujia/day16/a3.txt"), "GBK");
// public int read() 一次都一個字元
// System.out.print((char) isr.read());
// System.out.print((char) isr.read());
// int i = 0;
// while ((i = isr.read()) != -1) {
// System.out.print((char) i);
// }
//public int read(char[] cbuf) 一次讀取一個字元陣列
char[] chars = new char[1024];
int length = 0;
while ((length= isr.read(chars))!=-1){
String s = new String(chars, 0, length);
System.out.print(s);
}
// 釋放資源
isr.close();
}
}
七、字元輸出流
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.Arrays;
/*
字元流【轉換流】:位元組流 + 編碼表
編碼:加密
解碼:解密
字元流:
字元輸入流:
Reader
字元輸出流:
Writer【抽象類】
- OutputStreamWriter【具體實現子類】
OutputStreamWriter:
構造方法:
OutputStreamWriter(OutputStream out) 建立一個使用預設字元編碼的OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) 建立一個使用命名字符集的OutputStreamWriter。
成員方法:
public void write(int c)
public void write(char[] cbuf)
public void write(char[] cbuf,int off,int len)
public void write(String str)
public void write(String str,int off,int len)
*/
public class OutputStreamWriterDemo1 {
public static void main(String[] args) throws Exception{
// String s1 = "今天下午放假,不上課!";
//// byte[] bytes = s1.getBytes();
// byte[] bytes = s1.getBytes("GBK");
// System.out.println(Arrays.toString(bytes));
//
// String s = new String(bytes,"GBK");
// System.out.println(s);
// 建立OutputStreamWriter(OutputStream out)物件
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java/src/com/shujia/day16/a3.txt"),"GBK");
// public void write(int c) 一次寫一個字元
// osw.write(97);
// osw.flush();
//public void write(char[] cbuf) 一次寫一個字元陣列
// char[] chars = {'我','愛','數','加'};
// osw.write(chars);
//public void write(char[] cbuf,int off,int len) 一次寫字元陣列的一部分
// osw.write(chars,1,3);
// osw.flush();
//public void write(String str) 直接寫一個字串
// osw.write("李剛是32期最帥的男人!");
// osw.flush();
//public void write(String str,int off,int len) 寫字串的一部分
// osw.write("李剛是32期最帥的男人!",6,2);
osw.write("中國");
osw.flush();
//釋放資源
osw.close();
}
}
八、字元緩衝輸入流
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
/*
字元流:
字元輸入流:
Reader【抽象類】
- InputStreamReader【具體實現子類】
- FileReader【繼承自InputStreamReader】
- BufferedReader 【字元緩衝輸入流】
字元輸出流:
Writer【抽象類】
- OutputStreamWriter【具體實現子類】
- FileWriter【繼承自OutputStreamWriter】
- BufferedWriter【字元緩衝輸出流】
BufferedReader 【字元緩衝輸入流】:
構造方法:
BufferedReader(Reader in) 建立使用預設大小的輸入緩衝區的緩衝字元輸入流。
特殊功能:
public String readLine() 一次讀取文字檔案內容的一行, 不會讀取換行符
*/
public class BufferedReaderDemo1 {
public static void main(String[] args) throws Exception {
//建立字元緩衝輸入流物件
// BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("java/src/com/shujia/day16/b3.txt")));
BufferedReader br = new BufferedReader(new FileReader("java/src/com/shujia/day16/b3.txt"));
//一次讀一個字元
// int i = 0;
// while ((i=br.read())!=-1){
// System.out.print((char) i);
// }
//一次讀一個字元陣列
// char[] chars = new char[1024];
// int length = 0;
// while ((length=br.read(chars))!=-1){
// String s = new String(chars, 0, length);
// System.out.print(s);
// }
//一次讀取一行資料
// System.out.println(br.readLine());
// System.out.println(br.readLine());
// System.out.println(br.readLine());
// System.out.println(br.readLine());
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//釋放資源
br.close();
}
}
九、字元緩衝輸出流
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
/*
字元流:
字元輸入流:
Reader【抽象類】
- InputStreamReader【具體實現子類】
- FileReader【繼承自InputStreamReader】
- BufferedReader 【字元緩衝輸入流】
字元輸出流:
Writer【抽象類】
- OutputStreamWriter【具體實現子類】
- FileWriter【繼承自OutputStreamWriter】
- BufferedWriter【字元緩衝輸出流】
BufferedWriter【字元緩衝輸出流】:
構造方法:
BufferedWriter(Writer out) 建立使用預設大小的輸出緩衝區的緩衝字元輸出流。
特殊方法:
newLine(); // 預設會自動根據當前的系統生成一個換行符
*/
public class BufferedWriterDemo1 {
public static void main(String[] args) throws Exception{
//BufferedWriter(Writer out) 建立使用預設大小的輸出緩衝區的緩衝字元輸出流。
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("java/src/com/shujia/day16/b3.txt")));
BufferedWriter bw = new BufferedWriter(new FileWriter("java/src/com/shujia/day16/b3.txt"));
bw.write("落霞與孤鶩齊飛");
// bw.write("\r\n"); // 這裡的換行符需要根據將來執行的系統環境來設定
bw.newLine(); // 預設會自動根據當前的系統生成一個換行符
bw.write("秋水共長天一色");
bw.flush();
//釋放資源
bw.close();
}
}