输入输出流

IO是输入/输出的缩写。
首先在JAVA相关于IO有四个抽象类。分别是InputStream,OutputStream,Reader,Writer。
那什么时候用到字节,什么时候用到字符呢?
字节流:首先二进制必须要用到字节流,以byte存储的。但是读取不了特殊符号,取中文也会有出现乱码的情况。
字符流:以字符以字符串形式存储的,就是字符流。
一般情况下,可以用文本形式打开不乱码的,都是字符流。如果图片、视频等、用字节流。
字符流的输入和输出(将文件夹中的一个txt文件复制到另一个copy文件):
public class FileReaderAndWriteDemo {
 
public static void main(String[] args) {
Reader reader = null;
Writer writer = null;
File fromFile=new File("D:/io测试文件夹/num1/i am superStar.txt");
File writeFile=new File("D:/io测试文件夹/number/copy.txt");
//判断写入文件的文件夹是否存在,不存在创建一个
IOUntil.HasDictory(writeFile);
//判断写入文件是否存在,不存在创建一个
IOUntil.HasFile(writeFile);
try {
reader=new FileReader(fromFile);
writer=new FileWriter(writeFile);
char[] buffer=new char[10];
 
while (reader.read(buffer)>0) {
System.out.println(buffer);
writer.write(buffer);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//执行reader.close();
IOUntil.ReaderClose(reader);
//执行writer.close();
IOUntil.WriterClose(writer);
}
}
}
public class IOUntil {
/**
* 判断是否存在file是否存在的文件夹,没有创建文件夹
*
* @param file
*/
public static void HasDictory(File file){
if (!file.getParentFile().isDirectory()) {
file.getParentFile().mkdirs();
}
}
/**
* 判断这个文件是否存在,不存在进行创建
*
* @param file
*/
public static void HasFile(File file){
if (!file.isFile()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 执行reader.close() 方法
* @param reader
*/
public static void ReaderClose(Reader reader){
try {
if (reader!=null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 执行writer.close() 方法
* @param reader
*/
public static void WriterClose(Writer writer){
try {
if (writer!=null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 执行in.close() 方法
* @param reader
*/
public static void InputStreamClose(InputStream in){
try {
if (in!=null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 执行out.close() 方法
* @param reader
*/
public static void OutputStreamClose(OutputStream out){
try {
if (out!=null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
字节流的输入输出(以照片为例):
public class PictureDome {
 
public static void main(String[] args) {
File file=new File("D:/io测试文件夹/num1/一寸.jpg");
File tofile=new File("D:/io测试文件夹/number","oneperson.jpg");
InputStream in =null;
OutputStream out =null;
try {
in = new FileInputStream(file);
out = new FileOutputStream(tofile);
//判断写入文件的文件夹是否存在,不存在创建一个
IOUntil.HasDictory(tofile);
//判断该文件是否存在,不存在创建该文件
IOUntil.HasFile(tofile);
byte[] buffer=new byte[20];
while(in.read(buffer)>0){
out.write(buffer,0, buffer.length);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
IOUntil.InputStreamClose(in);
IOUntil.OutputStreamClose(out);
}
}
}
注意:
1、自己在写程序时,首先要想到的是目标目录是否存在,不存在回报系统找不到指定目录,如果写的file是文件路径(譬如我的例子)
if (!file.getParentFile().isDirectory()) {
file.getParentFile().mkdirs();
}
先需要判断file的文件夹是否是一个文件夹,如果没有会返回false,然后在file.getParentFile().mkdirs();创建多级文件目录。不要直接file.mkdirs();那样你会发现它还创建了一个copy.txt文件夹,运行程序就会报错,因为在windows同一个文件夹下,是不可能出现文件夹和文件同一命名的情况,所以接下来就不会产生真正的copy.txt~
2、写IO操作,一定要记得关闭,不关闭会一直占用。所以finally的好处就是,当try中出现了异常,不往下运行代码时,还会走finally,这样就会使输入和输出关闭。
3、输入和输出需要分别try,如果不那样的话,如果“写”出现异常,那么“读”也将无法关闭。或者在“写”关闭下再加一个finally,确保“写”出现异常,“读”也能进行关闭操作。

猜你喜欢

转载自2902702156.iteye.com/blog/2365443