Java-输入输出
1.1.Java中使用IO包处理输入输出
-
在Java.io包中最重要的5个类和一个接口
5个类
- File:文件类,用来进行文件和文件夹的操作
- InputStream:字节输入流
- OutputStream:字节输出流
- Reader:字符输入流
- Writer:字符输出流
1个接口
- Serializable序列化,串行化
1.2.Java输入输出流机制
流就是字节序列的抽象概念,负责在数据产生者和数据的消费者之间建立联系,管理数据的流动。

输入/输出都是以应用程序本身为参考对象
1.3.File类
-
java.io.File类封装了文件对象
-
一个File对象代表实际存在的一个文件或目录
- 在Java中,没有表示文件路径的类,而是将文件路径也当作文件类的对象来处理。
- File类构造方法不会检验文件是否存在,因此不会影响File对象的创建
-
比较常用的三个构造:
-
public File(String filename) :
给定包含路径的完整文件名字符串来创建新的 File实例。
例如:File file = new File("C:\Users\Desktop\example.txt");
-
public File(String directoryPath, String filename) :
分别给定路径名字符串和文件名字符串创建新的 File实例。
例如: File file = new File("C:\Users\Desktop", "example.txt");
-
public File(File f, String filename) :
给定抽象路径名和文件名字符串创建新的 File实例。
例如: File parentDir = new File("C:\Users\Desktop");
File file = new File(parentDir, "example.txt");
-
如果程序只处理一个目录或文件,并且知道该目录或文件的路径,使用第一个构造方法较方便。
如果程序处理的是一个公共目录中的若干子目录或文件,那么使用第二个或者第三个构造方法会更方便。
构造File对象
路径的表示:
路径可以使用绝对路径,也可以使用相对路径
File f1 = new File(“D:\\file\\a.txt”);
//使用绝对路径构造File对象f1
File f2 = new File(“src\\Hello.java”);
//使用相对路径构造File对象f1,从当前程序所在文件夹构造
File对象常用方法
- 和文件名相关
String getName() 获取文件名
String getPath() 获取文件路径
String getAbsolutePath() 获取抽象路径
String getParent() 获取父路径
boolean renameTo(File newName) 文件重命名
- 对文件进行检测
boolean exists() 判断文件是否存在
boolean canWrite() 文件是否可写
boolean canRead() 文件是否可读
boolean isFile() 是否是文件
boolean isDirectory() 是否是目录
boolean isAbsolute() 是否是抽象路径
目录操作常用方法
Boolean mkdir() 创建一个目录,并返回创建结果。
Boolean mkdirs() 创建一个包括父目录在内的目录。
String[] list() 获取目录下字符串表示形式的文件名和目录名
String[] list(FilenameFilter filter)
获取满足指定过滤器条件的字符串表示形式的文件名和目录名
File[] listFiles()
获取目录下文件类型表示形式的文件名和目录名
File[] listFiles(FileFilter filter)
获取满足指定过滤器文件条件的文件表示形式的文件名和目录名
File[] listFiles(FilenameFilter filter)
获取满足指定过滤器路径和文件条件的文件表示形式的文件名和目录名
文件操作常用方法
- 创建文件public boolean createNewFile()
由Filec创建一个文件对象:
File file1 = new File("D:\\","hello.txt");
使用createNewFIle()方法创建文件
file1.createNewFile();
- 删除文件
public boolean delete()
例如:file1.delete();
- 修改文件名
public boolean renameTo(File dest)
将当前文件重命名为参数dest的指定文件对象。
- 运行可执行文件
使用java.lang.Runtime类
先使用Runtime类创建一个对象:
Runtime ec = Runtime.getRuntime();
再使用Runtime对象调用exec方法执行命令
-
exec(String command)方法中参数command为指定的系统命令或许可执行程序:
Runtime ce = Runtime.getRuntime(); File file = new File("c:/windows","Notepad.exe"); ce.exe(file.getAbsolutePath());
1.4.输入输出流
流是一个无结构化的数据组成的序列,流中的数据没有任何格式和含义,只是以字节或字符形式进行流入或流出。

1.5.输入输出流的分类
-
根据数据的流向可以分为输入流和输出流。
-
根据处理数据类型,可以分为字节流和字符流。
-
根据处理数据功能,可以分为实体流和装饰流。
-
实体流对数据不做任何处理,只完成基本的读写操作。
-
装饰流是在实体流的基础上,提供更高级的功能。
-
1.5.1.按输入输出分类
1.Memory数据流
1)从/向内存数组读写数据:
CharArrayReader、 CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream
2)从/向内存字符串读写数据:
StringReader、StringWriter、StringBufferInputStream
2.Pipe管道数据流
实现管道的输入和输出(进程间通信):
PipedReader、PipedWriter、PipedInputStream、PipedOutputStream
3.File 文件流
对文件进行读、写操作 :
FileReader、FileWriter、FileInputStream、FileOutputStream
1.5.2.按IO类型分类
4.ObjectSerialization 对象输入、输出 :
ObjectInputStream、ObjectOutputStream
5.DataConversion数据流
按基本数据类型读、写(处理的数据是Java的基本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream
6.Printing 包含方便的打印方法 :PrintWriter、PrintStream
7.Buffering缓冲
在读入或写出时,对数据进行缓存,以减少I/O的次数:
BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
8.Filtering 过滤流
在数据进行读或写时进行过滤:
FilterReader、FilterWriter、FilterInputStream、FilterOutputStream
9.Concatenation合并输入
把多个输入流连接成一个输入流 :SequenceInputStream
10.Counting计数
在读入数据时对行记数 :LineNumberReader、LineNumberInputStream
11.Peeking Ahead
通过缓存机制,进行预读 :PushbackReader、PushbackInputStream
12.Converting between Bytes and Characters
按照一定的编码/解码标准将字节流转换为字符流,或进行反向转换(Stream到Reader,Writer的转换类):InputStreamReader、OutputStreamWriter
1.5.3.按数据来源分类
1、File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
2、byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、Char[]: CharArrayReader, CharArrayWriter
4、String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer
1.6.如何选择IO流
1、确定是数据源和数据目的(输入还是输出)
源:输入流 InputStream和Reader
目的:输出流 OutputStream和Writer
2、明确操作的数据对象是否是纯文本
是:字符流Reader,Writer
否:字节流InputStream,OutputStream
3、明确具体的设备。
是硬盘文件:File++:
读取:FileInputStream, FileReader,
写入:FileOutputStream,FileWriter
是内存中数组
是byte[]:ByteArrayInputStream, ByteArrayOutputStream
是char[]:CharArrayReader, CharArrayWriter
是String:StringReader, StringWriter
是网络用Socket流:
输入socket.getOutputStream****() 输出socket.getInputStream****()
是键盘:用System.in(是一个InputStream对象)读取,用System.out(是一个OutoutStream对象)打印
4、是否需要转换流
是,就使用转换流,
从Stream转化为Reader,Writer:InputStreamReader,OutputStreamWriter
5、是否需要缓冲提高效率,是就加上Buffered:
BufferedInputStream, BufferedOuputStream, BuffereaReader, BufferedWriter
6、是否需要格式化输出,例如:将一个文件中数据存储到另一个文件中。
JAVA的文件读取主要有字节流读取和字符流读取两种方式,字节流可以既可以操作文本文件,也可以操作非文本文件,如一些二进制数据(图片,视频,对象),而字符流只能操作文本。
1.7.字节流

在数据传输过程中以字节为单位进行输入和输出。
适用于传输各种类型的文件或数据。
- 在字节输入流中
InputStream 类是所有的输入字节流的父类,它是一个抽象类。
其子类中的ByteArrayInputStream、FileInputStream 是两种基本的实体流。
ObjectInputStream 和所有FilterInputStream 的子类都是装饰流。
- 在字节输出流中
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream 是两种基本的实体流。
ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。
1.8.字符流
在数据传输过程中以字符为单位进行输入和输出。
根据字符编码表,一个字符占用两个字节,因此字符流只适用于字符类型数据的处理。

- 在字符输入流中,Reader 是所有的输入字符流的父类,它是一个抽象类。
InputStreamReader 是一个连接字节流和字符流的桥梁,它使用指定的字符集读取字节并转换成字符。
其FileReader子类可以更方便地读取字符文件,也是常用的Reader流对象。
- 在字符输出流中,Writer是所有的输出字符流的父类,也是一个抽象类。
相对输入流的子类,输出流当中也有相应的输出子类,只是数据传输方向相反。
这些类有OutputStreamWriter及其子类FileWriter、 CharArrayWriter、StringWriter 、BufferedWriter 、PipedWriter等。
1.9 使用输入、输出流的步骤
1.给出输出流的目的地
2.创建指向目的地的输出流
3.让输出流把数据写入到目的地
4.关闭输出流。
- FileReader类
FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据。可以通过以下几种构造方法创建需要的对象。
-
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
-
FileReader(File file)
-
在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
-
FileReader(FileDescriptor fd)
-
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
-
FileReader(String fileName)

浙公网安备 33010602011771号