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

猜你喜欢

转载自blog.csdn.net/xieminyao123/article/details/82113948