Java.IO
Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
Java.IO流的分类
- 字节流:数据流中的最小的数据单元是字节,一次读入读出8位二进制;
- 字符流:数据流中的最小的数据单元是字符,一次读入读出16位二进制,java中的字符是Unicode编码,一个字符占用两个字节。
字节流
inputStream类(输入字节流)
inputstream类:inputStream类是个抽象类,是所有字节输出流的超类。们可以认为InputStream提供了一种统一的对待输入的方法,可将多种不同类型的数据源都用统一的读取方式对待。要说明的是,InputStream是用来操控字节输入流的,它所提供的方法也是针对字节的
inputStream类的常用子类:
InputStream子类 数据源类型
ByteArrayInputStream 包含一个内存缓冲区,字节从中取出。
FileInputStream 从文件中获得字节。
ObjectInputStream 用来恢复被序列化的对象。
PipedInputStream 管道输入流,读取管道内容。多和PipedOutputStream一起用于多线程通信。
SequenceInputStream 是多种输入流的逻辑串联,从第一个输入流读取,直到最后一个输入流。
StringBufferInputStream 读取的字节由字符串提供。
FileInputStream类
创建一个FileInputStream类的对象用来获取src目录下的a.txt文件
/**
* 使用InputStream抽象类的子类FileInputStream类 从一个文件夹中读取数据流
* (FilterInputStream的方法与InputStream中的方法没什么不同。
* 但FilterInputStream的子类却给出了更多的实现。)
*/
public static void test1() {
try {
// 读取src下的a.txt文件
FileInputStream is = new FileInputStream("src/a.txt");
int a = 0;
// 如果没读到文件尾,则继续执行读取命令
while ((a = is.read()) != -1) {
// 因为是a里面装的都是字节
// 所以要转换为char类型
System.out.print((char) a);
}
// 关闭流(使用完都要关闭)
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}运行结果:InputStream提供了以下方法:
方法 解释
available() 返回此输入流下一个方法可以读取的字节数。
close() 关闭此输入流并释放相应资源。
mark(int) 在此输入流中标记当前的位置。
markSupported() 测试此输入流是否支持mark和reset方法。
read() 从此输入流中读取下一个字节(此方法是抽象方法,子类必须实现该方法)。
read(byte[]) 从输入流中读取一定数量的字节,存储在参数指定的字节数组中。
read(byte[],int,int)从输入流中指定位置起读取若干字节存储在指定字节数组中。
reset() 将此输入流定位到最后一次mark的位置。
skip(long) 跳过和丢弃此输入流中数据的若干字节。
OutputStream类(输出字节流)
OuputStream类:OutputStream与InputStream一样,都是抽象类,是输出字节流的所有类的超类。它的作用是接收输出字节并将这些字节输送到某个接收的地方。OutputStream的子类分为以下几种:
OutputStream子类 解释
ByteArrayOutputStream 该类实现了一个输出流,其数据被写入由byte数组充当的缓冲区,缓冲区会随着数据的不断写入而自动增长。
FileOutputStream 该类实现了一个输出流,其数据写入文件。
ObjectOutputStream 该类将实现了序列化的对象序列化后写入指定地方。
PipedOutputStream 管道的输出流,是管道的发送端FileOutputStream类
使用FileOutputStream类将一个字符写到src目录下的b.txt文件中
/**
* 使用FileOutputStream类将一个字符写到文件中
*/
public static void test2() {
try {
//将os里面的内容输出到src的b.txt文件中
OutputStream os = new FileOutputStream("src/b.txt");
//将字节写入os输出流中
os.write(97);
//刷新缓存
os.flush();
//关闭输出流
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
输出结果
使用FileOutputStream类将一个字符串写到文件中
/**
* 使用FileOutputStream类将一个字符串写到文件中
*/
public static void test3() {
String content = "I'm a programmer";
try {
OutputStream os = new FileOutputStream("src/c.txt");
os.write(content.getBytes());
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
运行结果OutputStream的主要方法有:
方法 解释
close() 关闭此输出流并释放相应资源
flush() 刷新此输出流并强制写出所有缓冲的输出字节。
write(byte[]) 将字节写入此输出流。
write(byte[],int,int) 将指定的若干字节写入此输出流。
write(int) 将指定若干字节写入此输出流。字符流
Reader类(输入字符流)
Reader类:用于读取字符流的抽象类。
使用Read类读取src目录下的d.txt文件内容
/**
* 使用Reader类读取文件内容
*/
public static void test4() {
FileInputStream fis;
try {
fis = new FileInputStream("src/d.txt");
Reader reader = new InputStreamReader(fis,"utf-8");
int a ;
while ((a=reader.read())!=-1) {
System.out.print((char)a);
}
fis.close();
reader.close();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
读取结果Writer类(输出字符流)
writer类:写入字符流的抽象类。
使用Writer类将内容写入文件
/**
* 使用Writer类将内容写入src目录下的e.txt文件
*/
public static void test5() {
FileOutputStream fos;
try {
fos = new FileOutputStream("src/e.txt",true);//加了true属性,则是追加写入
Writer writer = new OutputStreamWriter(fos,"GBK");
writer.write("I'm 漂亮女孩---");
writer.flush();
fos.close();
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}写入3次的结果Scanner类
使用Scanner读取文件
/**
* Scanner 类使读取文件更为简单
* 使用Scanner(File source) 构造一个新的Scanner,它生成的值是从指定文件扫描的
*/
public static void test6() {
try {
FileInputStream fis = new FileInputStream("src/f.txt");
Scanner scanner = new Scanner(fis);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
fis.close();
scanner.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}读取结果printWriter类
使用printWriter将内容写入文件中
/**
*为了能够输出数据的时候更方便,我们要引入printWriter
*/
public static void test7() {
try {
PrintWriter pw = new PrintWriter("src/g.txt");
pw.print("I am 零度! 我");
pw.flush();
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}写入结果
342

被折叠的 条评论
为什么被折叠?



