使用RandomAccessFile实现用户注册

package JAVA_API.num11_RandomAccessFile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Scanner;

/**
 * 完成用户注册:
 * 程序启动后要求用户顺序输入:用户名,密码,昵称和年龄
 * 然后将该用户信息写入文件user.txt 中保存
 *
 * 设计格式:
 * 每条记录固定占用100字节,其中用户名、密码、昵称各占32字节,
 * 年龄固定占4字节
 * 设计意图:
 * 对于字符串而言,故意留白时为了方便后期修改信息时添加字符,不会影响其他数据。而且长度固定有利于指针的移动操作
 * @author yyc
 * 2021/9/14 14:03
 */
public class Test6_Regist {
    public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(System.in);
        System.out.println("欢迎注册!");
        System.out.println("请输入用户名:");
        String username = scan.nextLine();
        System.out.println("请输入密码:");
        String password = scan.nextLine();
        System.out.println("请输入昵称:");
        String nickname = scan.nextLine();
        System.out.println("请输入年龄:");
        int age = scan.nextInt();

        //将控制台输入的信息写出到.txt文件
        RandomAccessFile raf = new RandomAccessFile("user.txt","rw");
        /*
         * 为了避免后面注册的用户信息覆盖之前用户的信息。在写入之前先将指针移动到文件末尾
         * */
        raf.seek(raf.length());
        //开始写数据
        /*
         * byte[] getBytes(),将字符串按照系统默认的编码集转换为byte[]数组.(编码集和字符集一个意思)
         * byte[] getBytes(String charsetName),将字符串按照指定的字符集转化为byte[]数组
         * */
        //写入用户名:
        //getBytes()使用默认的编码,想要指定编码格式,使用重载方法getBytes(String charsetName)
        byte[] data = username.getBytes("UTF-8");
        //System.out.println(Arrays.toString(data));//byte[] data = username.getBytes(),[115, 97, 116, 106]
        //将数组扩容至32字节,浅层复制,更换引用的指向
        data = Arrays.copyOf(data,32);
        raf.write(data);//写入32字节
        //写入密码,先将密码转成byte数组,
        data = password.getBytes("UTF-8");
        data = Arrays.copyOf(data,32);
        raf.write(data);
        //写入昵称
        data= password.getBytes("UTF-8");
        data = Arrays.copyOf(data,32);
        raf.write(data);
        System.out.println("注册完毕!");
        //写入年龄
        raf.writeInt(age);//writeInt(int a)//固定写入4字节
        //关流
        raf.close();
    }
}

/*完成修改昵称的功能:
 *程序启动后,要求用户输入用户名和新昵称
 * 然后修改user.txt文件中的该用户的昵称
 * 如果输入的用户不存在,则输出”查无此人“
 * */
 public class Test2_HW {
    public static void main(String[] args) throws IOException {
        //请输入用户名
        String name = new Scanner(System.in).nextLine();
        RandomAccessFile raf = new RandomAccessFile("user.txt","r");
        boolean flag = false;
        for (int i = 0; i < raf.length();i++){
            //先挪指针的位置
            raf.seek(i*100);
            //指定读入(从文件读到程序)的字节长度
            byte[] data = new byte[32];
            raf.read(data);
//将字节数组转换为字符串直接使用构造方法String(byte[] b, String charSetName);
            String username = new String(data,"UTF-8");

            if (username.equals(name)){
                //请输入新昵称
                String nick = new Scanner(System.in).nextLine();
                //将字符串转变为字节数组,指定字符集
                data = nick.getBytes("UTF-8");
                data = Arrays.copyOf(data,32);
//设置开始写入的位置,因为指针位置是64字节开始是昵称
                raf.seek(i*100+64);
                raf.write(data);
                flag = true;
                break;
            }
        }`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RandomAccessFile实现断点续传的原理是利用RandomAccessFile的seek()方法来设置文件记录指针的位置,从而实现定位到文件的特定位置进行读写操作。断点续传的过程可以分为以下几个步骤: 1. 首先,获取已下载部分的文件大小,可以通过调用RandomAccessFile对象的length()方法来获取文件的总大小。 2. 创建一个RandomAccessFile对象,并通过调用其构造方法传入文件路径和打开模式("rw"),即读写模式。 3. 调用RandomAccessFile对象的seek()方法,将文件记录指针定位到已下载部分的末尾位置。 4. 发起网络请求,从已下载部分的末尾位置开始继续下载文件的剩余部分。 5. 将网络请求返回的数据写入RandomAccessFile对象中,即实现文件的断点续传。 通过以上步骤,RandomAccessFile可以实现在已下载部分的基础上继续下载文件的剩余部分,从而达到断点续传的效果。这样可以避免重新下载整个文件,提高下载效率,并节省带宽和时间。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [RandomAccessFile实现断点续传](https://blog.csdn.net/DT235201314/article/details/80911932)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [如何实现大文件断点续传、秒传](https://blog.csdn.net/qq_34272760/article/details/129406494)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值