Java-I/O学习(1)
Java-I/O学习(1)
Java IO是java中的相关API,主要目的为读数据与写数据(input 和 output)。大部分的应用都需要处理一些输入数据,并且根据输入数据生成一些输出数据,比如说从文件或网络读取数据,然后写回文件或通过网络响应数据。
Java的IO包本身的主要关注点在于,从一个地方读取原始数据和向目的地写入数据。最典型的数据来源和目的地主要有:
- 文件(File)
- 管道(Pipes)
- 网络连接(Network Connections)
-
内存缓冲区,比如数组(In-memory Buffers)
-
System.in, System.out, System.error
图示一个程序从一个地方读数据并且写数据到目的地:
图1.png流
IO流是Java IO的核心概念。流是一个概念上的无休止的数据流。你既可以从一个流读取数据也可以写入到一个流。流用来连接数据源与目标地。Java IO流基于字节流和字符流。
InputStream, OutputStream, Reader and Writer
一个程序从数据源读取数据的时候,需要 InputStream或者Reader。程序写数据的时候,就需要OutputStream或Writer
图示:
图2.pngInputStream和Reader连接到数据来源。OutputStream和Writer连接到目的地
Java IO的目的和特性
Java IO中有很多InputStream, OutputStream, Reader和Writer的子类,这些子类会用来处理不同的需求。这就是为什么有这么多类的原因。具体的用法主要有以下一些场景:
-
文件
-
网络流
-
内存缓冲区
-
管道
-
缓冲
-
过滤
-
解析
-
读写文本
-
读写原始类型的数据(long等等)
-
读写对
字节输入流 | Output | 字符输入流 | Output | |
---|---|---|---|---|
Basic | InputStream | OutputStream | Reader/InputStreamReader | Writer/OutputStreamWriter |
Arrays | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
Files | FileInputStream/RandomAccessFile | FileOutputStream/RandomAccessFile | FileReader | FileWriter |
Pipes | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
Buffer | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
Filter | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
Parsing | PushbackInputStream/StreamTokenizer | PushbackReader/LineNumberReader | ||
String | StringReader | StringWriter | ||
Data | DataInputStream | DataOutputStream | ||
Data - Formatted | PrintStream | PrintWriter | ||
Objects | ObjectInputStream | ObjectOutputStream | ||
Utilities | SequenceInputStream |
文件
Java IO读取文件
如果你想从一端读取一个文件到另一端,你可以用FileInputStream或者FileReader,这取决于你是想把文件读取成字节还是字符。这两个类每次读取一个字节或者一个字符来处理整个文件,或者将字节或字符放入到字节数组或字符数组中。你没有必要读取整个文件,只需要有序的读取文件中的字符或字节就可以。
如果你需要读取文件中随机位置的部分,你可以使用RandomAccessFile。
Java IO写文件
如果你想从一端读取一个文件到另一端,你可以用FileOutputStream或者FileWriter,这取决于你是想根据字节还是字符来写。这两个类每次写入一个字节或者一个字符来写完整个文件,或者将字节或字符放入到字节数组或字符数组中来写。数据会按顺序存储到文件当中。
如果你需要在文件中随机的位置来写,你可以使用RandomAccessFile。
Java IO随机访问文件
利用RandomAccessFile来随机访问文件。
随机的意思并是不真正意义上的随机访问文件地址,它紧紧是意味着你可以根据你的需要来访问文件的某个位置。没有一个强制的顺序让你访问文件。这就让处理已经存在的文件的某部分称为了可能,去增加内容,从中删除内容,当然了也包括去读取任何内容。
Byte & Char Arrays
在一个Java应用中,字节数组和字符数组经常用来在程序内部临时存储数据。它们也是常规的数据源或数据目的地。如果你需要在程序运行的时候访问文件内容,也可以把文件加载到数组中。当然,你可以通过数组的下标来访问文件的内容。如果你设计一个组件用来从InputStream或Reader读取特定的数据并且不用数组,那该怎么办?
通过InputStream或Reader读数组
需要用ByteArrayInputStream或CharArrayReader包装一下字节或字符数组。这样,数组中的字节或字符就可以通过包装的stream或reader来读取了:
public class Demo {
public static void main(String[] args) throws IOException {
String s = "abcdefghijklmn";
byte[] bytes = s.getBytes();
InputStream input = new ByteArrayInputStream(bytes);
int data = input.read();
while (data != -1) {
System.out.println(data);
data = input.read();
}
}
}
针对字符数组。利用CharArrayReader
public class Demo2 {
public static void main(String[] args) throws IOException {
String s = "abcdefghijklmn";
char[] chars = s.toCharArray();
Reader reader = new CharArrayReader(chars);
int data = reader.read();
while (data != -1) {
System.out.println(data);
data = reader.read();
}
}
}
通过OutputStream或Writer写入到数组
同样的去写数据,可以用ByteArrayOutputStream或CharArrayWriter。你需要做的事情就是创建一个ByteArrayOutputStream或CharArrayWriter,然后向这里面写数据,就像你用其他的stream或writer一样。当所有数据写完的时候,只是简单的调用oByteArray()或toCharArray方法,所有的数据就可以以数组的形式返回。
public class T1 {
public static void main(String[] args) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
output.write("hdhdsjdhsjdhsjdhsj".getBytes("UTF-8"));
byte[] bytes = output.toByteArray();
for (byte b : bytes) {
System.out.println(b);
}
}
}
针对字符数组。利用CharArrayWriter
public class T2 {
public static void main(String[] args) throws IOException {
CharArrayWriter writer = new CharArrayWriter();
writer.write("abcghdh");
char[] chars = writer.toCharArray();
for (char c : chars) {
System.out.println(c);
}
}
}
Readers and Writers
Java IO中的java.io.Reader和java.io.Writer的工作原理很像InputStream和OutputStream,但不同的是reader和writer是基于字符的,他们是用来用些文本数据的
Reader
Java Reader是所有java reader相关类的基类。子类包括有BufferedReader、PushbackReader、InputStreamReader、StringReader和一些其他的类
使用:
public class T1 {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("E:\\learn-java\\Learning-Java\\MyNotes\\better_write\\Java_IO\\bb.txt");
int data = reader.read();
while ( data != -1) {
System.out.println((char)data);
data = reader.read();
}
}
}
当InputStream每次返回一个字节的时候,这个字节是 0 到 255 直接的值(-1代表没有数据了),Reader每次返回一个字符,意味着返回 0 到 65535 (-1代码数据已经读完)。这并不意味着Reader从已连接的数据源一次读取两个字节,它每次可以一次读取一或多个字节。这取决于文本数据的编码格式。
Writer
Java IO API中Writer是所有writer的基类。子类主要包括BufferedWriter和PrintWriter等一些其他的类
public class T2 {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("E:\\learn-java\\Learning-Java\\MyNotes\\better_write\\Java_IO\\bb.txt");
writer.write("123456789");
writer.close();
}
}
I/O类库图
图示:
图3.png 图4.png