JAVA第20天 File文件(三)

IO流练习

  • 复制文本不再重复,前两篇博客中已经实现了很多方法。

  • 复制图片:“D:\develop\pic\wangzai.jpg” 复制到 "D:\develop\picCopy\wangzai.jpg"

// 由于是复制图片,所以选用字节流输入输出
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDemo {
	public static void main(String[] args) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\develop\\pic\\wangzai.jpg"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\develop\\picCopy\\wangzai.jpg"));
		
		byte[] cbuf = new byte[1024];
		int len = 0;
		while((len = bis.read(cbuf)) != -1){
			bos.write(cbuf, 0, len);
			bos.flush();
		}
		
		bis.close();
		bos.close();
	}
}	
  • 复制单极文件夹:“D:\develop\pic” 复制到 "D:\develop\picCopy"
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDemo {
	public static void main(String[] args) throws IOException{
		File file = new File("D:\\develop\\pic");
		File newFile = new File("D:\\develop\\picCopy");
		newFile.mkdir();
		File[] fileList = file.listFiles();
		for(File f : fileList){
			copy(new File(file, f.getName()), new File(newFile, f.getName()));
		}
	}
	
	public static void copy(File srcAddr, File destAddr) throws IOException{
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcAddr));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destAddr));
		
		byte[] cbuf = new byte[1024];
		int len = 0;
		while((len = bis.read(cbuf)) != -1){
			bos.write(cbuf, 0, len);
			bos.flush();
		}
		
		bis.close();
		bos.close();
	}
}
  • 复制多极文件夹:“E:\DW” 复制到 "E:\DWTmp"
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDemo {
	public static void main(String[] args) throws IOException{
		File file = new File("E:\\DW");
		File newFile = new File("E:\\DWTmp");
		copyDirectory(file, newFile);
	}
	
	public static void copyDirectory(File srcAddr, File destAddr) throws IOException{
		destAddr.mkdir();
		File[] fileList = srcAddr.listFiles();
		for(File f : fileList){
			if(!f.isDirectory()){		// 如果是文件,则拷贝文件
				copy(new File(srcAddr, f.getName()), new File(destAddr, f.getName()));
			}
			else{		// 如果是文件夹,递归复制文件夹
				copyDirectory(new File(srcAddr, f.getName()), new File(destAddr, f.getName()));
			}
		}
	}
	
	public static void copy(File srcAddr, File destAddr) throws IOException{
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcAddr));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destAddr));
		
		byte[] cbuf = new byte[1024];
		int len = 0;
		while((len = bis.read(cbuf)) != -1){
			bos.write(cbuf, 0, len);
		}
		
		bis.close();
		bos.close();
		
	}
}
  • 用Reader模拟BufferedReader的readLine()功能
  • 同时实现LineNumberReader的特有功能:获取每次读取数据的行号
// MyBufferedReader.java
// 实现readline()功能
import java.io.IOException;
import java.io.Reader;

public class MyBufferedReader {
	private Reader r;			
	public MyBufferedReader(Reader r){
		this.r = r;
	}
	
	public String readLine() throws IOException{
		StringBuilder sb = new StringBuilder();
		int ch;
		while((ch = r.read()) != -1){
			if(ch == '\r')
				continue;
			else if(ch == '\n')		// 遇到\n表示一行读取结束
				break;
			else {
				sb.append((char)ch);
			}
		}
		if(sb.length() > 0)			// 字符串缓冲区大小>0,返回字符串
			return sb.toString();
		return null;
	}
}
// MyLineNumberReader.java
// 继承MyBufferedReader类,实现setLineNumber()和getLineNumber()功能
import java.io.IOException;
import java.io.Reader;

public class MyLineNumberReader extends MyBufferedReader{
	private MyBufferedReader mbr;
	private int lineNumber;
	public MyLineNumberReader(Reader r){
		super(r);
	}
	
	public void setLineNumber(int num){
		this.lineNumber = num;
	}
	
	public int getLineNumber(){
		return this.lineNumber;
	}
	
	public String readLine() throws IOException{
		this.lineNumber++;
		return(super.readLine());		// 调用父类的readLine()功能
	}
}
// Test.java
// 测试功能类,main函数
import java.io.FileReader;
import java.io.IOException;

public class Test{
	public static void main(String[] args) throws IOException{
		MyLineNumberReader mlnr = new MyLineNumberReader(new FileReader("E:\\词频分析\\text.txt"));
		String line = mlnr.readLine();
		System.out.println(mlnr.getLineNumber() + ": " + line);
	}
}
  • 登录注册IO版
// User.java
// 用户信息类,包含用户名、密码等信息
public class User {
	// 用户名
	private String username;
	// 密码
	private String password;
	
	public User() {
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
}
// UserDao.java
// 用户登录功能接口,包括注册和登录
public interface UserDao {
	public abstract boolean log(String username, String password);
	public abstract void regist(User user);
}
// UserDaoImpl.java
//  用户登录功能实现类
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class UserDaoImpl implements UserDao{
	//	IO形式
	private static File file = new File("user.txt");
	static{
		try {
			file.createNewFile();
		} catch (IOException e) {
			System.out.println("创建文件失败!");
		}
	}
	@Override
	// 登录时需注意可能账号文件不存在,会发生FileNotFoundException
	public boolean log(String username, String password) {
		boolean flag = false;
		BufferedReader br = null;
		try{
			br = new BufferedReader(new FileReader(file));
			String line = null;
			while((line = br.readLine()) != null){
				String[] string = line.split("=");
				if(string[0].equals(username) && string[1].equals(password)){
					flag = true;
					break;
				}
			}
		}catch(FileNotFoundException e){
			System.out.println("找不到信息所在文件!");
		}catch(IOException e){
			System.out.println("用户登录失败!");
		}finally{
			if(br != null){
				try {
					br.close();
				} catch (IOException e) {
					System.out.println("用户登录释放资源失败!");
				}
			}
		}
		return flag;
	}
	@Override
	public void regist(User user) {
		BufferedWriter bw = null;
		try{
			bw = new BufferedWriter(new FileWriter(file));
			bw.write(user.getUsername() + "=" + user.getPassword());
		}catch(IOException e){
			System.out.println("用户注册失败!");
		}finally{
			if(bw != null){
				try {
					bw.close();
				} catch (IOException e) {
					System.out.println("用户注册释放资源失败!");
				}
			}
		}
	}
	
}

欢迎转载,表明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值