JavaSEDemo30IO流

简介

  • 本文是2021/04/28整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进

练习

练习1

题目:
请编写一个函数,2 个参数,1 个字符串,1 个整型数,返回截取的字符串,
要求字符串中的中文不能出现乱码:
如 输入(“我ABC汉DEF”,6)应该输出为“我ABC”而不是“我ABC+汉的半个”。
解题思路:
方法(字符串,字节数) 返回截取的字符串,要求中文不乱码
方法的处理逻辑:

  1. 字符串.getBytes(“UTF-8”)返回byte[]数组
  2. 设置存储中文3个字节,每一个字节<0
  3. 设置存储中文数量变量hz=0
  4. 对字节数循环遍历byte[]数组,对于循环的每一项<0 hz++;
  5. hz%3,结果
    1.0 实际截取的长度 = 字节数
    2.1 实际截取的长度 = 字节数 - 1
    3.2 实际截取的长度 = 字节数 - 2
  6. 返回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集合 内部比较器 外部比较器

  1. 创建文本文件
  2. 通过java读取文本并把文本中的每一行后面的三个成绩相加
    1. 使用文件输入流读取文本文件
    2. 读取文件的内容放入字符串
    3. 根据\r\n拆分一行一行的数据
      1. 对于每一行使用#拆分
      2. 向set集合添加person对象
    4. 设计Person类:name score
    5. 创建文件输出流对象
    6. 从小到大的顺序输出到另一个文本文件中
@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

  1. 需要将大视频文件根据线程数进行分割
  2. 记录每份的起始位置,为合并文件做准备
  3. 每个线程复制其中一份(起始位置与线程绑定)
  4. 下载完毕之后要进行合并(合并之前判断是否复制完毕)

字符流分类

Reader

FileReader
BufferedReader readLine()
PushBackReader

Writer

FileWriter
BufferedWriter
PrintWriter println

序列化

ObjectOutputStream writeObject(obj)
ObjectInputStream readObject()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值