字節流(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();
}
}
}
}
}