目录
如果要用输入输出流复制某一个文件的内容,就是将以上两个操作结合起来,具体步骤如下:
注意点2(对于FileReader和FileWriter):
FileInputStream和FileOutputStream
FileReader和FileWriter
FileReader的使用:
步骤:
注意:
-
读取时有一些地方要进行异常处理,若使用throws的方式,出现异常时会导致后面的close操作无法执行,可能导致内存的泄露。要将指定代码放入try-catch-finally结构中(close的操作放进finally中)。
-
若fileRead为null,则并没有读取的操作,不用进行流资源的关闭,所以要在close处加判断。
操作的代码如下:
public void test12()
{
FileReader fileReader = null;
try
{
//①创建File类的对象,对应着hello.txt的文件
File ff = new File("hello.txt");
//②创建输入型的字符流,用于读取数据
fileReader = new FileReader(ff);
//③读取数据,并显示在控制台上。
char[] cbuffer = new char[5];
int len;
while ((len = fileReader.read(cbuffer)) != -1)
{
for (int i = 0; i < len; i++)
{
System.out.print(cbuffer[i]);
}
}
} catch (IOException e)
{
e.printStackTrace();
}
finally
{
//④流资源的关闭(必须要资源关闭,否则会内存泄露)
//要使用try-catch-finally的方式,将close放在finally中,确保资源一定被关闭。
try
{
if(fileReader != null)
{
fileReader.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
FileWriter的操作:
步骤:
注意1:
-
与FileReader类似,输出时有一些地方要进行异常处理,若使用throws的方式,出现异常时会导致后面的close操作无法执行,可能导致内存的泄露。要将指定代码放入try-catch-finally结构中(close的操作放进finally中)。
-
在new FileWriter( )构造器中,在参数加了指定的File对象后,若参数再加上true,则对File对象代表的文件是做追加操作,即在原来的文件上增加输出内容。 若不加上boolean的参数,则默认为添加了false。添加false,则File对象代表的文件是做覆盖操作,即原来的内容全被输出的内容替代。
操作的代码如下:
public void test2()
{
FileWriter fw = null;
try
{
//①创建File的对象,指明要写出的文件的名称
File ff = new File("sigma.txt");
//②创建输出流
fw = new FileWriter(ff);//若参数中加上true,则文件为可追加,在原有的文件中加上内容
//若参数中没有true或false,默认为false,即不可追加,对文件进行覆盖
//③写出具体的输出过程
//输出的方法:write(String str)/write(char[] cdata)
fw.write("I'm a sigma mam\n");
fw.write("Will never fall into women's trick\n" );
fw.write("Never be a low dog");
System.out.println("输出成功");
} catch (IOException e)
{
e.printStackTrace();
}
finally
{
//④关闭资源
try
{
if (fw != null)
{
fw.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
如果要用输入输出流复制某一个文件的内容,就是将以上两个操作结合起来,具体步骤如下:
public void Test33()
{
FileReader fr = null;
FileWriter fw = null;
try
{
//1.创建File的对象
File src = new File("hello.txt");
File dest = new File("hello_copy.txt");
//2.创建输入流和输出流
fr = new FileReader(src);
fw = new FileWriter(dest);
//3.数据的读入和写入的过程
char[] cbuffer = new char[5];
int len;//记录每次读入到cbuffer中的字符的个数
while((len = fr.read(cbuffer)) != -1)
{
//write(char[] cbuffer,int fromIndex,int len)读取cbuffer中的fromIndex的下标到len下标的元素的内容
fw.write(cbuffer,0,len);
}
System.out.println("复制成功");
} catch (IOException e)
{
e.printStackTrace();
} finally
{
//4.关闭资源
try
{
if (fr != null)
{
fr.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if(fw != null)
{
fw.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
注意点2(对于FileReader和FileWriter):
①因为涉及到流资源的关闭操作,所以出现异常,需要使用try-catch-finally的方式来处理异常。
②对于输入流来讲,要求File类的对象对应的物理磁盘上的文件必须存在。否则,会报FileNotFoundException异常。
对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在。
·如果此文件不存在,则在输出的过程中,会自动创建此文件,并写出数据到此文件中。
·如果此文件存在,根据FileWriter的构造器来决定追加还是覆盖(见上面的注意点1)。
FileInputStream和FileOutputStream
但是,字符流不适合用来处理非文本文件,便要用到字节流。
字节流的使用步骤也与字符流类似:
1.创建相关File类的对象
2.创建相关的字节流
3.数据的读写操作
读入:read(byte[ ] cbffer)
写出:write(byte[ ] cbuffer,0,len)
4.关闭资源
如要复制一份图片文件,操作如下:
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
//1.创建相关File类的对象
File srcFile = new File("输入流的图片文件.jpg");
File destFile = new File("输出流的成功文件.jpg");
//2.创建相关的字节流
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(destFile);
//3.数据的读写操作
byte[] buffer = new byte[1024];//1kb
int len;//记录每次读入到buffer中的字节的个数
while((len = fis.read(buffer)) != -1)
{
fos.write(buffer,0,len);
}
} catch (IOException e)
{
e.printStackTrace();
} finally
{
//4.关闭资源
try
{
if(fis != null)
{
fis.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if(fos != null)
{
fos.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
注意点3(在注意点2的基础上):
字节流用来操作文本文件时,如果是复制操作,不会出问题。如果是读取操作,可能会出现问题(因为文本文件的读取操作中涉及到比如汉字的信息时,由于汉字在Unicode编码中占三个字节,不是相应汉字的三个字节一起读取时,会出现乱码,此时应该使用字符流来操作)。
说明:
文本文件:.txt、.java、.c、.cpp 等
非文本文件:.doc、.xlc、.jpg、.pdf、.mp3 等