JAVA之IO流

一、 File:文件和目录路径名的抽象方法

1、 构造方法
(1) File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
(2) File(String parent, String child):从父路径名字符串和子路径名字符串创建新的File实例
(3) File(File parent, String child):从父路径名和子路径名字符串创建新的File实例
2、 创建目录
(1) public boolean createNewFile():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新文件
(2) public boolean mkdir():创建由此抽象路径名命名的目录
(3) public boolean mkdirs():创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录
3、 判断和获取
(1) public boolean isDirectory():测试此抽象路径名表示的File是否为目录
(2) public boolean isFile():测试此抽象路径名表示的File是否为文件
(3) public boolean exists():测试出抽象路径名表示的File是否存在
(4) public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
(5) public String getPath():将此抽象路径名转换为路径名字符串
(6) public String getName():返回此抽象路径名表示的文件或目录的名称
(7) public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
(8) public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
4、 删除
(1) public Boolean delete():删除由此抽象路径名表示的文件或目录

二、 字节流(读不懂):

InputStream:这个抽象类是表示字节输入流的所有类的超类
OutputStream:这个抽象类是表示字节输出流的所有类的超类
1、 字节流写数据
(1) 创建字节输出流对象(File或String):

FileOutputStream fos = new FileOutputStream(“myByteStream\\fos.txt”);

(2) 将指定的字节写入此文件输出流

fos.write(97);

(3) 关闭此文件输出流并释放与此流相关联的任何系统资源

fos.close();

2、 字节流写数据的3种方式
(1) void write(int b):将指定的字节写入此文件输出流,一次写一个字节数据
(2) void write(byte[] b):将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据
(3) void write(byte[] b, int off, int len):将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据
3、 字节流写数据的两个小问题
(1) 字节流写数据如何实现换行:,写完数据后,加换行符window(\r\n),linux(\n),mac(\r)
(2) 字节流写数据如何实现追加写入:

public FileOutputStream(String name, boolean append);

4、 字节流读数据
(1) 创建字节输入流对象

FileInputStream fis = new FileInputStream(“myByteStream\\fos.txt”);

(2) 调用字节输入流对象的读数据方法

int by;
while((by = fis.read()) != - 1) {
	System.out.print((char)by);
}

byte[] bys = new byte[1024];
int len;
while((len = fis.read(bys)) != -1){
    System.out.print(new String(bys, 0, len));
}

(3) 释放资源

fis.close();

5、 字节缓冲输出流(BufferedOutputStream)
该类实现缓冲输出流,通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
(1) 创建字节缓冲输出流对象

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“myByteStream\\bos.txt”));

(2) 写数据

bos.write(“hello\r\n”.getBytes());

(3) 释放资源

bos.close();

6、 字节缓冲输入流(BufferedInputStream)
创建BufferedInputStream将创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从包含的输入流中重新填充,一次很多字节
(1) 创建字节缓冲输入流对象

BufferedIntputStream bis = new BufferedInputStream(new FileInputStream(“myByteStream\\bos.txt”));

(2) 读数据

int by;
while((by = bis.read()) != -1){
	System.out.print((char)by);
}

byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys)) != -1){
    System.out.print(new String(bys, 0, len));
}

(3) 释放资源

bis.close();

三、 字符流:读的懂,只能用于文本数据

1、 字符串中的编码解码问题
(1) 编码:
byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
(2) 解码
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
2、 字符流中的编码解码问题
(1) InputStreamReader:是从字节流到字符流的桥梁,它读取字节,并使用指定的编码将其解码为字符,使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

InputStreamReader isr = new InputStreamReader(new FileInputStream(“myCharStream\\osw.txt”));
int ch;
while((ch = isr.read()) != -1) {
	System.out.print((char)ch);
}
Isr.close();

(2) OutputStreamWriter:是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“myCharStream\\osw.txt”));
osw.write(“中国”);
osw.close();

3、 字符流写数据的5种方式
(1) void write(int c):写一个字符

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“myCharStream\\osw.txt”));
osw.write(97);
osw.flush();
osw.close();

(2) void write(char[] cbuf):写一个字符数组

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“myCharStream\\osw.txt”));
char[] chs = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’};
osw.write(chs);
osw.close();

(3) void write(char[] cbuf, int off, int len):写一个字符数组的一部分
(4) void write(String str):写一个字符串

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“myCharStream\\osw.txt”));
osw.write(“abcde”);
osw.close();

(5) void write(String str, int off, int len):写一个字符串的一部分
4、 字符流读数据的2种方式
(1) int read():一次读一个字符数据

InputStreamReader isr = new InputStreamReader(new FileInputStream(myCharStream\\osw.txt));
int ch;
while((ch = isr.read()) != -1){
	System.out.print((char)ch);
}
isr.close();

(2) int read(char[] cbuf):一次读一个字符数组数据

InputStreamReader isr = new InputStreamReader(new FileInputStream(myCharStream\\osw.txt));
char[] chs = new char[1024];
int len;
while((len = isr.read(chs)) != -1){
	System.out.print(new String(chs, 0, len));
}
isr.close();

5、 简化版
(1) 根据数据源创建字符输入流对象

FileReader fr = new FileReader(“myCharStream\\demo.java”);

(2) 根据目的地创建字符输出流对象

FileWriter fw = new FileWriter(“myCharStream\\copy.java”);

(3) 读写数据,复制文件

int ch;
while((ch = fr.read()) != - 1) {
	fw.write(ch);
}

char[] chs = new char[1024];
int len;
while((len = fr.read(chs)) != -1) {
	fw.write(chs, 0, len);
}

(4) 释放资源

fw.close();
fr.close();

6、 字符缓冲流
(1) BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小,默认值足够大,可用于大多数用途。

BufferedWriter bw = new BufferedWriter(new FileWriter(“myCharStream\\bw.txt”));
bw.write(“hello\r\n”);
bw.close();

(2) BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小,默认值足够大,可用于大多数用途

BufferedReader br = new BufferedReader(new FileReader(“myCharStream.bw.txt”));
Int ch;
While((ch = br.read()) != -1) {
	System.out.print((char)ch);
}

char[] chs = new char[1024];
int len;
while((len = br.read(chs)) != -1) {
	System.out.print(new String(chs, 0, len));
}
br.close();

7、 字符缓冲流特有功能
(1) BufferedWriter:
void newline():写一行行分隔符,行分隔符字符串由系统属性定义
(2) Bufferedreader:
public String readLine():读一行文字,结果包含行的内容的字符串,不包括任何终止字符,如果流的结尾已经到达,则为null

String line;
while((line = br.readLine()) != null) {
	System.out.println(line);
}

四、 总结

1、 字节流
(1) 字节输入流(InputStream)

  • FileInputStream
  • BufferedInputStream

(2) 字节输出流(OutputStream)

  • FileOutputStream
  • BufferedOutputStream

2、 字符流
(1) 字符输入流(Reader)

  • InputStreamReader(FileReader)

  • BufferedReader

(2) 字符输出流(Writer)

  • OutputStreamEriter(FileWriter)
  • BufferedWriter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值