第三周预习——JAVAIO

本文详细介绍了Java中File类的使用,包括获取文件属性、创建和删除文件、目录操作。接着讨论了文件字节和字符输入输出流,以及如何使用缓冲流提高效率。文章还提到了随机访问文件、数组流、数据流和对象流的概念,特别是对象的序列化和克隆。最后,简述了Scanner类在文件解析中的应用和文件对话框的创建。
摘要由CSDN通过智能技术生成

一、File类

        File类的对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。

        创建File对象的构造方法:

        File(String filename);

        FIle(String directionaryParh,String filename);

        File(File dir,String filename );

1.文件的属性

public String getName() 获取文件名字

public booleana canRead() 判断文件是否可读

public boolean canWrite() 判断文件是否可被写入

public boolean exists() 判断文件是否存在

public long length() 获取文件的长度(单位是字节)

public long lastModified() 获取文件最后修改的时间

还有很多相关的方法,我觉得可以自行去书上查询

2.目录

(1)创建目录

public boolean mkdir() 方法创建目录,创建成功返回true。

(2)列出目录中的文件

列出该目录下的文件和子目录:

        public String[] list()   用字符串形式返回目录下的全部文件

        public File[] listFIles() 用File对象形式返回目录下的全部文件

列出目录下指定类型的文件(比如指定扩展名):

        public String[] list(FilenameFilter obj) 用字符串形式返回目录下的指定类型的所有文件

        pubic File [] listFiles(FilenameFilter obj) 用File类形式

        以上两种方法中的FilenameFilter是一个接口,这个接口有一个方法:public boolean accept(File dir,String name) obj参数不断回调这个方法,dir为调用list的当前目录dirFile,参数name是该目录下的文件名,如果该方法返回true,就把这个文件名的文件返回给数组中。

3.文件的创建与删除

创建:File file = new File("目录","文件名");如果该目录中没有该文件,则调用public boolean createNewFile();方法创建该文件

删除:file.delete();

4.运行可执行文件

执行一个本地机器上的可执行文件,可以使用java.lang包中的Runtime 类,具体步骤如下

Runtime ec;  //声明

ec=Runtime.getRuntime();  //用静态方法创建该对象

ec.exec(String command);  //打开本地机器上的可执行文件或执行一个操作,比如打开浏览器。

举个例子:

import java.io.*;
public class Example{
    public static void main (String args[]){
        try{
            Runtime ec = Runtime.getRuntime();
            File file = new File("c:/windows","Notepad.exe");
            ec.(file.getAbsolutePath());
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
}

二、文件字节输入输出流以及文件字符输入输出流

1.文件字节输入流

一般的步骤:设定输入流的源;创建指向源的输入流;让输入流读取源中的数据;关闭流。创建输入流的时候可能会出现错误,所以要放在try catch语句中。

创建指向文件的输入流的构造方法:

        FileInputStream(String name);

        FileInputStream(File file);

文件字节流可以调用从父类继承的read方法顺序地读取文件:

        int read();  //读取单个字节

        int read(byte b[]);  //试图读取b.length个字节到字节数组b中,返回实际读取的字节数目。

        int read(byte b[],int off,int len);  //参数off从字节数组的哪个位置开始存放读取的数据。

关闭流:

        close() 方法

        如果没有关闭流的话,那么可能不允许另一个程序操作这些流所用的资源。

当把读入的字节转化为字符串时:

File f = new File("Example");
InputStream in = new FileInputStream(f);
while(n=in.read(a,0,100)!=-1){  //100是字节数组的length
    String s = new String (a,0,n);
    System.out.print(s);
}

2.文件字节输出流

和文件字节输入流差不多。

创建指向文件的输出流:

        FileOutputStream(String name);

        FileOutputStream(File file);

创建具有刷新功能的输出流:  

        FileOutputStream(String name,boolean append);

        FileOutputStream(File file, boolean append);

使用输出流写字节:

        void write(int n)

        void write(byte b[])

         void write(byte b[],int off,int len)

关闭流:

         void close()

3.文件字符输入输出流

字节流不能很好地操作汉字等Unicode字符,所以要用文件字符输入输出流。与文件字节输入输出流也差不多。

FileReader (String filename);    FileReader (File filename);

FileWriter (String filename);       FileWriter (File filename); 

FileWriter(String name,boolean append);  FileWriter(File file, boolean append);

flush()方法,冲刷缓冲区,将当前缓冲区的内容写入到目的地。

这个地方要说明一下,Writer流中的write方法是先将数据写入缓冲区,每当缓冲区溢出时,缓冲区的内容自动写入到目的地。

三、缓冲流

增强读写能力,比如可以只读一行。不过要注意这里的源和目的地必须是字符输入输出流。

BufferedReader(Reader in);

BufferedWriter(Writer out);

读取文本行的方法:readline();

向文件写入一个回行符的方法:newLine();//这是BufferedWriter流的独特的方法。

四、随机流

通过随机流既能读文件也能写文件。但是要注意指向文件时不刷新文件。

RandomAccessFile(String name,String mode);   //这个mode有:r(只读);rw(可读写)。

定位读写位置的方法:

        seek(long a);  //确定读写位置距离文件开头的字节数。

        getFilePointer();  //获取当前读写的位置。

举个例子:

for(long i=data.length-1;i>=0;i--){
    inAndOut.seek(i*4);    //i*4时因为例子用的int型,占4字节
    System.out.printf("\t%d",inAndOut.readInt);
}

RandomAccessFile流的readline()方法在读取含非ASCII码(比如汉字时),为了避免乱码:

String str = in.readLine();    //读取
byte b[] = str.getBytes("iso-8859-1");  //重新编码
String content = new String(b);  //使用当前机器默认编码将字节数组转化为字符串

RandomAccessFile类有许多方法,这里不一一说明了。

五、数组流

仍然是分为字节数组流和字符数组流的

字节:ByteArrayInputStream(byte[] buf);    ByteArrayInputStream(byte[] buf,int offset,int length);

           ByteArrayOutputStream();   ByteArrayOutputStream(int size); //size缓冲区初始大小。

           两种输出流缓冲区容量都会在写入字节数大于缓冲区容量时自动增加的。

字符:CharArrayReader();   CharArrayWriter();

六、数据流

DataInputStream和DateOutputStream类允许程序按着与机器无关的风格读取Java原始数据,换句话说,就是当读取一个数值时,不必再关心这个数值应当是多少个字节。

DataInputStream(InputStream in)  //指向有参数in指定的底层输入流

DateOutputStream(OutputStream out)  //指向有参数out指定的底层输出流

七、对象流

与上述几种输入/输出流有所不同,在使用对象输入/输出流时,应先创建一个InputStream子类/OutputStream的子类,比如:FileOutputStream。

举个例子:

FileOutputStream fileOut = new FileOutputStream("example.txt");
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);


FileInputStream fileIn = new FIleInputStream("example.txt");
ObjectInputStream objectIn = new ObjectInputStream(fileIn);

对象输出流使用writeObject(Object obj)方法将一个对象obj写入到一个文件,对象输入流使用readObject()读取一个对象到程序中。

当使用对象流写或读入对象时,要保证对象和对象的成员对象是序列化的。至于什么是序列化,下面会具体说明。

八、序列化与克隆

一个类如果实现了Serializable接口(java.io中的接口),那么这个类所创建的对象就是所谓的序列化的对象。需要注意一下的是这个接口中没有方法。

已知一个类的两个对象如果具有相同的引用,那么它们就具有相同的实体和引用。这有点复制克隆的感觉,但是想得到一个"复制品",并且对复制品实体的改变不会引起原来对象实体的变化,这个时候应该怎么弄呢?

其实使用对象流很容易获得一个序列化对象的克隆。要将该对象写入对象输出流指定的目的地,然后将该目的地作为另一个对象的对象输入流的源。

​
ByteArrayOutputStream outByte = new ByteArrayOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(outByte);


ByteArrayInputStream inByte = new ByteArrayInputStream(outByte,toByteArray());
ObjectInputStream objectIn = new ObjectInputStream(inByte);

​

九、用Scanner类解析文件

用Scanner类和正则表达式解析文件,解析速度相对较慢,但节省内存。当然也可以将内容全部读入内存后再进行解析,解析速度快,但消耗较多内存。

1.使用默认分隔符标记解析文件:

File file = new File();

Scanner sc = new Scanner(file); 

sc将空格作为分隔符,调用next()方法(非数字型单词)依次返回file中的单词。如果file中最后一个单词已经被next()返回,那么sc会调用 hasNext()方法,返回false。

如果是数字型单词,就用nextInt()/nextDouble()方法代替next()。

2.使用正则表达式作为分隔符标记解析文件:

File file = new FIle();

Scanner sc = new Scanner(file);

sc.useDelimiter(正则表达式);

十、文件对话框

十和十一让我有一种后端写的东西“看得见”了的感觉。

选择文件的界面——文件对话框。javax.swing包中的JFileChooser类可以做到。

  • 构造方法JFileChooser()创建的文件对话框是不可见的,接下来调用下面两种方法之一使其可见

        showSaveDialog(Component a);  提供保存文件的界面

        showOpenDialog(Component a);  提供打开文件的界面

        a是null时,对话框在屏幕中央;a不空时,对话框在组件a的正前面居中显示。

  • 然后是“确定”“取消”“关闭”几个的实现

        用showSaveDialog()或showOpenDialog()返回下列常量:

                JFileChooser.APPROVE_OPTION

                JFileChooser.CANCEL_OPTION

  • 如果希望文件对话框的文件类型是特定几种类型,比如.jpg等

               在之前的基础上

                FileNameExtensionFilter filter = new FileNameExtensionFilter("图像文件",“jpg”,"gif");

                chooser.setFileFilter(filter);

十一、带进度条的文件流

javax.swing包提供的输入流类ProgressMoniterInputStream

构造方法是:ProgressMoniterInputStream(Component c,String s,InputStream);

举个例子:

package com.bluemsun.leiyuduixiang.shijian;
import javax.swing.*;
import java.io.*;

public class Example {
    public static void main (String args[]){
        byte b[]=new byte[30];
        try{
            FileInputStream input = new FileInputStream("Example.java");
            ProgressMonitorInputStream  in= new ProgressMonitorInputStream(null,"读取java文件",input);
       //获取进度条
            ProgressMonitor p = in.getProgressMonitor();
            while(in.read(b)!=-1){
                String s = new String (b);
                System.out.print(s);
                Thread.sleep(1000);
            }
        }catch(Exception e){}
    }
}

十二、文件锁

为了避免几个程序同时处理同一个文件而产生的混乱,要使用文件锁。

FileLock类(java.nio包中)和FileChannel类(java.nio.channels包中)

  • 大致过程

        创建好输入流之后

        File Channel channel = input.getChannel();

        FileLock lock = channel.tryLock();

        完成了加锁

        lock.release();

        解锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值