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流实现文件的拷贝。请理解并熟练掌握基本字节和字符流的区别和用法。

实验代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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类型实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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://fulequn.github.io/2020/08/Article202008227/
作者
Fulequn
发布于
2020年8月22日
许可协议