Java對字節流和字符流的運用

字節流(FileInputStream,FileOutputStream)

/**
 * 字節流對文件的讀取操作
 */
package exercise6;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class fileDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//創建文件的對象(已存在的文件)
		File f=new File("D:\\aa.txt");
		
		System.out.println("文件路徑"+f.getAbsolutePath());
		System.out.println("文件大小"+f.length());
		
		//創建一個新的文件
		File f1=new File("D:\\new.txt");
		if(!f1.exists()) {
			try {
				f1.createNewFile();
				System.out.println("創建文件成功!");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		//創建文件夾
		File f2=new File("D:\\newFile2");
		if(!f2.isDirectory()) {
			f2.mkdirs();
			System.out.println("創建文件夾成功!");

	   }
		
		//讀取文件信息
		File f3=new File("D:\\aa.txt");
		//File沒有讀寫的能力,所以需要FileInpute
		FileInputStream ff=null;
		try {
			ff = new FileInputStream(f3);
			byte bytes[]=new byte[1024];
			int n=0;//中間變量,記錄實際讀入的字節總數
			//循環讀取
			while((n=ff.read(bytes))!=-1) {
				//read方法:read(byte[] b),最多讀取b.length個字節,返回值是實際讀入緩衝區的字節總數,
				//當沒有更多的數據時。返回-1
				
				//把字節轉換成string
				String str=new String(bytes,0,n);//表示從0~讀入的總字節數
				System.out.println(str);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//關閉文件流,必須放在這裏。
			try {
				ff.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		//寫入信息到文件
		File f4=new File("D:\\new.txt");
		FileOutputStream fos=null;
		
		try {
			fos=new FileOutputStream(f4);
			
			String str="Hello Word!\r\n";//末尾轉義字符,代表換行
			fos.write(str.getBytes());
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		//文件複製(先將文件讀取到緩存,再寫入到某個文件)
		//輸入流
		FileInputStream fin=null;
		//輸出流
		FileOutputStream fot=null;
		
		try {
			fin=new FileInputStream("D:\\aa.txt");
			fot=new FileOutputStream("D:\\newFile\\aa.txt");
			
			byte bytes[]=new byte[1024];//緩存
			int n=0;//中間變量,記錄實際讀入的字節總數
			//循環讀取
			while((n=fin.read(bytes))!=-1) {
				//從緩存中寫入到指定文件
				fot.write(bytes,0,n);//輸出的同時,轉換成String。
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				fin.close();
				fot.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	
		}
		
	}
}

其中循環讀取文件時候需要用到read()方法,讀到底時返回-1.

字符流(FileReader,FileWriter)

package exercise6;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 字符流對文件的操作
 *
 */

public class fileDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//文件讀取對象
		FileReader fr=null;
		//寫入到文件
		FileWriter fw=null;
		
		try {
			fr=new FileReader("D:\\aa.txt");
			fw=new FileWriter("D:\\newFile2\\aa.txt");
			
			//緩存
			char buff[]=new char[1024];
			int n=0;//中間變量,代表實際讀取的字節總數
			while((n=fr.read(buff))!=-1) {
				
				fw.write(buff,0,n);//轉換成String,從0-n個
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				fr.close();
				fw.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}

	}

}

字符緩存流(BufferedReader,BufferedWriter)

  字節流是一個一個字節讀取,字符流是一個一個字符讀取。當文件很大時,都不夠效率。字符緩存流可以一次讀取一行,而且可以直接對String操作,大大提高了效率,在寫寫法上和之前的代碼有所不同。

package exercise6;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 緩衝字符流讀取操作
 *
 */

public class fileDemo3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader br=null;
		BufferedWriter bw=null;

		try {
			//先創建FileReader對象找到文件,才能再放入BufferedReader
			FileReader fr=new FileReader("D:\\aa.txt");
			br=new BufferedReader(fr);
			
			//先創建FileWriter對象,再放入BufferedReader
			FileWriter fw=new FileWriter("D:\\newFile\\buff.txt");
			bw=new BufferedWriter(fw);
			
			//循環讀取文件
			String s="";//中間變量
			while((s=br.readLine())!=null) {//readLine不包括任何終止符,如果到達末尾,則返回null
				//直接操作輸出
				bw.write(s+"\r\n");//轉義字符添加換行
			}
				
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				br.close();
				bw.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}

	}

}

記事本

  這裏結合java的事件處理、圖像技術、文件處理可以做一個小的應用,筆記本支持讀取和保存文件。代碼如下

package Notepad;


import java.io.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

/**
 * 記事本
 * @author 光羽住一
 *
 */

public class NotePad extends JFrame implements ActionListener{
	
	//定義需要的組件
	JTextArea jta=null;
	JMenuBar jmb=null;//菜單條(一排區域,可添加菜單項)
	JMenu jml=null;//菜單項(例如:file,edit,source...)
	JMenuItem jit1,jit2=null;//具體的選項(比如file這個菜單下的選項)
	
	public NotePad() {
		jta=new JTextArea();
		jmb=new JMenuBar();
		
		jml=new JMenu("文件");
		jml.setMnemonic('F');//設置助記符
		
		jit1=new JMenuItem("打開");
		jit2=new JMenuItem("另存爲");
		//註冊監聽
		jit1.addActionListener(this);
		jit2.addActionListener(this);
		
		//將菜單條加入窗體
		this.setJMenuBar(jmb);
		//將菜單項加入到菜單條
		jmb.add(jml);
		//將菜單加入到菜單項
		jml.add(jit1);
		jml.add(jit2);
		
		this.add(jta);
		this.setLocation(200, 200);
		this.setSize(400, 300);
		this.setTitle("NotePad");
		this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setVisible(true);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		NotePad note=new NotePad();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		//判斷用戶點擊了哪個按鈕,並作出響應
		if(e.getSource()==jit1) {
			//System.out.println("open");
			
			//文件選擇組件
			JFileChooser jch=new JFileChooser();
			jch.setDialogTitle("請選擇文件...");
			jch.showOpenDialog(null);//應用打開文件界面設置的默認值。
			jch.setVisible(true);
			
			//得到用戶選擇文件的絕對路徑
			String fileplace=jch.getSelectedFile().getAbsolutePath();
			
			//讀取該文件
			FileReader fr=null;
			BufferedReader br=null;
			
			try {
				fr=new FileReader(fileplace);
				br=new BufferedReader(fr);
				
				String s="";//中間變量
				String result="";
				while((s=br.readLine())!=null) {//readLine不包括任何終止符,如果到達末尾,則返回null
					//循環讀取文件信息,把內容放到變量result
					result=result+s+"\r\n";
				}
				//將result放到文本框即可
				jta.setText(result);
				
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}finally {
				try {
					fr.close();
					br.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
		}
		else if(e.getSource()==jit2) {
			//System.out.println("save");
			
			//文件選擇組件
			JFileChooser jch=new JFileChooser();
			jch.setDialogTitle("另存爲..."); 
			jch.showSaveDialog(null);//應用打開文件界面設置的默認值。
			jch.setVisible(true);
			
			//得到用戶選擇保存的絕對地址
			String fileplace=jch.getSelectedFile().getAbsolutePath();
			
			//寫入文件
			FileWriter fw=null;
			BufferedWriter bw=null;
			String s=jta.getText();
			
			try {
				fw=new FileWriter(fileplace);
				bw=new BufferedWriter(fw);
				
				bw.write(s+"\r\n");
				
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}finally {
				try {
					//先關BufferedWriter,再關FileWriter,順序錯誤會拋出異常。
					bw.close();
					fw.close();
					
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
	}
}

 

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