一个流可以理解为一个序列,输出流从一个源头输出数据,输入流向目标输入数据。这些流在数据传输和网络编程起着非常大的作用,下面我们学习其中形形色色的类,了解他们之间的关系与作用。
下图是一个输入流与输出流的类层次图
一,InputStream与OutputStream,字节输入流与字节输出流
InputStream是所有字节输入流的父类,其中子类FileInputStream,DataInputStream,BufferedInputStream,ByteArrayInputStream较为常见,一会详细介绍一下
InputStream常用方法总结
- available()返回可以从此输入流读取(或跳过)而不被此输入流的下一个调用方阻塞的字节数
- close() 关闭输入流,释放资源
- read() 从输入流读取下一字节的数据
- read(byte[] b)从输入流中读取一定数量的字节,并将它们存储到缓冲区数组中
OutputStream这个抽象类是表示字节输出流的所有类的超类。输出流接受输出字节并将它们发送到某个接收器
- close()仍然是关闭流,释放此流相关的所有资源
- writer(int b)将指定的字节写入此输出流
- writer(byte[] b)写字
b.length
从指定字节数组到此输出流的字节
- Input Stream子类FileInputStream 表示从文件系统中的文件中获取输入字节。哪些文件可用取决于主机环境,其中方法close(),read(),available()与InputStream相似。与此类相对应的类为FileOutputStream,表示文件输出流,用于将数据写入
File
或者对一个FileDescriptor
..文件是否可用或是否可以创建取决于底层平台。特别是有些平台只允许一个文件被打开,以便只写一个。FileOutputStream(或其他文件写入对象)一次。在这种情况下,如果涉及的文件已经打开,该类中的构造函数将失败。FileOutputStream
用于写入原始字节流(如图像数据)。要编写字符流,请考虑使用FileWriter
.其常用方法与OutputStream相似 - DataInputStream数据输入流允许应用程序以独立于机器的方式从底层输入流读取原始Java数据类型。应用程序使用数据输出流来写入以后可以被数据输入流读取的数据。DataOutputStream数据输出流允许应用程序以可移植的方式将原始Java数据类型写入输出流。然后,应用程序可以使用数据输入流将数据读入。
二,Reader和Writer,字符输入流和字符输出流
Reader读取字符流的抽象类。子类必须实现的唯一方法是read(char[]、int、int)和Close()。但是,大多数子类都会覆盖这里定义的一些方法,以便提供更高的效率、更多的功能,或者两者都提供。
- close()与上述相同
- read()只读取一个字符
- read(byte[] b)将字符读入数组
- ready()是否已准备好读取此流
Writer用于写入字符流的抽象类。子类必须实现的惟一方法是WILD(char[]、int、int)、刷新()和CLOSE()。但是,大多数子类都会覆盖这里定义的一些方法,以便提供更高的效率、更多的功能,或者两者都提供。
- attend(char c)将指定字符附加到此写入器
- write(int c)只写一个字符
- write(String c)写入一个字符串
- write(char c[])写入一个字符数组
- close()关上小溪,先冲过去
- Reader子类FilterReader表示用于读取过滤的字符流的抽象类。抽象类
FilterReader
它本身提供了将所有请求传递给包含的流的默认方法。子类FilterReader
应该覆盖这些方法中的一些,还可以提供其他方法和字段。方法与Reader类似 - FilterWriter用于编写过滤的字符流的抽象类。抽象类
FilterWriter
它本身提供了将所有请求传递给包含的流的默认方法。子类FilterWriter
应该覆盖这些方法中的一些,还可以提供其他方法和字段。常用方法write(int c)只写一个字符 write(String c)写入一个字符串 write(char c[])写入一个字符数组 close()关上小溪,先冲过去flush()冲过小溪 - BufferReader从字符输入流读取文本,缓冲字符,以便有效地读取字符、数组和行。可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,缺省值都足够大。通常,由Reader发出的每个读取请求都会导致对底层字符或字节流提出相应的读取请求。因此,建议将BufferedReader包装在任何其read()操作可能代价高昂的阅读器(如F ileReader和InputStreamReader)周围。例如, BufferedReader in = new BufferedReader(new FileReader("foo.in"));
- Buffer Writer将文本写入字符输出流,缓冲字符,以便有效地写入单个字符、数组和字符串。可以指定缓冲区大小,也可以接受默认大小。对于大多数用途,缺省值都足够大。提供了一个Newline()方法,它使用平台自己的由系统属性定义的行分隔符的概念线分离器..并非所有平台都使用换行符(‘\n’)来终止行。因此,调用此方法终止每个输出,直接写入换行符更可取。通常,Writer将其输出立即发送到基础字符或字节流。除非需要提示输出,否则最好将BufferedWriter包装在那些其写()操作可能代价很高的Writer周围,例如FileWriters和OutputStreamWriters。例如 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
- InputStreamReader是从字节流到字符流的桥梁:它读取字节并使用指定的字符将它们解码为字符
charset
..它使用的字符集可以按名称指定,也可以显式指定,也可以接受平台的默认字符集。每次调用InputStreamReader的read()方法之一,都可能导致从底层字节输入流读取一个或多个字节。为了有效地将字节转换为字符,可以从底层流中提前读取更多的字节,而不是满足当前读取操作所必需的字节。为了提高效率,请考虑在BufferedReader中包装InputStreamReader。例如: BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - OutputStreamWriter是从字符流到字节流的桥梁:写入到它的字符使用指定的字节编码
charset
..它使用的字符集可以按名称指定,也可以显式指定,也可以接受平台的默认字符集。每次调用写()方法都会导致在给定字符上调用编码转换器。在写入基础输出流之前,将得到的字节累加在缓冲区中。可以指定此缓冲区的大小,但在默认情况下,它足以满足大多数目的。注意,传递给write()方法的字符没有缓冲。为了提高效率,请考虑将OutputStreamWriter封装在BufferedWriter中,以避免频繁的转换器调用。例如: Writer out = new BufferedWriter(new OutputStreamWriter(System.out));阅读字符文件的方便类。该类的构造函数假定默认字符编码和默认字节缓冲区大小是合适的。要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。 FileReader
用于读取字符流。要读取原始字节流,请考虑使用FileInputStream
.- FileWriter用于编写字符流,要编写原始字符流,应使用FileOutStream
- StringReader源为字符串的字符流
- StringWriter一种在字符串缓冲区中收集其输出的字符流,然后可用于构造字符串。
字符与字节是可以转换的
- InputStreamReader:字节到字符的桥梁
- OutputStreamWriter:字符到字节的桥梁
java目录
File类中有两个方法可以用来创建文件夹:
- mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
- mkdirs()方法创建一个文件夹和它的所有父文件夹。
读取目录
一个目录其实就是一个 File 对象,它包含其他文件和文件夹。
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。
可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。
删除目录或文件
删除文件可以使用 java.io.File.delete() 方法。
以下代码会删除目录 /tmp/java/,需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。