简介
- 本文是2021/04/28整理的笔记
- 赘述可能有点多,还请各位朋友耐心阅读
- 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进
练习
练习1
题目:
请编写一个函数,2 个参数,1 个字符串,1 个整型数,返回截取的字符串,
要求字符串中的中文不能出现乱码:
如 输入(“我ABC汉DEF”,6)应该输出为“我ABC”而不是“我ABC+汉的半个”。
解题思路:
方法(字符串,字节数) 返回截取的字符串,要求中文不乱码
方法的处理逻辑:
- 字符串.getBytes(“UTF-8”)返回byte[]数组
- 设置存储中文3个字节,每一个字节<0
- 设置存储中文数量变量hz=0
- 对字节数循环遍历byte[]数组,对于循环的每一项<0 hz++;
- hz%3,结果
1.0 实际截取的长度 = 字节数
2.1 实际截取的长度 = 字节数 - 1
3.2 实际截取的长度 = 字节数 - 2 - 返回new String(byte[],off,len,“UTF-8”)
import java.io.UnsupportedEncodingException;
public class Demo01 {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "我ABC汉DEF";
System.out.println(method(str, 6));//我ABC
System.out.println(method(str, 7));//我ABC
System.out.println(method(str, 8));//我ABC
System.out.println(method(str, 9));//我ABC汉
}
/**
*
* @param str 源字符串
* @param n 截取的字节数
* @return 截取后的字符串
*/
public static String method(String str,int n) throws UnsupportedEncodingException {
//1.字符串.getBytes("UTF-8")返回byte[]数组
byte[] bytes = str.getBytes("UTF-8");
//2.对于中文3个字节,每一个字节<0
//设置存储中文数量变量hz=0
int hz = 0;
//4.对字节数循环遍历byte[]数组,对于循环的每一项<0 hz++;
for (int i = 0; i < n; i++) {
if(bytes[i]<0){
hz ++ ;
}
}
//5.hz%3 结果
int i = hz % 3;
//真正截取的字节数
int temp = 0;
//代表汉字是全字
if(i == 0){
temp = n;
//代表汉字多了一个字节
}else if(i == 1){
temp = n - 1;
//代表汉字多了两个字节
}else if(i == 2) {
temp = n - 2;
}
return new String(bytes,0,temp,"UTF-8");
}
}
程序运行结果
我ABC
我ABC
我ABC
我ABC汉
练习2
题目
如在E盘下有一个Test.txt文本文件内容是
#刘德华#89#77#60
#张信哲#76#97#70
#周杰伦#89#88#90
#随便啦#87#70#80
要求通过java读取文本并把文本中的每一行后面的三个成绩相加,
最后按从大到小的顺序输出到另一个文本文件中.
输出后的文本文件内容应为:
#周杰伦#267
#张信哲#243
#随便啦#237
#刘德华#226
解题思路:
总和:文件 io流 面向对象 TreeSet集合 内部比较器 外部比较器
- 创建文本文件
- 通过java读取文本并把文本中的每一行后面的三个成绩相加
- 使用文件输入流读取文本文件
- 读取文件的内容放入字符串
- 根据\r\n拆分一行一行的数据
- 对于每一行使用#拆分
- 向set集合添加person对象
- 设计Person类:name score
- 创建文件输出流对象
- 从小到大的顺序输出到另一个文本文件中
@Test
public void test() throws IOException {
//使用文件输入流读取文本文件
FileInputStream fileInputStream = new FileInputStream("Test.txt");
//读取文件的内容放入字符串
StringBuffer buffer = new StringBuffer();
byte[] bytes = new byte[1024];
int len;
while((len = fileInputStream.read(bytes))!= -1){
//把读取的内容放入buffer中
buffer.append(new String(bytes,0,len));
}
String s = buffer.toString();
//根据\r\n拆分一行一行的数据
String[] split = s.split("\r\n");
TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o2.getScore() - o1.getScore();
}
});
for (String s1 : split) {
//对于每一行使用#拆分
String[] strings = s1.split("#");
//向set集合添加Person对象
set.add(new Person(strings[1],Integer.parseInt(strings[2])+Integer.parseInt(strings[3])+Integer.parseInt(strings[4])));
}
FileOutputStream fileOutputStream = new FileOutputStream("b.txt");
//从大到小的顺序输出到另一个文本文件中
for (Person person : set) {
fileOutputStream.write(("#"+person.getName()+"#"+person.getScore()+"\r\n").getBytes());
}
//关闭
fileOutputStream.close();
fileInputStream.close();
}
练习3
使用多线程实现复制大视频文件,线程 RandomAccessFile
- 需要将大视频文件根据线程数进行分割
- 记录每份的起始位置,为合并文件做准备
- 每个线程复制其中一份(起始位置与线程绑定)
- 下载完毕之后要进行合并(合并之前判断是否复制完毕)
字符流分类
Reader
FileReader
BufferedReader readLine()
PushBackReader
Writer
FileWriter
BufferedWriter
PrintWriter println
序列化
ObjectOutputStream writeObject(obj)
ObjectInputStream readObject()