我们可以对它进行如下分类:
1. 按处理的数据类型可分为字节流(byte)与字符流(char)
2. 按流的流向可分为输入流(in)与输出流(out)
3. 按流的功能可分为节点流(Node)和过滤流(Filter)
本篇侧重于梳理字节流相关的知识,毕竟作为字符流的前辈,它还是非常重要的。下篇继续梳理字符流。
先认识一些简单的输出:
package test202261;
import java.io.File;
import java.io.IOException;
public class lianxi {
public static void main(String[] args) {
File f=new File("d:\\a.txt");//把file
if(f.exists()) { //判断是否D盘存在a.txt
//f.delete();
}
else {//不存在就创建
try {
f.createNewFile();
}catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件名称:"+f.getName());
System.out.println("文件所在路径:"+f.getPath());
System.out.println("文件的父目录:"+f.getParent());
System.out.println("文件绝对路径:"+f.getAbsoluteFile());
System.out.println(f.canWrite()?"文件可写":"文件不可写");
System.out.println(f.isDirectory()?"文件是目录":"文件不是目录");
System.out.println("文件上次修改的时间"+f.lastModified());
System.out.println("文件大小:"+f.length());
}
}
}
以学生信息为例,写入计算机文档和读取信息
//学生信息编辑
package test20220602;
public class student {
String name;
int age;
public student(String name,int age) {//判断name长度是否达到8个字节
if(name.length()>8)
name=name.substring(0, 8);
else {//否则,用空格补齐
while(name.length()<8)
name=name+"\u0000";
}
this.name=name;
this.age=age;
}
}
//测试类
package test20220602;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class test {
public static void main(String[] args) throws IOException {
student s1=new student("liangzai", 20);
student s2=new student("ongzai", 19);
student s3=new student("xizai", 21);
String str = null;
RandomAccessFile ra=null;
try {
ra=new RandomAccessFile("d:\\a.txt", "rw");//调用RandomAccessFile类(该类在里面已经有了),rw表示可读可写
//将下面的信息写入到文档a.txt里面
ra.write(s1.name.getBytes());
ra.writeInt(s1.age);
ra.write(s2.name.getBytes());
ra.writeInt(s2.age);
ra.write(s3.name.getBytes());
ra.writeInt(s3.age);
//System.out.println(s1.age+"\n"+s1.name);
} catch (FileNotFoundException e) {
/*
* 当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,
* 也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。
* printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)
*/
e.printStackTrace();
}
RandomAccessFile rf=new RandomAccessFile("d:\\a.txt", "rw");//只可读
str="";
rf.getFilePointer();//假如,初始化,这里写ra.get.....则try里面没报错,执行,则这句可能有问题
rf.skipBytes(12);//因为第一个同学的信息占了12字节(string占8字节,int占4字节),所以定位到12字节的位置去
System.out.println("第二个学生的信息:");//现在名字只能是英文或者拼音才能输出读取
for(int i=0;i<8;i++) {
str=str+(char)rf.readByte();
}
System.out.println("第二个学生的姓名:"+str);
System.out.println("第二个学生的年龄:"+rf.readInt());
/********************************************************/
rf.seek(0);//0定位开始
str="";
for(int i=0;i<8;i++) {
str=str+(char)rf.readByte();
}
System.out.println("第一个学生的姓名:"+str);
System.out.println("第一个学生的年龄:"+rf.readInt());
/********************************************************/
rf.seek(24);//跳到24字节后开始,就到了第三个同学的信息位置
str="";
for(int i=0;i<8;i++) {
str=str+(char)rf.readByte();
}
System.out.println("第三个学生的姓名:"+str);
System.out.println("第三个学生的年龄:"+rf.readInt());
}
}