//以下方法均使用了两种方法完成,第二种增加伪异常处理
- 从磁盘上读取一个文本文件(如某个java源代码),分别统计出文件中英文字母、空格、数字字符的个数。(注意文本文件中的数字指的是数字字符!!!)
方法一
package com.homework.homework0730;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @Author jinman1012@qq.com 2020/7/30 19:41
* @Version 1.0
* 读取文本文件,并统计文本中字母、空格、数字字符的个数
*/
public class Problem1 {
public static void main(String[] args) throws IOException {
String path = "D:\\test\\km.txt";
InputStream in = new FileInputStream(path);
//分别标识字母、空格、数字字符的个数
int wordNum = 0, spaceNum = 0, nums = 0;
int len;
while ((len = in.read()) != -1) {
// System.out.println(len);
//in.read()返回每个字节对应ASCII编码
//字母编码表中对应的范围
if ((len > 96 && len < 123) || (len > 64 && len < 91)) wordNum++;
//数字编码表中对应的范围
if (len > 47 && len < 58) nums++;
//空格编码表中对应的值
if (len == 32) spaceNum++;
}
in.close();
System.out.println("字母:" + wordNum + " " + "空格:" + spaceNum + " " + "数字:" + nums);
}
}
方法二
package com.homework.homework0730;
import java.io.FileReader;
import java.io.IOException;
/**
* @Author jinman1012@qq.com 2020/7/30 20:47
* @Version 1.0
* String path = "D:\\test\\km.txt";
* InputStream in = new FileInputStream(path);
*/
public class Problem1Another {
public static void main(String[] args) {
//统计数字字符的个数
int digitNum = 0;
//统计英文字符的个数
int charNum = 0;
//统计空格字符的个数
int spaceNum = 0;
String path = "D:\\test\\km.txt";
FileReader fileReader = null;
try{
fileReader = new FileReader(path);
char[] buffer = new char[1024];
int len;
while ((len = fileReader.read(buffer)) != -1) {
for (int i = 0; i < len; i++) {
if (buffer[i] >= 'a' && buffer[i] <= 'z' || buffer[i] >= 'A' && buffer[i] <= 'Z') charNum++;
if ((buffer[i] >= '0') && (buffer[i] <= '9'))digitNum++;
if (buffer[i] == ' ') spaceNum++;
}
}
System.out.println("英文字符有: " + charNum + "个");
System.out.println("数字字符有: " + digitNum + "个");
System.out.println("空格字符有: " + spaceNum + "个");
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 在一个磁盘的文件里保存26个英文小写字母(乱序),将他们读入内存中,进行排序,把排好顺序的数再重新追加写到磁盘的该文件中。
方法一
package com.homework.homework0730;
import java.io.*;
/**
* @Author jinman1012@qq.com 2020/7/30 19:41
* @Version 1.0
*/
public class Problem2 {
public static void main(String[] args) throws IOException {
String path = "D:\\test\\kmwords.txt";
InputStream in = new FileInputStream(path);
OutputStream out = new FileOutputStream(path, true);
//因为ascii码表中,小写字母对应的十进制编号为97-122,又因为要使用的是计数法,所以要申请个大小为123的数组
//122的数组范围为0-121,计数法无法保存122'z'字母
int[] wordAsciiNum = new int[123];
//使用计数法 定义一个数组用来保存26个小写字母
//经典文件输出写法
int len;
while((len = in.read()) != -1) {
char word = (char)len;
System.out.println(word);
wordAsciiNum[len] = 1;
}
//判断数组value值是否为1 从小到大按顺序输出数组并写入对应文件后面即可
for (int i = 0; i < wordAsciiNum.length; i++) {
if(wordAsciiNum[i] == 1) {
out.write(i);
}
}
//关闭流
in.close();
out.close();
}
}
方法二
package com.homework.homework0730;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
/**
* @Author jinman1012@qq.com 2020/7/30 20:47
* @Version 1.0
*/
public class Problem2Another {
public static void main(String[] args) {
FileWriter fileWriter = null;
FileReader fileReader = null;
String path = "D:\\test\\kmwords.txt";
try {
fileReader = new FileReader(path);
char[] letters = new char[26];
fileReader.read(letters);
//sort方法进行数组排序
Arrays.sort(letters);
fileWriter = new FileWriter(path,true);
//写入换行
fileWriter.write('\n');
fileWriter.write(letters);
fileReader.close();
fileWriter.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}