java 昵称1到32位字符_Raf.md · 宗科/JavaSE - Gitee.com

# RandomAccessFile #

1. RandomAccessFile读写文件数据的类

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* java.io.RandomAccessFile

* 用来读写文件数据的类,其基于指针对文件数据进行读写操作

* @author Cole

* 2018年11月28日

*/

public class RandomAccessFileDemo {

public static void main(String[] args) throws IOException {

/*

* RandomAccessFile创建有两种模式:

* r:只读模式,只读取文件,不会写入内容

* rw:读写模式.对文件可以读,也可以写

*

* 常见构造方法:

* RandomAccessFile(String path,String mode)

* RandomAccessFile(File file,String mode)

* mode:创建的模式(r,rw)

*/

/*

* 对当前目录下的raf.dat文件进行读写操作

* 对于"rw"模式创建时,若指定的文件不存在时会自动创建出来,

* 若为"r"只读模式时,若指定的文件不存在,

* 则会直接抛出异常:"java.io.FileNotFoundException: raf.dat"

*/

RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");

raf.write(97);

System.out.println("写出完毕");

raf.close();

}

}

2. ReadDemo 从文件中读取一个字节

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* 从文件中读取一个字节

* @author Cole

* 2018年11月28日

*/

public class ReadDemo {

public static void main(String[] args) throws IOException {

/*

* 从raf.dat文件中读取1个字节

*/

RandomAccessFile raf = new RandomAccessFile("raf.dat","r");

int d = raf.read();

System.out.println(d);

d = raf.read();

System.out.println(d);

raf.close();

}

}

3. CopyDemo 文件复制

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* 文件复制

* @author Cole

* 2018年11月28日

*/

public class CopyDemo {

public static void main(String[] args) throws IOException {

//创建一个RAF用于读取源文件

RandomAccessFile src = new RandomAccessFile("源文件名", "r");

//再创建一个RAF用于向复制文件中写

RandomAccessFile desc = new RandomAccessFile("新文件名", "rw");

//用于记录每次读取到的字节

int d = -1;

while((d = src.read()) != -1) {

desc.write(d);

}

System.out.println("复制完毕");

src.close();

desc.close();

}

}

3. CopyDemo2 文件复制

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* 传统的机械硬盘由于其物理特性决定这单字节读写效率差

* 但是快读写效率是可以保证的

*

* 所以我们通过提高每次读取的数据量,减少实际读写的次数

* 可以提高读写效率

* 随机读写:通常是单字节读写

* 块读写:一次读写一组字节的模式

* @author Cole

* 2018年11月28日

*/

public class CopyDemo2 {

public static void main(String[] args) throws IOException {

RandomAccessFile src = new RandomAccessFile("bee.png","r");

RandomAccessFile desc = new RandomAccessFile("bee2,png","rw");

/*

* int read(byte[] data)

* 一次性从文件中读取给定的字节数组总长度的字节量

* 并将读取的字节存入到该数组中

* 返回值为实际读取到的字节量

* 若返回值为-1,表示读取到了文件末尾,本次没有读到

*

* void write(byte[] data)

* 一次性将给定的字节数组中的所有字节写入文件

*

* void write(byte[] data, )

* 将给定字节数组从下标start处开始的连续len个字节

* 写入到文件中

*/

//10k

byte[] data = new byte[1024*10];

//每次实际读取到的字节量

int len = -1;

long start = System.currentTimeMillis();

while((len = src.read(data)) !=-1) {

desc.write(data,0,len);

}

long end = System.currentTimeMillis();

System.out.println("复制完毕!耗时:"+(end-start)+"ms");

src.close();

desc.close();

}

}

5. WriteString 写入文本数据

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* 写入文本数据

* @author Cole

* 2018年11月29日

*/

public class WriteStringDemo {

public static void main(String[] args) throws IOException {

RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");

String str = "哈哈哈~";

byte[] data = str.getBytes();

raf.write(data);

str = "一二三";

str = "一二三";

/*

* String 提供了将字符串转换为字节的方法:

* byte[] getByte()

* 按照系统默认字符集将当前的字符串转换为对应的字节

* 不推荐这种方式,以来系统默认字符集不利于与跨平台

*

* byte[] getByte(String csn)

* 按照指定的字符集转换为一组字节

* 常见字符集:

* GBK:国标编码,其中英文1字节,中文2字节

* UTF-8:Unicode 的字符集编码,其中英文1字节,中文3字节.UTF-8支持世界流行的所有文字所以也称为万国码.互联网常用字符集

* ISO08859-1:一种欧洲的编码集,不支持中文

*/

data = str.getBytes("utf-8");

}

}

6. ReadString 读取文本数据

package raf;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* 读取文本数据

* @author Cole

* 2018年11月29日

*/

public class ReadStringDemo {

public static void main(String[] args) throws IOException {

RandomAccessFile raf = new RandomAccessFile("raf.txt", "r");

//一次读取文件中的所有的字节

byte[] data = new byte[(int)raf.length()];

raf.read(data);

/*

* 字符串支持构造方法,将字节转换为字符串

* String(byte[] data)

* 按照系统默认字符集转换为字符串(不推荐)

* String(byte[] data,String csn)

* 按照指定的字符集转换为对应字符串

*/

String str = new String(data, "utf-8");

System.out.println(str);

raf.close();

}

}

7. 简易记事本工具

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.util.Scanner;

/**

* 简易记事本工具

*

* 程序启动后,要求用户输入一个文件名,然后开始对文件进行写操作

* 之后用户输入的每行字符串都写入到该文件中,当用户输入了单词"exit"时,程序退出

* @author Cole

* 2018年11月29日

*/

public class Note {

public static void main(String[] args) throws IOException {

Scanner scanner = new Scanner(System.in);

System.out.println("请输入文件名");

String name = scanner.nextLine();

RandomAccessFile note = new RandomAccessFile(name+".txt", "rw");

System.out.println("请输入文字");

while(true) {

String string = scanner.nextLine();

if ("exit".equals(string)) {

break;

}

byte[] data = string.getBytes("gbk");

note.write(data);

}

System.out.println("关闭");

note.close();

}

}

8. RandomAccessFileDemo2写基本数据类型

package raf;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* 读写基本类型数据,以及RAF如何基于指针进行读写操作

* @author Cole

* 2018年11月29日

*/

public class RandomAccessFileDemo2 {

public static void main(String[] args) throws IOException {

RandomAccessFile raf = new RandomAccessFile("raf.dat", "rw");

//向文件中写入一个int最大值

int max = Integer.MAX_VALUE;

/*

* 01111111 11111111 11111111 11111111

* max>>>24

* 00000000 00000000 00000000 01111111

* write 默认读1个字节

*/

//raf.write(max>>>24);

//raf.write(max>>>16);

//raf.write(max>>>8);

//raf.write(max);

/*

* void writeInt(int d)

* 一次性写入4字节,将给定的int值写出

*/

raf.writeInt(max);

/*

* 对应的基本数据类型都提供了写操作

*/

raf.writeDouble(123.123);

raf.writeLong(123L);

System.out.println("写入完毕");

raf.close();

}

}

10. 完成用户注册功能

package raf;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.util.Arrays;

import java.util.Scanner;

/**

* 完成用户注册功能

* 要求用户输入注册信息包括:用户名,密码,昵称,年龄

* 其中前三个为字符串,年龄为int值

* 每个用户信息都写入到user.dat文件中保存

*

* 设计

* 每条记录占用固定的100字节

* 其中:用户名,密码.昵称各占32字节,年龄4字节

*

* 字符串故意留白有利于后期修改数据,并且格式固定,长度固定,

* 读取效率高但是会有部分空间上的浪费

* @author Cole

* 2018年11月29日

*/

public class RegDemo {

public static void main(String[] args) throws IOException {

Scanner scanner = new Scanner(System.in);

System.out.println("欢迎注册!");

System.out.println("请输入用户名:");

String username = scanner.nextLine();

System.out.println("请输入密码:");

String password = scanner.nextLine();

System.out.println("请输入昵称:");

String nickname = scanner.nextLine();

System.out.println("请输入年龄:");

int age = Integer.parseInt(scanner.nextLine());

RandomAccessFile raf = new RandomAccessFile("user.dat", "rw");

//先将指针移到末尾处

raf.seek(raf.length());

//写用户名

//1.将用户名转换为一组字节

byte[] data = username.getBytes("UTF-8");

//2.将数组扩容到32字节

data = Arrays.copyOf(data, 32);

//将32字节写入文件

raf.write(data);

//写密码

data = password.getBytes("UTF-8");

data = Arrays.copyOf(data, 32);

raf.write(data);

//写昵称

data = nickname.getBytes("UTF-8");

data = Arrays.copyOf(data, 32);

raf.write(data);

//写年龄

raf.writeInt(age);

//获取当前指针位置

System.out.println("pos:"+raf.getFilePointer());

System.out.println("注册完毕");

raf.close();

}

}

11. 读出用户信息

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

/**

* 将user.dat中每个用户信息读出,并输出到控制台

* @author Cole

* 2018年11月29日

*/

public class ShowAllUserDemo {

public static void main(String[] args) throws IOException {

RandomAccessFile raf = new RandomAccessFile("user.dat", "r");

for (int i = 0; i < raf.length()/100; i++) {

//读取用户名

//1读取32字节

byte[] data = new byte[32];

raf.read(data);

//2.将其还原为字符串

String username = new String(data, "UTF-8").trim();

//读取密码

raf.read(data);

String password = new String(data,"UTF-8").trim();

//读取昵称

raf.read(data);

String nickname = new String(data,"UTF-8").trim();

//读取年龄

int age = raf.readInt();

System.out.println(username+","+password+","+nickname+","+age);

}

raf.close();

}

}

11. 修改用户信息

package raf;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.util.Arrays;

import java.util.Scanner;

/**

* 修改昵称

* 程序启动后,要求用户输入用户名及新的昵称,然后对user.dat文件中

* 该用户的昵称进行修改,如文件中没有此用户则提示:

* 没有此用户

* 实现思路:

* 循环读取user.dat文件中的每条记录中的用户名,然后与用户输入的

* 用户名进行比较,若不是则进行下一次循环,若是该用户则将指针移动到

* 该条记录的昵称位置,然后重写将新的昵称以32位字节形式写入以覆盖原昵称

* 完成修改操作.

* 若循环完毕后仍然没有匹配到用户,则最终提示:没有此用户

* @author Cole

* 2018年11月29日

*/

public class UpdateDemo {

public static void main(String[] args) throws IOException {

Scanner scanner = new Scanner(System.in);

System.out.println("请输入用户名:");

String username = scanner.nextLine();

System.out.println("请输入新昵称:");

String newNickname = scanner.nextLine();

RandomAccessFile raf = new RandomAccessFile("user.dat", "rw");

//表示是否修改了数据

boolean updata = false;

for (int i = 0; i < raf.length()/100; i++) {

raf.seek(100*i);

//读取用户名

byte[] data = new byte[32];

raf.read(data);

String name = new String(data, "UTF-8").trim();

if (name.equals(username)) {

//找到了,将指针移动到昵称的位置

raf.seek(100*i+64);

data = newNickname.getBytes("UTF-8");

data = Arrays.copyOf(data, 32);

raf.write(data);

//修改成功

updata = true;

break;

}

}

if (updata) {

System.out.println("修改成功");

}else {

System.out.println("没有此用户");

}

raf.close();

}

}

## [返回SE](./SE.html)    [返回主页](./index.html) ##

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值