总结
(一)关于文件的复制粘贴:
1、创建与文件路径有关的输入流、输出流,输入流可能抛出FileNotFoundException,输出流可能会抛出IOException异常,需要进行异常处理 输出流加true表追加
2、流要首先在try外声明,以便finally可操作
3、创建byte[]数组,避免频繁访问硬盘对硬盘造成伤害,同时提高效率
4、以循环的方式读,当读到文件末尾停止
5、读read() 写write() 都可能抛出IOException异常,都可以byte[]为参数 读会返回读入的个数,写要判断写入的个数
int read():返回读取的单个字符或字节的int值(0-255),若是文件末尾则返回-1
int read(byte[] bytes/char[] ch):读取多个字节或字符到数组中,返回读取的个数,若是文件末尾则返回-1
void write(byte[] bytes/char[] ch/String s,int off,int len):写一定要加偏置和长度
6、在循环体外要加flush()
7、关闭流,close()可能会抛出IOException异常
class Test {
public static void main(String[] args) {
FileInputStream fileInputStream=null;
FileOutputStream fileOutputStream=null;
try{
fileInputStream=new FileInputStream("F:\\workspace\\HelloWorld\\src\\Hello.java");
fileOutputStream=new FileOutputStream("F:\\Hello.java",true);
byte[] bytes=new byte[1024];
while(true)
{
int num=fileInputStream.read(bytes);
if(num==-1)
break;
fileOutputStream.write(bytes,0,num);
}
fileOutputStream.flush();
}catch(FileNotFoundException e)
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}finally{
if(fileInputStream!=null)
{
try{
fileInputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
if(fileOutputStream!=null)
{
try{
fileOutputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
(二)关于纯文本文件的复制粘贴:
class Test {
public static void main(String[] args) {
FileReader fileReader=null;
FileWriter fileWriter=null;
try{
fileReader=new FileReader("F:\\hh.txt");
fileWriter=new FileWriter("F:\\hhh.txt",true);
char[] ch=new char[512];
while(true)
{
int num=fileReader.read(ch);
if(num==-1)
break;
fileWriter.write(ch,0,num);
}
fileWriter.write("喔喔喔");
fileWriter.write("hello world",0,5);
fileWriter.flush();
}catch(FileNotFoundException e)
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}finally{
if(fileReader!=null)
{
try{
fileReader.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
if(fileWriter!=null)
{
try{
fileWriter.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
(三)java读取磁盘文件内容中的中文时会出现乱码,这是由于java使用的编码与被读取文件使用的编码不一致造成的:
解决方法一:通过System.out.println(System.getProperty(“file.encoding”));可查看JVM运行时所使用的编码,.txt文件默认使用ANSI编码,通过文件设置使两者编码一致
解决方法二:FileReader无法指定编码但InputStreamReader可以指定编码,通过new InputStreamReader(new FileInputStream(路径),对应于文件编码方式的java编码方式)
class Test {
public static void main(String[] args) {
FileInputStream fileReader=null;
InputStreamReader fInputStreamReader=null;
FileWriter fileWriter=null;
try{
fileReader=new FileInputStream("F:\\123.txt");
fInputStreamReader=new InputStreamReader(fileReader,"gb2312");//"gb2312"对应.txt中的ANSI
fileWriter=new FileWriter("F:\\hhh.txt",true);
char[] ch=new char[512];
while(true)
{
int num=fInputStreamReader.read(ch);
if(num==-1)
break;
fileWriter.write(ch,0,num);
}
fileWriter.write("喔喔喔");
fileWriter.write("hello world",0,5);
fileWriter.flush();
}catch(FileNotFoundException e)
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}finally{
if(fInputStreamReader!=null)
{
try{
fInputStreamReader.close();//关闭最外层即可
}catch(IOException e)
{
e.printStackTrace();
}
}
if(fileWriter!=null)
{
try{
fileWriter.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
解决方法三:使用FileInputStream读取字节后将字节转换为字符时添加编码方式
中文可以用Stream读取,但不能用Stream写
class Test {
public static void main(String[] args) {
FileInputStream fileInputStream=null;
try{
fileInputStream=new FileInputStream("F:\\123.txt");
byte[] bytes=new byte[1024];
while(true)
{
int num=fileInputStream.read(bytes);
if(num==-1)
break;
System.out.print(new String(bytes,0,num,"gb2312"));
}
}catch(FileNotFoundException e)
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}finally{
if(fileInputStream!=null)
{
try{
fileInputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
(四)
(五)BufferedWriter要加newLine()方法
(六)BufferedReader可以一行一行的读,FileReader不能一行一行的读
FileInputStream文件字节输入流
1、
F:\哈哈.txt:
public class Hello {
public static void main(String[] args) {
//1、创建流
FileInputStream fis=null;//因为要在finally里用到,所以必须在外面声明
try{
//FileInputStream fis=new FileInputStream("F:\\哈哈.txt");
fis=new FileInputStream("F:\\哈哈.txt");//抛出FileNotFoundException
//2、开始读
int a=fis.read();//抛出IOException
int b=fis.read();
int c=fis.read();
int d=fis.read();
int e=fis.read();
int f=fis.read();
int g=fis.read();
int h=fis.read();
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println(g);
System.out.println(h);
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
//3、关闭流
if(fis!=null)
{
try{
fis.close();//抛出IOException
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
控制台输出:
2、
public class Hello {
public static void main(String[] args) {
//1、创建流
FileInputStream fis=null;//因为要在finally里用到,所以必须在外面声明
try{
//FileInputStream fis=new FileInputStream("F:\\哈哈.txt");
fis=new FileInputStream("F:\\哈哈.txt");//抛出FileNotFoundException
//2、开始读
while(true)
{
int a=fis.read();
if(a==-1)
break;
System.out.println(a);
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
//3、关闭流
if(fis!=null)
{
try{
fis.close();//抛出IOException
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
控制台输出:
缺点:频繁地访问硬盘,对硬盘有伤害且效率低下
3、读取之前在内存中准备一个byte类型的数组(相当于缓存),其长度为允许每次读取的最多字节数,每次读取多个字节存放到byte数组中,效率高
public class Hello {
public static void main(String[] args) throws Exception{
//1、创建流
FileInputStream fileInputStream=new FileInputStream("F:\\哈哈.txt");
//2、准备byte数组,开始读
byte[] bytes= new byte[3];//允许最多读取三个字节 注意是最多
int a=fileInputStream.read(bytes);
System.out.println(new String(bytes));//bytes内存储的只是一个内存地址,要想输出内容,新建一个字符串对象
System.out.println("a:"+a);
int b=fileInputStream.read(bytes);
System.out.println(new String(bytes));
System.out.println("b:"+b);
int c=fileInputStream.read(bytes);
System.out.println(new String(bytes));
System.out.println(new String(bytes,0,c));//输出有效字节
System.out.println("c:"+c);
int d=fileInputStream.read(bytes);
System.out.println(new String(bytes));
System.out.println("d:"+d);
//3、关闭流
fileInputStream.close();
}
}
控制台输出:
4、用循环读取文件
public class Hello {
public static void main(String[] args) throws Exception{
FileInputStream fileInputStream=new FileInputStream("F:\\workspace\\hello\\src\\hello\\Hello.java");
byte[] bytes=new byte[1024];//一次读取1KB
while(true){
System.out.println("hh");
int temp=fileInputStream.read(bytes);
if(temp==-1)
break;
//将byte数组中的有效的数据转换为字符串 注意是有效的
System.out.print(new String(bytes,0,temp));//注意不要额外加换行
}
fileInputStream.close();
}
}
会进行两次循环
控制台输出:
FileOutputStream文件字节输出流
1、
public class Hello {
public static void main(String[] args) throws Exception{
FileOutputStream fileOutputStream=new FileOutputStream("haha",true);//追加写入
String string=new String("Hello World!");
byte[] bytes=string.getBytes();
fileOutputStream.write(bytes);
fileOutputStream.write(bytes,2,3);//写入byte数组的一部分
fileOutputStream.flush();
if(fileOutputStream!=null)
fileOutputStream.close();
}
}
运行结果:
2、
public class Hello {
public static void main(String[] args) {
FileOutputStream fileOutputStream=null;
try{
fileOutputStream=new FileOutputStream("haha",true);
String string=new String("Hello World!");
byte[] bytes=string.getBytes();
fileOutputStream.write(bytes);
fileOutputStream.write(bytes,2,3);
fileOutputStream.flush();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fileOutputStream!=null)
fileOutputStream.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
文件的复制粘贴
利用FileInputStream、FileOutputStream实现文件的复制粘贴
public class Hello {
public static void main(String[] args) throws Exception{
FileInputStream fileInputStream =new FileInputStream("haha.txt");
FileOutputStream fileOutputStream=new FileOutputStream("G:\\haha.txt");
byte[] bytes=new byte[1024];
int temp=-1;
//一边读一边写
while((temp=fileInputStream.read(bytes))!=-1)
{
fileOutputStream.write(bytes,0,temp);//要写入有效部分
}
fileOutputStream.flush();
if(fileInputStream!=null)
fileInputStream.close();
if(fileOutputStream!=null)
fileOutputStream.close();
}
}
FileReader文件字符输入流
public class Hello {
public static void main(String[] args) throws Exception{
FileReader fileReader =new FileReader("F:\\workspace\\hello\\src\\hello\\Example.java");
char[] ch=new char[512];//一次最多读入1KB
int temp=-1;
while((temp=fileReader.read(ch))!=-1)
{
System.out.print(new String(ch,0,temp));
}
if(fileReader !=null)
fileReader.close();
}
}
FileWriter文件字符输出流
public class Hello {
public static void main(String[] args) throws Exception{
FileWriter fileWriter =new FileWriter("G:\\hh.txt",true);
fileWriter .write("我是中国人");
char[] ch={'h','e','l','l','o','w','o','r','l','d'};
fileWriter .write(ch,0,5);
if(fileWriter !=null)
fileWriter.close();
}
}
纯文本 文件的复制粘贴
public class Hello {
public static void main(String[] args) throws Exception{
FileReader fileReader =new FileReader("F:\\workspace\\hello\\src\\hello\\Example.java");
FileWriter fileWriter =new FileWriter("G:\\Example.java",true);
char[] ch=new char[512];
int temp=-1;
while((temp=fileReader.read(ch))!=-1)
{
fileWriter.write(ch,0,temp);
}
fileWriter.write("Hello world");
fileWriter.flush();
if(fileReader!=null)
fileReader.close();
if(fileWriter!=null)
fileWriter.close();
}
}
不同点:
1、字节流一次读入中文字符的一半,字符流一次读入一个中文字符
2、字节流读到byte数组中,数组长度1024表示每次最多读入1KB;字符流读到char数组中,数组长度512表示每次最多读入1KB
3、字节流都可以读,字符流只能读纯文本