Java输入与输出

【实验目的与要求】

1、掌握常用字节输入输出流的用法;

2、掌握常用字符输入输出流的用法;

3、掌握File类的用法。

【实验内容】

\1. 请编写一个程序,使用FileInputStream与FileOutputStream流实现文件的拷贝,具体要求如下:

a) 将当前程序源文件(MyIoExc.java)的内容拷贝到E:\shiyan3路径下的文件名为mycopy.txt的文件中(拷贝文件中所有的内容);拷贝完成,在命令行窗口中提示拷贝成功;

b) 读取mycopy.txt文件,并在命令行窗口中显示文件的全部内容。

提示:1)对于不存在的路径可使用File类型先创建好;2)接收的数组可构造String文件不确定源文件中数据多少时可使用循环读取数据;如何判断文件中是否还有数据(read方法的返回值-1)。

\2. 请基于内容1的程序做修改,使用FileReader与FileWriter流实现文件的拷贝。请理解并熟练掌握基本字节和字符流的区别和用法。

实验代码:

package javatest3;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;

/**
 * 
 * @author cust
 *	拷贝云文件到mycopy.txt中
 */
public class Copy {

	public static void main(String[] args) {
		File fl1 = new File("E:\\课程\\Java\\下学期实验课\\实验三\\javatest3\\src\\javatest3\\Copy.java");
		//要拷贝的文件
		File fl2 = new File("D:\\shiyan3\\mycopy.txt");
		//拷贝文件
		File path;		//记录文件路径
		//判断文件的路径是否存在,不存在就创建路径
		if(!(path = new File(fl2.getParent())).exists()){		
			path.mkdirs();
		}else{
			if(!fl2.exists()){		//文件不存在就创建文件
				try {
					fl2.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			//System.out.println(path);
			copy(fl1, fl2);		//执行拷贝函数
		}
		FileInputStream input;
		try {
			input = new FileInputStream(fl2);
			byte[] buf = new byte[1024];    	//用于接受读入的二进制数据 
		    int bytesRead;     		//读入长度
		    while ((bytesRead = input.read(buf)) > 0) { 		//仍有数据读入
		    	//如果read返回-1,则文件中无数据了
		    	String str = new String(buf, 0, bytesRead);
		    	//如果未读入完,那么就不能构建出str,也就不能输出,所以我们需要指定长度
		    	System.out.println(str);
		    } 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 		//读入流

	}
	
	/**
	 * 
	 * @param oldfile	要拷贝的文件
	 * @param newfile	拷贝到的文件
	 * 通过InputStream,OutputStream等字节流或者FileReader、FileWriter等字符流来实现拷贝。
	 * 循环遍历oldfile文件的内容,拷贝到newfile文件中。
	 */
	public static void copy(File oldfile, File newfile){
		InputStream input = null;   
		OutputStream output = null;   
		try{ 
		    input = new FileInputStream(oldfile); 		//读入流
		    output = new FileOutputStream(newfile);     //写入流
		    byte[] buf = new byte[1024];    	//用于接受读入的二进制数据 
		    int bytesRead;     		//读入长度
		    while ((bytesRead = input.read(buf)) > 0) { 		//仍有数据读入
		    	//如果read返回-1,则文件中无数据了
		    	output.write(buf, 0, bytesRead); 		//写入文件
		    } 
		    System.out.println("拷贝成功");		//输出提示信息
		    input.close(); 
		    output.close(); 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
//		try {
//			FileReader fr = new FileReader(oldfile);
//			FileWriter fw = new FileWriter(newfile);
//			char[] chs = new char[512];
//		    int charsRead;     		//读入长度
//		    while ((charsRead = fr.read(chs)) > 0) { 		//仍有数据读入
//		    	fw.write(chs, 0, charsRead); 		//写入文件
//		    } 
//		    fr.close();
//		    fw.close();
//			
//		} catch (Exception e) {
//			e.printStackTrace();
//		} 
		
	}
	
}
/**
 * 1.mkdirs()和 mkdir()的对象都是路径,不是文件,时刻牢记。
 * 2.通过exists()函数判断是否存在
 * 
 */

\3. 现有一个文件english.txt,请使用缓冲流(BufferedReader、BufferedWriter)完成本程序,具体要求如下:读取文件中的内容,统计其中每一行单词的个数,并同时将每一行的单词个数及每个单词写到另一个文件中。

例如:“第1行共5个单词,分别为:The,arrow,missed,the,target;”

提示:字符串分割可使用split方法(正则表达式中,空格类字符、英文输入法下符号的元字符为:”\s”、”\p{Punct}”)、StringTokenizer或者Scanner类型实现。

package javatest3;

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 CountWord {

	public static void main(String[] args) {
		File english = new File("C:\\Users\\cust\\workspace\\javatest3\\src\\english.txt");
		File count = new File("D:\\shiyan3\\count.txt");
		File path;		//记录文件路径
		if(!(path = new File(count.getParent())).exists()){		
			path.mkdirs();
		}else{
			if(!count.exists()){		//文件不存在就创建文件
				try {
					count.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			//System.out.println(path);
			countWords(english, count);
		}		
	}
	
	/**
	 * 
	 * @param file		原英文文档
	 * @param newfile		记录英文文档个数的文件
	 * 将原英文文档每行的单词个数以及这些单词,写入另一个文件中。
	 * 通过BufferedReader、BufferedWriter实现
	 */
	public static void countWords(File file, File newfile){
		try {
			//文件读入
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);
			FileWriter fw = new FileWriter(newfile);
			BufferedWriter bw = new BufferedWriter(fw);
			//这里如果写上第二个参数就是追加模式,不会清空原文档
			String str;
			int count = 0;
			int row = 1;
		    while ((str = br.readLine()) != null) { 		//仍有数据读入
		    	String[] s = str.split("[^a-zA-Z]");
		    	String info = null ;
		    	//如果未读入完,那么就不能构建出str,也就不能输出,所以我们需要指定长度
		    	for(int i = 0; i< s.length; i++){
		    		if(s[i] != ""){
		    			count++;		
		    		}
		    	}
		    	info="第"+row+"行有"+count+"个单词,分别是:";
		    	for(int i = 0; i< s.length; i++){
		    		if(s[i] != ""){
		    			info += s[i]+" ";		
		    		}
		    	}
		    	System.out.println(info);
		    	//info += "\r\n";		//换行
		    	bw.write(info);
		    	bw.newLine();		//BufferedWriter对象中可以通过newLine()进行换行
		    	row++;
		    	count = 0;
		    } 
		    br.close();
			fr.close();
			bw.close();
			fw.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

Java输入与输出
https://blog.fulequn.online/2020/08/Article202008227/
作者
Fulequn
发布于
2020年8月22日
许可协议