十.输入输出流
1.输入输出流
(1)输入流与输出流
把不同类型的输入、输出都抽象为流(Stream)。
按流的方向,可分为输入流与输出流
• java.io包
(2)字节流与字符流
——根据内容分InputStream类read()方法逐字节 地以二进制的原始方式读取数据public int read(); 读入一个字节, -1表示无public int read(byte b[]); 返回读入的字节数public int read(byte[] b, int off, int len);OutputStream类write()方法它的功能是将字节写入流中public void write (int b);// 将参数b的低位字节写入到输出流public void write (byte b[]);// 将字节数组b[]中的全部字节顺序写入到输出流public void write(byte[] b, int off, int len);// 将字节数组b[]中从off开始的len个字节写入到流中Output的另外两个方法是flush()及close()。public void flush (); 刷新缓存,实际写入到文件、网络public void close(); 关闭流Reader类与InputStream类相似,都是输入流但差别在于Reader类 读取的是字符(char) ,而不是字节。Reader的重要方法是read()public int read(); // 需要将int转成charpublic int read(char b[]);public int read(char[] b, int off, int len);Writer类与OutputStream类相似,都是输出流但差别在于Writer类写入的是字符(char),而不是字节。Writer的方法有:public void write (int b);// 将参数b的低两字节写入到输出流public void write (char b[]);// 将字符数组b[]中的全部字节顺序写入到输出流public void write(char[] b, int off, int len);// 将字节数组b[]中从off开始的len个字节写入到流中public void write( String s);// 将字符串写入流中public void write( String s, int off, int len);// 将字符串写入流中, off为位置,len为长度public void flush ();// 刷新流public void close();// 关闭流
(3)节点流和处理流
流分为节点流与处理流两类。节点流(Node Stream)可以从或向一个特定的地方(节点)读写数据如文件流 FileInputStream,内存流 ByteArrayInputStream直接与节点(如文件)相连处理流(Processing Stream)是对一个已存在的流的连接和封装,处理流又称为过滤流(Filter)如缓冲处理流 BufferedReader对节点流或其他处理流进一步进行处理 (如缓冲、组装成对象,等等)流的链接(包装)处理流的构造方法总是要带一个其他的流对象作参数BufferedReader in = new BufferedReader(new FileReader(file));BufferedReader in2 =new BufferedReader(new InputStreamReader(new FileInputStream(file), “utf-8”));s = in2.readLine();一个流对象经过其他流的多次包装,称为流的链接(包装)常用的节点流常用的处理流
(4)不同内容的读写
标准输入和标准输出System.inSystem.in 为InputStream类型.System.outSystem.out为 PrintStream类型.System.errSystem.err为 PrintStream类型.从标准输入读取数据为了使用方便,经常将System.in用各种处理流进行封装处理,如:BufferedReader br = new BufferedReader(new InputStreamReader( System.in ) );br.readLine();JDK1.5以后增加了java.util.Scanner类常见内容的读
- 二进制
- 文本
- 对象
二进制流的读写import java.io.*; public class Dump { public static void main(String[]args) { try { dump( new FileInputStream("aaa.bmp"), new FileOutputStream("bbb.bmp")); } catch(FileNotFoundException fex) { fex.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } } public static void dump(InputStream src, OutputStream dest) throws IOException { InputStream input = new BufferedInputStream(src); OutputStream output = new BufferedOutputStream(dest); byte[] data = new byte[1024]; int length = -1; while ((length = input.read(data)) != -1) { output.write(data, 0, length); } input.close(); output.close(); } }
字符的读写常见的编码• UTF-8, ASCII, GB2312, 默认编码使用java.nio.file.Files的readAllLines()方法对象的读写ObjectInputStream, ObjectOutputStream,基本数据的读写DataInputStream, DataOutputStream序列化(serialize)与反序列化( deserialize)要求对象实现 Serializable 接口• (该接口没有方法,只是一个标记)
(5)网络流
要点:
- URL
- 网络流
- 线程、invokeLater
2.文件及目录
java.io包中定义与数据输入、输出功能有关的类,包括提供文件操作功能的File类创建File类对象File f;f = new File("Test.java");f = new File("E:\\ex\\","Test.java");在Java中,将目录(directory, 文件夹)也当作文件处理File类中提供了实现目录管理功能的方法File path = new File("E:\\ex\\");File f = new File(path, "Test.java");File类方法关于文件/目录名操作String getName()String getPath()String getAbsolutePath()String getParent()boolean renameTo(File newName)File 测试操作boolean exists()boolean canWrite()boolean canRead()boolean isFile()boolean isDirectory()boolean isAbsolute();获取常规文件信息操作long lastModified()long length()boolean delete()目录操作boolean mkdir()String[] list()
类似于C语言的文件操作• RandomAccessFile,可以实现对文件的随机读写操作• 构造方法RandomAccessFile(String name,String mode);RandomAccessFile(File f,String mode);• 定位方法public void seek(long pos);• 读写方法readBealoon(),readChar(),readInt(),readLong(),readFloat(),readDouble(),readLine(),readUTF()等writeBealoon(),writeChar(),writeInt(),writeLong(),writeFloat(),writeDouble(),writeLine(),writeUTF()等
3.正则表达式
正则表达式(Regular Expressions)• 它实际上是用来匹配字符串的一种模式。• 是文本处理中常用的工具• 主要的应用包括:匹配验证、分割、查找、替换正则表达式的写法字符{数量}位置如 [0-9]{2,4}\b 可以匹配 123 1988 2015 16正则表达式的基本元素\ 转义 匹配反斜线符号之后的字符,所以可以匹配一些特殊符号,例如$ 和 |关于数量关于字符• \d 表示数字,相当于[0-9]• \D 表示非数字,相当于 [^0-9]• \s 表示空白符,相当于 [ \t\n\x0B\f\r]• \S 表示非空白符,相当于[^\s]• \w 表示单词字符,相当于 [a-zA-Z_0-9]• \W 表示非单词字符,相当于 [^\w]
题目
1.判断题
1.1 InputStream类和OutputStream类是所有二进制I/O的根类。(T)
1.2 InputStream类中的close()方法是用于关闭流并且释放流所占的系统资源。(T)
1.3 在FileInputStream类的对象中,利用read(byte[] bytes)和read(byte[] bytes,int off,int len)方法读取一次数据后,bytes数组中的所有数据都是本次读取的数据。(F)
1.4 在FileReader类的对象中,利用read(char[] buf)和read(char[] buf,int off,int len)方法读取数据后,buf数组中全部存放的是本次读取的数据。(F)
1.5 在程序代码中,java.io.IOException异常必须被捕获或抛出,不能置之不理。(T)
1.6 Java系统的标准输入对象是System.in,标准输出对象有两个,分别是标准输出System.out和标准错误输出System.err。(T)
1.7 文件缓冲流的作用是提高文件的读/写效率。(T)
1.8 如果一个File表示的目录对象下有文件或者子目录,调用delete()方法也可以将它们删除。(F)
1.9 通过File类可对文件属性进行修改。(T)
1.10 对象序列化是指将一个Java对象转换成一个I/O流中的字节序列的过程。(T)
2.单选题
2.1 在输入流的read方法返回哪个值,表示读取结束?
A.0
B.1
C.-1
D.null
2.2 利用FileInputStream和FileOutputStream读写文件,哪个方法不抛出IOException?( )
A.两个类的构造方法
B.read
C.write
D.close
2.3 构造BufferedInputStream类型的对象,参数可以是哪些类型的对象?( )
A.BufferedOutputStream
B.FileInputStream
C.FileOuterStream
D.File
2.4 要从“file.dat”文件中读出第10个字节到变量c中,下列哪个方法适合? ( )
A.
FileInputStream in=new FileInputStream("file.dat");
int c=in.read();
B.
RandomAccessFile in=new RandomAccessFile("file.dat");
in.skip(9);
int c=in.readByte();
C.
FileInputStream in=new FileInputStream("file.dat");
in.skip(9);
int c=in.read();
D.
FileInputStream in=new FileInputStream("file.dat");
in.skip(10);
int c=in.read();
2.5 字符流与字节流的区别是( )。
A.每次读入的字节数不同
B.前者带有缓冲,后者没有
C.前者是字符读写,后者是字节读写
D.二者没有区别,可以互换使用
2.6 为了从文本文件中逐行读取内容,应该使用哪个处理流对象?( )
A.BufferedReader
B.BufferedWriter
C.BufferedInputStream
D.BufferedOutputStream
2.7 transient 变量和下面哪一项有关?
A.Cloneable
B.Serializable
C.Runnable
D.Throwable
E.Comparable
3.填空题
3.1 在java.io包内包含了处理各种流的基本类,所有的字节输出流都继承于 OutputStream (1 分)类,所有的字符输入流都继承于 Reader (1 分)类。
3.2 数据流包括数据输入流 DataInputStream (2 分)类,它们允许按Java的基本数据类型读写流中的数据。
3.3 InputStreamReader类是用于将( 字节流 )转换为( 字符流 )。
3.4 对于java.io包中的所有I/O类,根据数据流所关联的是数据源还是其他数据流,可分为节点流和 处理流 (2 分)。
3.5 JPanel的缺省布局管理器是 FlowLayout (2 分)。
3.6 BorderLayout (2 分)布局包括五个明显的区域:东、南、西、北、中。
3.7 非模式 (2 分)对话框可以中断对话过程,去响应对话框以外的事件。
3.8 Java中的事件主要有两种: 组件类事件 (2 分)和动作类事件。
4.程序填空题
4.1 从键盘输入一个整数,然后输出该整数的10倍数字
下面的程序从键盘输入一个整数,然后输出该整数的10倍数。
import java.io.*;
public class Main {
public static void main(String[] args) {
BufferedReader //3 分 in= new BufferedReader(new InputStreamReader //3 分(System.in)); System.out.print("Please input a integer:");
try{ int i = Integer. parseInt //2 分(in.readLine());
System.out.println("Ten times of the number:"+10*i);
in.close();
}catch( IOException e //2 分){
System.err.println(e.toString());
}
}
}
5.编程题
5.1 复制源码
编写程序,将程序文件的源代码复制到程序文件所在目录下的“temp.txt”文件中。
代码: