Java笔记二十.深入解析I/O编程之文件访问类

深入解析I/O编程之文件访问类

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)

开始学习字节流类之前,我们来先看下与文件有关的类-File类。File类是IO包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操作文件,通过调用File类提供的各种方法,我们能够创建、删除文件、重命名文件以及判断文件的读写权限及其是否存在,设置和查询文件的最近修改时间等。在Java中,目录也被当作File使用,只是多了一些目录特有的功能---可以用list方法列出目标中的文件名。

一、File类

(1)功能

File类是IO包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操作文件。但File类不能访问文件的内容,即不能够从文件中读取数据或向文件里写数据,它只能对文件本身的属性进行操作。

(2)构造方法

>File(String pathname) :创建一个File对象,其内容为字符串路径所对应的文件;

>File(URI uri) :创建一个File对象,其内容为URI所包含的文件;

举例:File f=new File("C:\\test.txt");创建一个File类实例f,该实例的内容直接对应C盘目录下test.txt文件,File类的所有方法则都是针对于该文件。

(3)常用方法

boolean createNewFile():当文件不存在时,新建一个空的文件(文件名为pathname(包含路径));

boolean delete():删除该抽象路径名所表示的文件或者目录;

boolean exists():判定该抽象路径名所表示的文件或者目录是否存在;

String getAbsolutePath():以字符串的形式返回该文件的绝对路径;

String getCanonicalPath():以字符串的形式返回该文件的相对路径;

String getName():获取该文件/目录的文件(目录)名;

long lastModified():返回该文件最后依次修改时间;

long length() :返回该文件的长度(大小);

String[] list():以字符串数组的形式返回该目录下的所有文件名(目录);

boolean setReadable(boolean readable):设置文件的可读权限;

boolean setWritable(boolean writable):设置文件的可写权限;

boolean isDirectory() :判定是否为目录;

boolean isFile():判断是否为文件;

boolean canRead() :判定该文件或目录是否可读;

boolean canWrite() :判定该文件或目录是否可写;

注意:上述方法操作的是由File对象的路径所表示的磁盘文件或目录。

二、RandomAccessFile类

1.功能

RandomAccessFile类是Java语言中最为丰富的文件访问类,其提供了大量的访问文件的方法。RandomAccessFile类支持"随机访问"方式,即使用该类实现跳转到文件的任意位置处读写数据。另外,RandomAccessFile对象类有个位置指示器,指向当前读写处的位置,当读写n个字节后,文件指示器将指向这n个字节后的下一个字节处。需要注意的是,该类仅限于操作文件,不能访问其他的IO设备(如网络、内存映像)。

2.构造方法

RandomAccessFile(File file, String mode)

RandomAccessFile(String name, String mode)

举例:

new RandomAccessFile(f,"rw");    //以读写方式实例化一个RandomAccessFile对象

new RandomAccessFile(f,"r");       //以只读方式实例化一个RandomAccessFile对象

当以读写的方式打开一个文件(引用变量f对应的文件)时,如果该文件不存在,程序将自动创建。

3.常用方法

void close():关闭该随机存取文件流并释放与该文件流有关的系统资源;

long getFilePointer():返回位置指示器指向文件当前读写处的位置;

long length():返回该文件的长度;

int read():从该文件读取一个字节的数据;

int read(byte[] b) :从该文件读取最多b.length()个字节数据到字节数组(byte[]);

int read(byte[] b, int off, int len):从该文件的off位置读取len个字节数据到字节数组(byte[]);

byte readByte():从该文件读取一字节数据;

char readXxx():从该文件读取一个字符/double型/float型数据;

String readLine():读取文件的下一行数据;

void seek(long pos):设置位置指示器偏移位置(相对于文件开头);

int skipBytes(int n):跳过n个字节;

void write(byte[] b) :将指定字节数组中的b.length个字节数据写入到该文件中;

void write(byte[] b, int off, int len) :将从指定字节数组的off位置后面的len个字节数据写入到该文件中

void write(int b) :写一个字节数据到该文件中;

4.源码实战

1.使用RandomAccessFile创建并读取一个文本文件

(1)Employee.java

功能:设计一个类用于封装员工信息,一个员工的信息就是文件中的一条记录,为了准确定位每条记录在文件中的具体位置,我们使每条记录在文件中的大小相同,即每个员工的姓名字段在文件中的长度是一样的。

package test;

<span style="font-size:18px;">/*自定义类:用于封装员工的信息*/
public class Employee {
 String name;
 int age;
 final static int len=8;	 //名字的长度
 public Employee(String name,int age)	//构造方法
 {
  if(name.length()>=len)
  {
   name=name.substring(0, len);	//如何名字长度大于8个字符则只取前8个
  }
  else
  {
   while(name.length()<len)
       name=name+"\u0000";
  }
  this.age=age;
  this.name=name;
 }
}</span>

源码分析:为了使name中满足8个字符条件,我们可以这样处理:少于8个字符则补空格(即+"\u0000"),多于8个则去掉后面多余的部分。另外,由于年龄是整型数据不管这个数有多大,只要它不超过整型数据的范围,在内存中都是占4个字节大小。

String.substring(int beginIndex,int endIndex)方法用于取出一个字符串中的部分子字符串,需要注意的是字符串中的第一个字符对应的是原字符串中的脚标为beginIndex处的字符,但最后的字符对应的是原字符串中的脚本为endIndex-1处的字符,而非endIndex处的字符。

(2)RandomAccessFileTest.java

功能:实现使用RandomAccessFile类创建并操作文本文件,向该文件写入数据然后再从文件中读取指定位置的数据打印。

<span style="font-size:18px;">package test;
import java.io.RandomAccessFile;
public class RandomAccessFileTest {
 public static void main(String[] args) throws Exception
 {
  Employee e1 = new Employee("zhangsan", 30);	 //实例并初始化3个Employee对象
  Employee e2 = new Employee("lisi", 26);
  Employee e3 = new Employee("wangwu", 25);
  /*1.打开文件写入数据后关闭*/
  RandomAccessFile ra = new RandomAccessFile("C:\\employee.txt", "rw");	//实例化并打开一个RandomAccessFile代表的文件
  ra.write(e1.name.getBytes());	 //将第一个员工信息写入到RandomAccessFile代表的文件中
  ra.writeInt(e1.age);
  ra.write(e2.name.getBytes());
  ra.writeInt(e2.age);
  ra.write(e3.name.getBytes());
  ra.writeInt(e3.age);
  ra.close();
  /*2.再次打开文件读取文件后关闭*/
  RandomAccessFile raf = new RandomAccessFile("C:\\employee.txt", "r");
  int len=8;
  raf.skipBytes(len+4);	//跳过第一个员工信息,其中姓名8个字节、年龄4字节

  //获取第二个员工信息
  System.out.println("第二个员工信息:");
  String str="";
  for(int i=0;i<len;i++)
   str = str +(char)raf.readByte();	 //读取一个字节的信息到str中,此时位置指示器指向第9个字节位置(假如从0开始)
  System.out.println("name:"+str);
  System.out.println("age:"+raf.readInt());
  //获取第一个员工信息(读取完数据后位置指示器位置指向第二个员工信息的开始位置)
  System.out.println("第一个员工信息:");
  raf.seek(0);
  str="";
  for(int i=0;i<len;i++)
   str = str +(char)raf.readByte();
  System.out.println("name:"+str);
  System.out.println("age:"+raf.readInt());
  //获取第三个员工信息
  System.out.println("第三个员工信息:");
  raf.skipBytes(len+4);
  str="";
  for(int i=0;i<len;i++)
   str = str +(char)raf.readByte();
  System.out.println("name:"+str);
  System.out.println("age:"+raf.readInt());
  raf.close();	 //关闭文件,释放引用变量资源及其所占用的系统资源
 }
}</span>

效果演示:

时间: 2024-10-10 03:38:04

Java笔记二十.深入解析I/O编程之文件访问类的相关文章

Java笔记二十一.深入解析I/O编程之节点流

深入解析I/O编程之节点流 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 在上一节我们说到IO流主要分为两个大类:节点流类和过滤流类(也称包装类).程序用于直接操作目标设备所对应的类叫节点流类;为更加灵活方便地读写各种类型的数据,程序也可用通过一个间接流类去调用节点流类而这个简介流类即为过滤流类(也称为包装类). 总之,无论是节点流类还是过滤流类,它们都属于字节流或字符流其中的一种.下面我们介绍一下常见的节点流类有哪些. 字****节***

Java笔记二十二.深入解析I/O编程之包装类

深入解析I/O编程之包装类 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 从上节学到的节点流类我们知道,如Java中提供的FileOutputStream和FileInputStream类实现往文件中写入字节或从文件中读取字节数据.在实际应用中,我们需要往文件中写入或读取各种类型的数据,一般的做法是先将其他类型的数据转换成字节数组后写入文件或是将从文件中读取到的字节数组转换成其他类型.然而,上述方法会给我们的程序增加了代码量和带来一些困难和

Java笔记二十四.TCP网络编程

 TCP网络编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 从上面一节内容可以知道,利用UDP通信的两个程序是平等的,无主次之分,两个程序代码可以完全一样.但利用TCP协议进行通信的两个应用程序,是有主从之分的,一个称为服务器程序,另外一个称为客户机程序.Java中提供了ServerSocket类用于创建服务器端的socket,Socket类用于创建客户端socket. 一.APIs简介 java.net.ServerSocket (1

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

马哥学习笔记二十二——高可用集群原理

HA Resource:资源 FailOver:故障转移 FailBack:故障转回 资源粘性:资源是否倾向于留在当前节点 Messaging Layer:集群服务信息层,基于UDP互相传递心跳信息,集群事务信息等 heartbeat(v1,v2,v3) heartbeat v3:heartbeat,pacemaker,cluster-glue corosync cman keepalived ultramonkey CRM:(cluster resource manager)集群资源管理器,统

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现 这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item. 要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是