❶ java中的流是什麼
流是個抽象的概念,是對輸入輸出設備的抽象,Java程序中,對於數據的輸入/輸出操作都是以「流」的方式進行。設備可以是文件,網路,內存等。
流具有方向性,至於是輸入流還是輸出流則是一個相對的概念,一般以程序為參考,如果數據的流向是程序至設備,我們成為輸出流,反之我們稱為輸入流。
可以將流想像成一個「水流管道」,水流就在這管道中形成了,自然就出現了方向的概念。
當程序需要從某個數據源讀入數據的時候,就會開啟一個輸入流,數據源可以是文件、內存或網路等等。相反地,需要寫出數據到某個數據源目的地的時候,也會開啟一個輸出流,這個數據源目的地也可以是文件、內存或網路等等。
可以從不同的角度對流進行分類:
1. 處理的數據單位不同,可分為:字元流,位元組流
2.數據流方向不同,可分為:輸入流,輸出流
3.功能不同,可分為:節點流,處理流
1. 和 2. 都比較好理解,對於根據功能分類的,可以這么理解:
節點流:節點流從一個特定的數據源讀寫數據。即節點流是直接操作文件,網路等的流,例如FileInputStream和FileOutputStream,他們直接從文件中讀取或往文件中寫入位元組流。
處理流:「連接」在已存在的流(節點流或處理流)之上通過對數據的處理為程序提供更為強大的讀寫功能。過濾流是
使用一個已經存在的輸入流或輸出流連接創建的,過濾流就是對節點流進行一系列的包裝。例如BufferedInputStream和
BufferedOutputStream,使用已經存在的節點流來構造,提供帶緩沖的讀寫,提高了讀寫的效率,以及DataInputStream和
DataOutputStream,使用已經存在的節點流來構造,提供了讀寫Java中的基本數據類型的功能。他們都屬於過濾流。
來源:
http://www.cnblogs.com/shitouer/archive/2012/12/19/2823641.html
❷ java的幾種IO流讀取文件方式
一、超類:
位元組流: InputStream(讀入流) OutputStream(寫出流)
字元流: Reader(字元 讀入流) Writer (字元寫出流)
二、文件操作流
位元組流: FileInputStream ,FileOutputStream
字元流: FileReader, FileWriter(用法與位元組流基本相同,不寫)
//1.指定要讀 的文件目錄及名稱
File file =new File("文件路徑");
//2.創建文件讀入流對象
FileInputStream fis =new FileInputStream(file);
//3.定義結束標志,可用位元組數組讀取
int i =0 ;
while((i = fis.read())!=-1){
//i 就是從文件中讀取的位元組,讀完後返回-1
}
//4.關閉流
fis.close();
//5.處理異常
//1.指定要寫到的文件目錄及名稱
File file =new File("文件路徑");
//2.創建文件讀入流對象
FileOutputStream fos =new FileOutputStream(file);
//3.定義結束標志
fos.write(要寫出的位元組或者位元組數組);
//4.刷新和關閉流
fos.flush();
fos.close();
//5.處理異常
三、緩沖流:
位元組緩沖流: BufferedInputStream,BufferedOutputStream
字元緩沖流:BufferedReader ,BufferedWriter
緩沖流是對流的操作的功能的加強,提高了數據的讀寫效率。既然緩沖流是對流的功能和讀寫效率的加強和提高,所以在創建緩沖流的對象時應該要傳入要加強的流對象。
//1.指定要讀 的文件目錄及名稱
File file =new File("文件路徑");
//2.創建文件讀入流對象
FileInputStream fis =new FileInputStream(file);
//3.創建緩沖流對象加強fis功能
BufferedInputStream bis =new BufferedInputStream(fis);
//4.定義結束標志,可用位元組數組讀取
int i =0 ;
while((i = bis.read())!=-1){
//i 就是從文件中讀取的位元組,讀完後返回-1
}
//5.關閉流
bis.close();
//6.處理異常
//1.指定要寫到的文件目錄及名稱
File file =new File("文件路徑");
//2.創建文件讀入流對象
FileOutputStream fos =new FileOutputStream(file);
//3.創建緩沖流對象加強fos功能
BufferedOutputStream bos=new BufferedOutputStream(fos);
//4.向流中寫入數據
bos.write(要寫出的位元組或者位元組數組);
//5.刷新和關閉流
bos.flush();
bos.close();
//6.處理異常
四、對象流
ObjectInputStream ,ObjectOutputStream
不同於以上兩種類型的流這里只能用位元組對對象進行操作原因可以看上篇的編碼表比照原理
ObjectOutputStream對象的序列化:
將java程序中的對象寫到本地磁碟里用ObjectOutputStream
eg:將Person類的對象序列化到磁碟
創建Person類
注1:此類要實現Serializable介面,此介面為標志性介面
注2:此類要有無參的構造函數
注3:一旦序列化此類不能再修改
class Person implements Serializable{
public Person(){}
}
2.創建對象流對象
註:要增強功能可以將傳入文件緩沖流
ObjectOutputStream oos =new ObjectOutputStream(
new FileOutputStream(new File("文件路徑")));
3.寫入對象 ,一般會將對象用集合存儲起來然後直接將集合寫入文件
List<Person> list =new ArrayList<>();
list.add(new Person());
...(可以添加多個)
oos.writeObject(list);
4.關閉流,處理異常
oos.flush();
oos.close();
五、轉換流:
這類流是用於將字元轉換為位元組輸入輸出,用於操作字元文件,屬於字元流的子類,所以後綴為reader,writer;前綴inputstream,outputstream;
注 :要傳入位元組流作為參賽
InputStreamReader: 字元轉換輸出流
OutputStreamWriter:字元轉換輸入流
//1.獲取鍵盤輸入的位元組流對象
inInputStream in =Stream.in;
/*2.用轉換流將位元組流對象轉換為字元流對象,方便調用字元緩沖流的readeLine()方法*/
InputStreamReader isr =new InputStreamReader(in);
/*5.創建字元轉換輸出流對象osw,方便把輸入的字元流轉換為位元組輸出到本地文件。*/
OutputStreamWriter osw =new OutputStreamWriter(new
FileOutputStream(new File("文件名")));
/*3.現在isr是字元流,可以作為參數傳入字元緩沖流中*/
BufferedReader br =new BufferedReader(isr);
/*4.可以調用字元緩沖流br的readLine()方法度一行輸入文本*/
String line =null;
while((line =br.readLine()){
osw.write(line);//osw是字元流對象,可以直接操作字元串
}
註:InputStreamReader isr =new InputStreamReader(new "各種類型的位元組輸入流都行即是:後綴為InputStream就行");
OutputStreamWriter osw =new OutputStreamWriter(new
"後綴為OutputStream就行");
六、區別記憶
1.對象流是可以讀寫幾乎所有類型的只要是對象就行,而位元組字元流,只能讀寫單個位元組字元或者位元組字元數組,以上沒有讀寫位元組字元數組的;注意對象流只有位元組流!
2.字元和位元組循環讀入的結束條件int i=0; (i =fis.read())!=-1
用字元數組復制文件(fr 讀入流 ,fw寫出流),位元組流也是相同的用法
int i = 0; char[] c = new char[1024];
while((i = fr.reade()) !=-1)){
fw.write(c,0,i);
}
123456
3.對象流裡面套緩沖流的情景:
new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File(「文件路徑」))));
4.記憶流及其功能的方法:
前綴表示功能,後綴表示流的類型;
比如說FileInputStream 前綴:File,表示操作的磁碟,後綴:intputstream,表示是位元組輸入流。
同理 FileReader:表示操作文件的字元流
ObjectInputStream :操作對象的位元組輸入流
5.拓展:獲取鍵盤輸入的字元的緩沖流的寫法:
new BufferedReader(new InputStreamReader(System.in)));
將位元組以字元形式輸出到控制台的字元緩沖流的寫法:
new BufferedWriter( new OutputStreamWriter(System.out))
❸ java中的文件流
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Test implements ActionListener {
String[] list1;
String[] list2;
String file1 = "/home/soft01/1.txt";//1.txt路徑
String file2 = "/home/soft01/2.txt";//2.txt路徑
JTextField jtf1;
JTextField jtf2;
int num = 3;
private boolean flag = true;
public Test() {
begin();
list1 = fileToString(file1);
list2 = fileToString(file2);
}
public void begin() {
JFrame jf = new JFrame();
jf.setLayout(new GridLayout(3, 2));
JLabel jl1 = new JLabel(" 1");
JLabel jl2 = new JLabel(" 2");
JLabel jl3 = new JLabel(" res");
jtf1 = new JTextField(8);
jtf2 = new JTextField(8);
JTextField jtf3 = new JTextField(8);
jtf3.addActionListener(this);
jf.add(jl1);
jf.add(jtf1);
jf.add(jl2);
jf.add(jtf2);
jf.add(jl3);
jf.add(jtf3);
jf.pack();
jf.setLocation(400, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public String[] fileToString(String filePath) {
String text = "";
try {
String str;
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(filePath)));
while ((str = reader.readLine()) != null) {
text = text + str + " ";
}
} catch (Exception e) {
e.printStackTrace();
}
return text.split(" ");
}
public void actionPerformed(ActionEvent e) {
if (num == list1.length) {
num = 3;
}
if (flag) {
jtf1.setText(list1[num]);
} else {
jtf2.setText(list2[num]);
num++;
}
flag = !flag;
}
public static void main(String[] args) {
new Test();
}
}
希望分數給我,寫這個也不容易了。
❹ java文件流怎麼寫
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
private File fileObject;
private String savePath;
FileOutputStream fileOutputStream = new FileOutputStream("savePath");
FileInputStream fileInputStream = new FileInputStream(fileObject);
byte[] buffer = new byte[100];
int len = 0;
while ((len = fileInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, len);
}