IO流之文件字节/字符输入输出流用法
文件字节输入流
顾名思义,文件字节输入流即是将文件通过读取字节的方式输入,通过此方式可以读取绝大多数种类的文件。
本文所讲的所有操作,都是针对文件来进行读取或输入的。
Java虚拟机无权直接对文件进行操作,它必须向操作系统申请,才可以读取/更改文件,因此在使用文件的字节/字符流后,一定要记住关闭字节/字符流,即释放资源。
对字节数组等内存形式的数据进行输入/输出流时,会走Java虚拟机的gc即垃圾回收机制,无需主动释放流资源。当然,如果你就是想加上一条close()语句,那也是无所谓的。
文件字节输入流主要做以下几件事情:
1、创建源(File类)
2、选择流(InputStream类)
3、对字节操作
4、释放资源
示例代码如下:
public class IOTest01 {
public static void main(String[] args) {
// 1、创建源
File src = new File("abc.txt");
// 2、选择流
InputStream is = null;
try {
is = new FileInputStream(src);
byte[] flush = new byte[1024*10];
// 接收长度
int len = -1;
// 3、对字节进行操作
while ((len = is.read(flush)) != -1) {
// 一定要限制实际长度
String str = new String(flush, 0, len);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、释放资源
try {
// 流is在创建失败时可能为空,此时需要判断,否则会报NullPointerException
if (null != is) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
文件字节输出流
通过输出字节的方式输出到文件中,具体步骤如下:
1、创建源(File)
2、选择输出流
3、操作(写出内容)
4、释放资源
示例代码如下:
public class IOTest02 {
public static void main(String[] args) {
// 1、创建源
File src = new File("dest.txt");
// 2、选择流
OutputStream os = null;
try {
os = new FileOutputStream(src,true);
String msg = "Xixi";
// 字符串-->字节数组(编码)
byte[] datas = msg.getBytes("utf-8");
// 3、操作,写出字节数据
os.write(datas, 0, datas.length);
// 刷新,防止流没有输出干净
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、释放资源
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
搭配好字节输入流和字符输出流,可以很轻易的复制文件(包括图片等)。
文件字符输入流
读取字符的方式读取文件。注意,如果文件字符与读取的字符格式不匹配,会出现乱码。该方式也不适用于读取图片等非字符文件的操作。
具体步骤如下:
1、创建源
2、选择流
3、操作数据
4、释放资源
示例代码:
public class IOTest04 {
public static void main(String[] args) {
// 1、创建源
File src = new File("abc.txt");
// 2、选择流
Reader reader = null;
try {
reader = new FileReader(src);
// 与字节流的差异地方
char[] flush = new char[1024];
// 接收长度
int len = -1;
// 3、操作
while ((len = reader.read(flush)) != -1) {
// 一定要限制实际长度
String str = new String(flush, 0, len);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、释放资源
try {
// 流is在创建失败时可能为空,此时需要判断,否则会报NullPointerException
if (null != reader) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
文件字符输出流
字符流在写入字符时的方法是多样的,可以用字节流类似的方法,也可以直接writer.write(String)
,或者使用append(String)
具体步骤如下:
1、创建源
2、选择流
3、操作数据
4、释放资源
示例代码:
public class IOTest05 {
public static void main(String[] args) {
File src = new File("dest.txt");
Writer writer = null;
try {
writer = new FileWriter(src);
// 写法一
// String msg = "我是姚明";
// char[] datas = msg.toCharArray();
// writer.write(datas, 0, datas.length);
// 写法二
// String msg = "我是姚明";
// writer.write(msg);
// 写法三
writer.append("我是JOJO").append("哈哈啊哈");
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}