JavaSE01_Day03(下)-记事本案例、RAF文件指针操作
对于同学们的疑惑总结:
1.对于Java计算机专家制定的标准不要质疑。
2.上课的时候不好意思说哪里不懂,下课的时候进行提问,这样不太好,最好课上把问题都解决了,省得课下再抽时间。
3.针对于自己不理解的内容,包老师反复讲解的内容,一定要摒弃掉自己当前不正确的思维路线,学习包老师正确的思路。
4.预习非常重要,希望大家睡觉前用手机听听课(听声音都可以)
一、记事本案例
业务需求:
简单的记事本案例
-
程序启动在控制台输入一个文件名
-
针对这个文件进行读写操作
-
使用循环让用户向记事本中写入字符串
-
编码格式选择自己工具中使用的编码(不需要和我一致,和自己软件的编码方式一样)
-
不考虑换行问题,当用户在控制台中输入”exit“表示结束
代码:
package cn.tedu;
import java.io.RandomAccessFile;
import java.util.Scanner;
/**
* 简单的记事本案例
*1.程序启动在控制台输入一个文件名
*2.针对这个文件进行读写操作
*3.使用循环让用户向记事本中写入字符串
*4.编码格式选择自己工具中使用的编码(不需要和我一致)
*5.不考虑换行问题,当用户在控制台中输入”exit“表示结束
* @author cjn
*
*/
public class RAF_Note {
public static void main(String[] args) throws Exception {
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个文件名称:");
String fileName = scan.nextLine();
//对文件进行读写操作
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
System.out.println("请输入内容,单独输入exit退出:");
//支持用户多次输入记录的内容
while (true) {
//接收用户输入信息
String message = scan.nextLine();
//加一个终止判断,并且防止把终止的信息也写到文件中
if ("exit".equalsIgnoreCase(message)) {
//结束循环,不让用户继续在文件中写内容
break;
}
//字符串转换为字节数组,此处注意字符集的编码格式,与自己的软件一致,否则乱码
byte[] data = message.getBytes("utf-8");
//向文件中写出数据
raf.write(data);
}
System.out.println("写出完毕!");
//关闭资源
//Scanner底层是流(public Scanner(InputStream source)
//public final static InputStream in = null;
//用完需要关闭资源
scan.close();
raf.close();
}
}
控制台内容:
请输入一个文件名称:
notebook.txt
请输入内容,单独输入exit退出:
2021.06.17 星期四
今天上课要认真听讲哦!
多练代码,
加深理解!
exit
写出完毕!
notebook.txt输出结果:
2021.06.17 星期四今天上课要认真听讲哦!多练代码,加深理解!
二、RAF文件指针操作(了解)
2.1 API方法
(1)getFilePointer()方法:RandomAccessFile的读写操作都是基于指针的,提供了一个可以获取当前指针位置的方法,可以在指针当前所指向的位置进行读写操作。 RandomAccessFile在创建时默认指向文件开始(第一个字节),通过getFilePointer方法获取指针位置时值是"0"。此处可以当做数组下标理解,但是含义不一样。
long getFilePointer()
(2)seek()方法 :RandomAccessFile的提供了一个方法用于移动指针位置,使用该方法可以移动指针到指定位置。
void seek(long pos)
2.2 RAF文件指针操作案例
package cn.tedu;
import java.io.RandomAccessFile;
/**
* 使用RAF基于指针的方式进行对基本类型数据进行读写操作
* @author cjn
*
*/
public class RandomAccessFileDemo {
public static void main(String[] args) throws Exception {
//对指定文件pointer.txt进行读写操作
RandomAccessFile raf = new RandomAccessFile("pointer.txt","rw");
System.out.println("当前指针位置:"+raf.getFilePointer());//0
//向pointer.txt文件中写出整数的最大值
int imax = Integer.MAX_VALUE;
/*由于write只能每次写入一个字节,即只能写入所读数据的低八位,要读取整个数据,需要指针移位
* vvvvvvvv
* 01111111 11111111 11111111 11111111 整数的最大值
* --->
* 00000000 00000000 00000000 01111111 右移动24位
* 00000000 00000000 01111111 11111111 右移动16位
* 00000000 01111111 11111111 11111111 右移动8位
* 01111111 11111111 11111111 11111111 右移动0位,低八位
*/
//>>>表示右移运算符
raf.write(imax>>>24);
System.out.println("当前指针位置:"+raf.getFilePointer());//1
raf.write(imax>>>16);
System.out.println("当前指针位置:"+raf.getFilePointer());//2
raf.write(imax>>>8);
System.out.println("当前指针位置:"+raf.getFilePointer());//3
raf.write(imax>>>0);
System.out.println("当前指针位置:"+raf.getFilePointer());//4
//简便方案: writeInt,一次写入整型数据,其它数据类型类似
raf.writeInt(imax);
System.out.println("当前指针位置:"+raf.getFilePointer());//8
raf.writeDouble(Double.MAX_VALUE);//double类型数据的最大值
System.out.println("当前指针位置:"+raf.getFilePointer());//16