第十章输入、输出流

IO流(Input Output)
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流
流按流向分为:输入流,输出流
10.1 File类
输入、输出流简介(如下图所示)
在这里插入图片描述
File类的对象主要用来获取文件不是的一些信息,例如文件所在的目录、文件的长度、读写权限等,不涉及对文件的读写操作
File对象的构造方法有三个:
——File(String filename);
File fileJava = new File(“d:/2000/E.java”);
——File(String directoryPath,String filename)
File fileJava =new File(“d:/2000”,”Exam.java);
——File (File dir,String filename);
File dir = new File(“D:/1000”);
File fileJava = new File(dir ,”Ex.txt”);

1.文件的属性
File类的下列方法获取文件本身的一些信息(如下图所示)
在这里插入图片描述
2.目录
(1)创建目录:public boolean mkdir()
(2)列出目录中的文件
——public String [ ] list()用字符串形式返回目录下的全部文件
——public File [ ] listFiles()用File对象形式返回目录下的全部文件
——public String [ ] list(FilenameFilter obj)用字符串形式返回目录下的指定类型的所有文件
——public File [ ] listFiles(FilenameFilter obj)用File对象形式刚好目录下的指定类型所有文件
——上述两方法的参数FilenameFilter是一个接口,该接口有一个方法:public boolean accept(File dir,String name);
3.文件的创建与删除
当使用File类创建一个文件对象后,例:
——File file = new File(“c:\myletter”,”letter.txt”);
——如果“c:\myletter目录中没有名字为letter.txt文件,文件对象file调用方法public boolean creatNewFile();
——文件对象调用方法public boolean delete()可以删除当前文件,例:file.delete();
4.运行科执行文件(扩展名.exe或.bat)
(1)用Runtime 类声明一个对象(Runtime类在java.lang包)Runtime ec;
(2)然后使用该类的getRuntime()静态方法创建对象:ec = Runtime.getRuntime();ec可以调用exec(String command)方法打开本地机的可执行文件或执行一个操作

10.2文件字节输入流
Java.io包提供了大量的流类,Java把InputStream抽象类的子类创建的流对象称作字节输入流
OutputStream抽象类的子类创建的流对象称作字节输出流
Java把Reader抽象类的子类创建的流对象称作字符输入流
Writer抽象类的子类创建的流对象称作字符输出流
针对不同的源或目的地,Java.io包为程序提供了相应的输入流或输出流。这些输入、输出流绝大部分都是InputStream、OutputStream、Reader或Writer的子类
使用输入流通常包括4个基本步骤:
(1)设定输入流的源
(2)创建指向源的输入流
(3)让输入流读取源中的数据
(4)关闭输入流

1.构造方法:设定输入流源
使用FileInputStream类的下列构造方法创建指向文件的输入流
FileInputStream(String name);
FileInputStream(File file);
其中:参数name和file指定的文件称为输入流的源
2.使用输入流读取字节
文件字节流可以调用从父类继承的read方法顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取文件中的其余内容,直到文件的末尾或文件字节输入流被关闭
——int read()读取单个字节的数据,返回字节值(0~255整数),如果未读出字节就返回-1
——int read(byte b [ ])读取b.length个字节到字节数组b中,返回实际读取的字节数。如果到达文件末尾,则返回-1
——int read(byte b[ ] ,int off,int len)读取len个字节到字节数组b中,并返回实际读取的字节数目,如果到达文件末尾,则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据

10.3 文件字节输出流
使用输出流通常包括4个基本步骤:
(1)给出输出流的目的
(2)创建指向目的地的输出流
(3)让输出流把数据写入到目的地
(4)关闭输出流

1.构造方法
——FileInputStream(String name);
——FileInputStream(File file);
使用FileInputStream类的下列能选择是否是尾加新数据的构造方法创建指向文件的输出流
——FileInputStream(String name,boolean append);
——FileInputStream(File file , boolean append);

2.使用输出流读取字节
——void write(int n)输出流调用该方法向目的地写入单个字节
——void write(byte b[ ] )输出流调用该方法向目的地写入一个字节数组
——void write(byte b[ ] ,int off ,int len)从字节数组中偏移量off处去len个字节写入目的地

FileInputStream流顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容。直到流被关闭
3.关闭流:通过调用close()方法,可以保证操作系统把流缓冲区的内容写到它的目的地,即关闭输出流可以把该流所用的缓冲区的内容冲洗掉(通常冲洗到磁盘文件上)

10.4 文件字符输入、输出流
1.Reader类提供的read方法以字符为单位顺序地读取源中数据
——int read();
——int read(char b[ ]);
——int read(char b[ ] ,int off ,int len);
——void close();
——long skip(long numBytes);
2.Writer流以字符为单位顺序地写文件,每次调用write方法就顺序地向目的地写入内容,Write类有如下常用方法:
——void write(int n);向输出流写入一个字符
——void write(byte b[ ]);向输出流写入一个字符数组
——void write(byte b[ ],int off ,int length);从给定字符数组中起始于偏移量off处取len个字符写到输出流

10.5缓冲流
BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流。二者的源和目的地必须是字符输入流和字符输出流
1.构造方法:
——BufferedReader(Reader in);
——BufferedWriter(Writer out);
2.BufferedReader和BufferedWriter类读写文件的方法:
——readLine()读取文本行
——write(String s,int off,int len)把字符串s写到文件中
——newLine();向文件写入一个回行符

10.6 随机流
使用RandomAccessFile类创建一个随机访问文件流
RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地
构造方法:
——RandomAccessFile(String name,String mode);
——RandomAccessFile(File file,String mode);
相关方法:
——seek(long a)定位RandomAccessFile流的读写位置
——getFilePointer()获取流的当前读写位置
——readLine()方法在读取含有ASCII字符的文件时出现“乱码”现象的解决方法:
1.读取 String str =in.readLine();
2.用“iso-8859-1”重新编码 byte b[ ] =str.getBytes(“iso-8859-1”);
3.使用当前机器默认编码将字节数组转化为字符串String content = new String(b);

10.7数组流
1.字节数组流
字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字节数组作为流的源和目标

ByteArrayInputStream构造方法及常用方法
——ByteArrayInputStream(byte[ ] buf);
——ByteArrayInputStream(byte[ ] buf,int offset,int length);
——public int read();顺序地从源中读出一个字节
——public int read(byte[ ] b,int off,int len);顺序地从源中读出参数len指定的字节数

ByteArrayOutputStream流构造方法及常用方法
——ByteArrayOutputStream();
——ByteArrayOutputStream(int size);
——public void write(int b);顺序地向缓冲流写入一个字节
——public byte[ ] toByteArray();返回输出流写入到缓冲区的全部字节

2.字符数组
——CharArrayReader和CharArrayWrite类是字符数组流,使用字符数组作为流的源和目标

10.8 数据流
DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流
构造方法:
——DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流
——DataOutputStream(OutputStream out)创建的数据输出流指向一个由参数out指定的底层输出流

10.9 对象流
ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入流和对象输出流
构造方法:
——ObjectInputStream(InputStream in)
——ObjectOutputStream(OutputStream out)
相关方法
——writeObject(Object obj)将一个对象obj写入到一个文件
——readObject()读取一个对象到程序中
所谓序列化:一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象

10.10 序列化与对象克隆
如果一个“复制品”实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆
一个对象调用clone()方法就可以获取该对象的克隆对象
对象输入流通过对象的序列化信息来得到当前对象的一个克隆

10.11使用Scanner解析文件
使用Scanner类和正则表达式来解析文件
1.使用默认分隔符标记解析文件
创建Scanner对象,并指向要解析的文件,如:File file = new File(“hello.java”);
Scanner sc = new Scanner(file);
sc将空白作为分隔标记
相关方法:next()依次返回file中的单词
hasNext()判断file最后一个单词是否已被next()方法返回
nextInt()或nextDouble()方法将数字型单词转化为int或double数据返回,但需要注意,如果单词不是数字型单词,调用nextInt()或nextDouble()方法将发生InputMismatchException异常,在处理异常时可以调用next()方法返回该非数字化单词
2.使用正则表达式作为分隔标记解析文件
创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记,如:File file = new File(“hello.java”);
Scanner sc = new Scanner(file);
sc.useDelimiter(正则表达式);
sc将正则表达式作为分隔标记
相关方法:next()依次返回file中的单词
hasNext()判断file最后一个

10.12 文件对话框
构造方法JFileChoose()创建初始不可见的有模式的文件对话框
文件对话框调用下术2个方法:
——showSaveDialog(Component a);
——showOpenDialog(Component a);
都可使得对话框可见,只是呈现的外观有所不同,showSaveDialog方法提供保存文件的界面
showOpenDialog方法提供打开文件的界面
参数a指定对话框可见时的位置,当a是null时,文件对话框出现在屏幕的中央;如果组件a不空,文件对话框在组件a的正前面居中显示
showSaveDialog()或showOpenDialog()方法返回下列常量之一:
JFileChooser.APPROVE_OPTION或JFileChoose.CANCEL_OPTION

10.13带进度条的输入流
如果读取文件时希望看见文件的读取进度可以使用javax.swing包提供的输入流类:ProgressMonitorInputStream
构造方法:ProgressMonitorInputStream(Component c,String s,InputStream);该类创建的输入流在读取文件时会弹出一个显示读取速度的进度条,进度条在参数c指定的组件的正前方显示,若该参数取null,则在屏幕的前方显示

10.14文件锁
FileLock、FileChannel类处理Java提供的文件锁功能,分别在java.nio和java.nio.channel包中
输入、输出流读写文件时可以使用文件锁
RondomAccessFile创建的流在读写文件时使用文件锁步骤如下:
1.先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,如:RondomAccessFile input = new RondomAccessFile(“Example.java”,“rw”);
2.Input流调用方法getChannel()获得一个连接到底层文件的FileChannel对象(信道),如:FileChannel channel = input.getChannel();
3.信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称作文件加锁,如:FileLock lock = channel.tryLock();
文件锁对象产生后,将禁止任何程序对文件进行操作或再进行加锁
4.对一个文件加锁之后,如果想读、写文件必须让FileLock对象调用release()释放文件锁,如:lock.release();

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值