Java IO
Java 所有的文件操作类都在Java.io 包中。 注意五个类和一个接口。File OutputStream InputStream Writer Reader 一个接口是serializable。
File
public File(String pathname)// file 类构造方法
要使用一个File类,需要传递一个文件路径
import java.io.File;
import java.io.IOException;
public class FileDemo1{
pubic static void main(String[] args){
File f = new File("D:\\text.txt")
try{
f.createNewFIle();
}catch(IOException e){
e.printStaackTrace();
}
}
}
创建文件夹
File f = new File(".\\java\\io");
f.mkdir() && f.mkdirs()
RandomAccessFile 类
要对文件内容进行操作,使用randomAccessFile类。
public class RandomAccessFile implements DataOutput, DataInput, Closeable
{//下面是常用API.
//两个构造函数,指定操作文件.
public RandomAccessFile(String name, String mode)
public RandomAccessFile(File file, String mode)
public int read() throws IOException
public int read(byte b[], int off, int len) throws IOException
public void write(int b) throws IOException
public void write(byte b[]) throws IOException
public void seek(long pos) throws IOException //设置读指针的位置
public final byte readByte() throws IOException
public final int readInt() throws IOException
}
public class random_access_file{
public static void main(String[] args) throws Exception{
File f = new File('text.txt');
//读写方式打开文件,自动创建新文件
RandomAcessFile fdf = new RandomAccessFile(f,'rw');
String name = "xiaoming ";
int age = 23;
fdf.writeBytes(name);
fdf.write(age);
fdf.close();
File f1 = new File('text.txt');
RandomAccessFile rdf2 =new RandomAccessFile(f1,"r");
byte[] b = new byte[8];
for(int i=0;i<b.length;i++)
b[i]=rdf2.readByte();
String name1 = new String(b);
字节流于字符流基本操作
在程序中所有的数据都是以流的方式进行传输或者保存的,程序需要读取数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流。
io 包中流的操作主要有字节流,字符流两大类,两类都有输入和输出操作,在字节流中输出数据主要使用OutputStream 类完成,输入使用的是InputStream 类。在字符流中输出主要使用Writer类完成,输入主要使用Reader类完成。
操作流程如下
- 使用file 类打开一个文件
- 通过字节流或则字符流的子类制定输出的位置
- 进行读写操作
- 关闭输入输出
流在实例化的时候需要传进去一个文件对象
字节流
OutputStream 是整个IO包中字节输出流的最大父类,定义如下
public abstruct class OutputStream extends Object implements Closeable, Flushable// 抽象类
里面主要定义了一个抽象方法,write().
InputStream 是整个IO包中字节输入流的最大父类,定义如下
public abstruct class InputStream extends Object implements Closeable, Flushable// 抽象类
里面主要定义了一个抽象方法,read().
字符流
在程序中一个字符相当于两个字节,Java提供了Reader 和Writer 两个专门操作字符流的类。
Writer 与outputStream 的操作流程并没有什么太大的去别,唯一的好处是,可以直接输出字符串,而不用将字符串变为byte[]数组之后再输出。Reader和Inputstream 也是类似。
reader inputstream 都是从文件(或其他)取数据 writer outputstream 往文件(或其他)写入数据
字节流在操作时本身不会用到缓冲区,是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再进行操作文件。所以字节流操作时不关闭也会有输入输出,字符流就不行,如果不关闭的话,就都在缓冲区里
转换流
outputStreamWriter 是writer的子类,将一个字符流的输出对象变为字节流输出对象。
inputStreamReader 是reader的子类,将一个字节流的输入对象变为字符流的输入对象。
System类对IO的支持
System类定义了三个常量
public static final PrintStream out// 对应系统标准输出,一般是显示器
public static final PrintStream err//错误信息输出
public static final InputStream in // 对应标准输入,一般是键盘
System.out
System.out 是printStream的对象,在printStream 中定义了一系列print()和println()方法,printStream 又是OutputStream的子类.
OutputStream out = System.out;
out.write("Helo".getBytes());
System.err
System.err 表示的是错误信息输出,如果程序出现错误,可以直接使用System.err 进行输出.
try
{
System.out.print("hhh")
}catch (Exception e)
{
System.err.println(e);
}
System.in
System.in 实际上是一个键盘的输入流,其本身是InputStream类型的对象,那么此时就可以利用System.in 完成从键盘读取数据的功能.
InputStream input =System.in;
byte[] b = new byte[1024];
int len = input.read(b);
System.out.println(new String(b,0,len));
//此方法不常用,因为要提前申请,更好的方法是将全部输入暂存到内存的一块地方,然后一次性从内存中读取数据
Scanner 类
JDK1.5后提供了专门的输入数据类,不只可以完成输入数据操作,也可以方便的对输入数据进行验证.
Scanner 可以接收任意的输入流.
对象序列化
对象序列化是把一个对象变为二进制的数据流的一种方法,通过序列化可以方便的实现对象的传输或者存储。如果一个类想被序列化,则对象所在的类必须实现 Java.io.serializable 接口, 此接口没有定义任何的方法,所以此接口是一个标识接口,表示一个类具备了被序列化的能力。
Java IO 总结
Java IO 主要关注的是从原始数据源的读取以及输出原始数据到目标媒介。原始的数据源包括了 文件,管道,网络连接,内存缓存。
通过IO 读文件
根据该文件是二进制文件还是文本文件来选择使用FileInputStream或者FileReader。这两个类允许你从文件开始到文件末尾一次读取一个字节或者字符。或者将读取到的字节或字符写到数组里。
Fileinputstream
InputStream input = new FileInputStream("c:\\data\\input-text.txt");
int data = input.read();while(data != -1) {
//do something with data...
doSomethingWithData(data);
data = input.read();
}
input.close();
//中一个FileInputStream构造函数取一个File对象替代String对象作为参数。这里是一个使用该构造函数的例子:
File file = new File("c:\\data\\input-text.txt");
InputStream input = new FileInputStream(file);
通过IO 写文件
如果需要在不同端之间写文件,根据你要写入的数据是二进制型数据还是字符型数据选用FileOutputStream或者FileWriter。
OutputStream output = new FileOutputStream("c:\\data\\output-text.txt");
while(moreData) {
int data = getMoreData();
output.write(data);
}
output.close();
Java IO 管道
Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力。所以管道也可以作为数据源以及目标媒介。
Java IO 网络
当两个进程之间建立了网络连接之后,他们通信的方式如同操作文件一样:利用InputStream读取数据,利用OutputStream写入数据。换句话来说,Java网络API用来在不同进程之间建立网络连接,而Java IO则用来在建立了连接之后的进程之间交换数据