java中IO对文件操作

本文转载自很多作者
JAVA 中的IO流
1.首先得搞清楚流的概念:
   一个流,它有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。因此我们可以把流分两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。

两个概念:
结点流(node stream)
      特点:直接从指定的位置(如磁盘文件或内存区域)读或写
过滤器(filters)
      除结点流之外的流都是过滤器
       特点:往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流的原理也类似。

我们知道,io里面那些大大小小的关于文件操作的类很多,而且需要传入的参数可能是物理文件,也可能是某个对象。搞清上面两个概念后我们就能很清楚的知道在new一个文件类时该传什么样的参数。下面介绍流的另外一种分类,它是基于操作对象的类型分的。

流分类:
1.Java的字节流
   InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
2.Java的字符流
  Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new

JAVA字节流

     FileInputStream和FileOutputStream
      这两个类属于结点流,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。如:
       FileInputStream infile = new FileInputStream("myfile.dat");
      FileOutputStream outfile = new FileOutputStream("results.dat");

      要注意的是,构造FileInputStream, 对应的文件必须存在并且是可读的,而构造FileOutputStream时,如输出文件已存在,则必须是可覆盖的。

      BufferedInputStream和BufferedOutputStream
      它们是过滤器流,其作用是提高输入输出的效率。
       DataInputStream和DataOutputStream
      这两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流,它们允许程序按与机器无关的风格读写Java数据。所以比较适合于网络上的数据传输。这两个流也是过滤器流,常以其它流如InputStream或OutputStream作为它们的输入或输出。

Java的字符流 

    字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符串和字符,对应的字符流按输入和输出分别称为readers和writers。

    两种不现导向的stream之间的转换
      InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream
      例如:
      
Java代码 复制代码 收藏代码
  1. BufferedReader in   
  2.    = new BufferedReader(new InputStreamReader(System.in));   
  3.         
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  
   BufferedReader和BufferedWriter
    这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。
Java代码 复制代码 收藏代码
  1. import java.io.*;   
  2. public class Echo {   
  3.   public static void main(String[] args) {   
  4.     BufferedReader in =   
  5.       new BufferedReader(   
  6.         new InputStreamReader(System.in));   
  7.     String s;   
  8.     try {   
  9.       while((s = in.readLine()).length() != 0)   
  10.         System.out.println(s);   
  11.       // An empty line terminates the program   
  12.     } catch(IOException e) {   
  13.       e.printStackTrace();   
  14.     }   
  15.   }   
  16. }   
import java.io.*;public class Echo { public static void main(String[] args) { BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String s; try { while((s = in.readLine()).length() != 0) System.out.println(s); // An empty line terminates the program } catch(IOException e) { e.printStackTrace(); } }}

该程序接受键盘输入并回显。
对BufferedReader类,该类的readLine()方法能一次从流中读入一行,但对于BufferedWriter类,就没有一次写一行的方法,所以若要向流中一次写一行,可用PrintWriter类将原来的流改造成新的打印流,PrintWriter类有一个方法println(),能一次输出一行。如:
Java代码 复制代码 收藏代码
  1. ............   
  2. PrintWriter out = new PrintWriter(new BufferedWriter(   
  3.       new FileWriter("D:\javacode\test.txt")));   
  4. out.println("Hello World!");   
  5. out.close();   
  6. ............  
............PrintWriter out = new PrintWriter(new BufferedWriter( new FileWriter("D:\javacode\test.txt")));out.println("Hello World!");out.close();............




相关示例:

1,与控制台相关。的读入/写出。 实现了字符串的复制。
Java代码 复制代码 收藏代码
  1. import java.io.*;   
  2. public class TextRead{   
  3.   
  4. public static void main(String[] args){   
  5.    BufferedReader bf = null;/*BufferedReader相当于一个大桶,其实就是内存,这里实现了大量大量的读写 ,而不是读一个字节或字符就直接写如硬盘,加强了对硬盘的保护。*/  
  6.    try{   
  7.     while(true){ // while(true){}循环保证程序不会结束   
  8.        
  9.        bf = new BufferedReader(new InputStreamReader(System.in));   
  10.        /*System.in 为标准输入,System.out为标准输出*/  
  11.        /*InputStreamReader用语将字节流到字符流的转化,这也就是处理流了  
  12.         *在这里相当与2个管道接在System.in与程序之间。  
  13.         *readLine()方法功能比较好用,也就通过处理流来实现更好功能。  
  14.         **/  
  15.      String line = bf.readLine();   
  16.      System.out.println(line);   
  17.     }     
  18.    }catch(Exception e){   
  19.     e.printStackTrace();   
  20.    }finally{   
  21.     //一定要关闭流,用完后。最好放在   
  22.   
  23. filally 里面。     
  24.     try{      
  25.      if(bf!=null){   
  26.       bf.close();   
  27.      }   
  28.     }catch(Exception e){   
  29.        e.printStackTrace();   
  30.     }   
  31.        
  32.    }   
  33.       
  34. }   
  35.   
  36. }  
import java.io.*;public class TextRead{public static void main(String[] args){ BufferedReader bf = null;/*BufferedReader相当于一个大桶,其实就是内存,这里实现了大量大量的读写 ,而不是读一个字节或字符就直接写如硬盘,加强了对硬盘的保护。*/ try{ while(true){ // while(true){}循环保证程序不会结束 bf = new BufferedReader(new InputStreamReader(System.in)); /*System.in 为标准输入,System.out为标准输出*/ /*InputStreamReader用语将字节流到字符流的转化,这也就是处理流了 *在这里相当与2个管道接在System.in与程序之间。 *readLine()方法功能比较好用,也就通过处理流来实现更好功能。 **/ String line = bf.readLine(); System.out.println(line); } }catch(Exception e){ e.printStackTrace(); }finally{ //一定要关闭流,用完后。最好放在filally 里面。 try{ if(bf!=null){ bf.close(); } }catch(Exception e){ e.printStackTrace(); } } }}


2,与文件 相关的 读写。    实现了文件的复制。

Java代码 复制代码 收藏代码
  1. import java.io.*;   
  2. public class TextRead{   
  3.   
  4. public static void main(String[] args){   
  5.    File fin,fout;     
  6.    BufferedReader bf = null;   
  7.    PrintWriter pw = null;   
  8.    try{   
  9.     fin = new File("zzc.txt"); //注意文件与程序都要在同一个文件夹下。zzc.txt为要被复制的文件。   
  10.       
  11.     fout = new File("copyzzc.txt"); //如果没有会自动创建。   
  12.       
  13.     bf = new BufferedReader(new FileReader(fin));   
  14.       
  15.       pw = new PrintWriter(fout); //PrintWriter为打印流,也可以使用BufferedWriter.   
  16.     String line = bf.readLine();   
  17.     while(line!=null){   
  18.      pw.println(line);   
  19.        
  20.      line = bf.readLine();   
  21.     }   
  22.       
  23.       
  24.    }catch(Exception e){   
  25.     e.printStackTrace();   
  26.       
  27.    }finally{   
  28.     try{   
  29.     //关闭 文件。   
  30.      if(bf!=null){   
  31.       bf.close();   
  32.       bf = null;   
  33.      }   
  34.      if(pw!=null){   
  35.       pw.close();   
  36.       pw = null;   
  37.      }   
  38.     }catch(Exception e){   
  39.      e.printStackTrace();   
  40.     }   
  41.    }   
  42.       
  43. }   
  44.   
  45. }  
Java中对文件的操作   
    
java中提供了io类库,可以轻松的用java实现对文件的各种操作。下面就来说一下如何用java来实现这些操作。   
    
1。新建目录  
   
  <%@   page   contentType="text/html;charset=gb2312"%>  
  <%  
  String   filePath="c:/aaa/";  
  filePath=filePath.toString();//中文转换  
  java.io.File   myFilePath=new   java.io.File(filePath);  
  if(!myFilePath.exists())  
  myFilePath.mkdir();  
  %>  
   
      2。新建文件  
   
  <%@   page   contentType="text/html;charset=gb2312"%>  
  <%@   page   import="java.io.*"   %>  
  <%  
  String   filePath="c:/哈哈.txt";  
  filePath=filePath.toString();  
  File   myFilePath=new   File(filePath);  
  if(!myFilePath.exists())  
  myFilePath.createNewFile();  
  FileWriter   resultFile=new   FileWriter(myFilePath);  
  PrintWriter   myFile=new   PrintWriter(resultFile);  
  String   strContent   =   "中文测试".toString();  
  myFile.println(strContent);  
  resultFile.close();  
  %>  
   
    3。删除文件  
   
  <%@   page   contentType="text/html;charset=gb2312"%>  
  <%  
  String   filePath="c:/支出证明单.xls";  
  filePath=filePath.toString();  
  java.io.File   myDelFile=new   java.io.File(filePath);  
  myDelFile.delete();  
  %>  
   
    4。文件拷贝  
   
  <%@   page   contentType="text/html;   charset=gb2312"   %>  
  <%@   page   import="java.io.*"   %>  
  <%  
  int   bytesum=0;  
  int   byteread=0;    
  file://读到流中  
  InputStream   inStream=new   FileInputStream("c:/aaa.doc");  
  FileOutputStream   fs=new   FileOutputStream(   "d:/aaa.doc");byte[]     buffer   =new     byte[1444];  
  int   length;  
  while   ((byteread=inStream.read(buffer))!=-1)  
    {  
        out.println("<DT><B>"+byteread+"</B></DT>");  
        bytesum+=byteread;  
        System.out.println(bytesum);  
        fs.write(buffer,0,byteread);  
    }    
  inStream.close();    
  %>  
   
    5。整个文件夹拷贝  
   
  <%@   page   contentType="text/html;charset=gb2312"%>  
  <%@   page   import="java.io.*"   %>  
  <%String   url1="C:/aaa";  
      String   url2="d:/java/";  
      (new   File(url2)).mkdirs();  
    File[]   file=(new   File(url1)).listFiles();  
    for(int   i=0;i<file.length;i++){  
      if(file[i].isFile()){  
        file[i].toString();  
        FileInputStream   input=new   FileInputStream(file[i]);  
        FileOutputStream   output=new   FileOutputStream(url2+"/"+(file[i].getName()).toString());  
        byte[]   b=new   byte[1024*5];  
          int   len;  
          while((len=input.read(b))!=-1){  
          output.write(b,0,len);  
          }  
          output.flush();  
          output.close();  
          input.close();  
      }  
    }  
  %>    
   
    6。文件下载  
   
  <%@   page   contentType="text/html;   charset=gb2312"   %>  
  <%@   page   import="java.io.*"   %>  
  <%  
      String   fileName   =   "zsc104.swf".toString();  
  //读到流中  
  InputStream   inStream=new   FileInputStream("c:/zsc104.swf");  
  //设置输出的格式    
      response.reset();    
      response.setContentType("bin");  
      response.addHeader("Content-Disposition","attachment;   filename=""   +   fileName   +   """);  
  //循环取出流中的数据    
      byte[]   b   =   new   byte[100];    
      int   len;    
      while((len=inStream.read(b))   >0)    
      response.getOutputStream().write(b,0,len);      
      inStream.close();    
  %>  
   
    7。数据库字段中的文件下载  
   
  <%@   page   contentType="text/html;   charset=gb2312"   %>  
  <%@   page   import="java.sql.*"%>  
  <%@   page   import="java.lang.*"   %>  
  <%@   page   import="java.io.*"   %>  
  <%@   page   import="com.jspsmart.upload.*"   %>  
  <%@   page   import="DBstep.iDBManager2000.*"%>  
  <%  
  int   bytesum=0;  
  int   byteread=0;  
  //打开数据库  
  ResultSet   result=null;  
  String   Sql=null;  
  PreparedStatement   prestmt=null;    
  DBstep.iDBManager2000   DbaObj=new   DBstep.iDBManager2000();  
  DbaObj.OpenConnection();  
  //取得数据库中的数据  
  Sql="select     *     from     t_local_zhongzhuan   ";  
  result=DbaObj.ExecuteQuery(Sql);  
  result.next();  
   
  file://将数据库中的数据读到流中    
  InputStream   inStream=result.getBinaryStream("content");    
  FileOutputStream   fs=new   FileOutputStream(   "c:/dffdsafd.doc");  
   
  byte[]     buffer   =new     byte[1444];  
  int   length;  
  while   ((byteread=inStream.read(buffer))!=-1)  
      {  
            out.println("<DT><B>"+byteread+"</B></DT>");  
            bytesum+=byteread;  
            System.out.println(bytesum);  
            fs.write(buffer,0,byteread);  
            }  
  %>  
   
    8。把网页保存成文件  
   
  <%@   page   import="java.text.*"%>  
  <%@   page   import="java.util.*"%>  
  <%@   page   import="java.io.*"%>  
  <%@   page   import="java.net.*"%>  
  <%  
    URL   stdURL   =   null;  
    BufferedReader   stdIn   =   null;  
    PrintWriter   stdOut   =   null;  
    try   {  
      stdURL   =   new   URL("http://www.163.com");  
    }  
    catch   (MalformedURLException   e)   {  
        throw   e;  
    }  
   
  try   {  
        stdIn   =   new   BufferedReader(new   InputStreamReader(stdURL.openStream()));  
        stdOut   =   new   PrintWriter(new   BufferedWriter(new   FileWriter("c:/163.html")));  
    }  
    catch   (IOException   e)   {  
    }  
   
    /***把URL指定的页面以流的形式读出,写成指定的文件***/  
    try   {  
        String   strHtml   =   "";  
        while((strHtml   =   stdIn.readLine())!=null)   {  
        stdOut.println(strHtml);  
        }  
    }  
    catch   (IOException   e)   {  
        throw   e;  
    }  
    finally   {  
        try   {  
            if(stdIn   !=   null)  
                stdIn.close();  
            if(stdOut   !=   null)  
                stdOut.close();  
        }  
        catch   (Exception   e)   {  
            System.out.println(e);  
        }  
    }  
  %>  
   
    9。直接下载网上的文件  
   
  <%@   page   import="java.io.*"%>  
  <%@   page   import="java.net.*"%>  
  <%  
  int   bytesum=0;  
  int   byteread=0;  
   
  URL   url   =   new   URL("http://pimg.163.com/sms/micheal/logo.gif");  
    URLConnection   conn   =   url.openConnection();  
    InputStream   inStream   =   conn.getInputStream();  
    FileOutputStream   fs=new   FileOutputStream(   "c:/abc.gif");  
   
      byte[]     buffer   =new     byte[1444];  
        int   length;  
          while   ((byteread=inStream.read(buffer))!=-1)  
          {  
                out.println("<DT><B>"+byteread+"</B></DT>");  
                bytesum+=byteread;  
                System.out.println(bytesum);  
                fs.write(buffer,0,byteread);  
            }  
  %>  
   
   
  10。按行读文件    
   
  <%@   page   contentType="text/html;   charset=gb2312"   %>   <%@   page   import="java.io.*"   %>   <%   FileReader   myFileReader=new   FileReader("c:/哈哈.txt");   BufferedReader   myBufferedReader=new   BufferedReader(myFileReader);   String   myString=null;   String   resultString=new   String();   while((myString=myBufferedReader.readLine())!=null)   {   resultString=resultString+myString+"<br>";   }   out.println(resultString);   myFileReader.close();   %>
 
 
Java中各种文件类型操作的代码与详细文件IO讲解
首先我们来看代码:
//几乎所有常用文件操作的示例代码
import java.io.*;
public class TestIO{
public static void main(String[] args)
throws IOException{
//1.以行为单位从一个文件读取数据
BufferedReader in =
new BufferedReader(
new FileReader("F://nepalon//TestIO.java"));
String s, s2 = new String();
while((s = in.readLine()) != null)
s2 += s + "/n";
in.close();
//1b. 接收键盘的输入
BufferedReader stdin =
new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Enter a line:");
System.out.println(stdin.readLine());
//2. 从一个String对象中读取数据
StringReader in2 = new StringReader(s2);
int c;
while((c = in2.read()) != -1)
System.out.println((char)c);
in2.close();
//3. 从内存取出格式化输入
try{
DataInputStream in3 =
new DataInputStream(
new ByteArrayInputStream(s2.getBytes()));
while(true)
System.out.println((char)in3.readByte());
}
catch(EOFException e){
System.out.println("End of stream");
}
//4. 输出到文件
try{
BufferedReader in4 =
new BufferedReader(
new StringReader(s2));
PrintWriter out1 =
new PrintWriter(
new BufferedWriter(
new FileWriter("F://nepalon// TestIO.out")));
int lineCount = 1;
while((s = in4.readLine()) != null)
out1.println(lineCount++ + ":" + s);
out1.close();
in4.close();
}
catch(EOFException ex){
System.out.println("End of stream");
}
//5. 数据的存储和恢复
try{
DataOutputStream out2 =
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("F://nepalon// Data.txt")));
out2.writeDouble(3.1415926);
out2.writeChars("/nThas was pi:writeChars/n");
out2.writeBytes("Thas was pi:writeByte/n");
out2.close();
DataInputStream in5 =
new DataInputStream(
new BufferedInputStream(
new FileInputStream("F://nepalon// Data.txt")));
BufferedReader in5br =
new BufferedReader(
new InputStreamReader(in5));
System.out.println(in5.readDouble());
System.out.println(in5br.readLine());
System.out.println(in5br.readLine());
}
catch(EOFException e){
System.out.println("End of stream");
}
//6. 通过RandomAccessFile操作文件
RandomAccessFile rf =
new RandomAccessFile("F://nepalon// rtest.dat", "rw");
for(int i=0; i<10; i++)
rf.writeDouble(i*1.414);
rf.close();
rf = new RandomAccessFile("F://nepalon// rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();
rf = new RandomAccessFile("F://nepalon// rtest.dat", "rw");
rf.seek(5*8);
rf.writeDouble(47.0001);
rf.close();
rf = new RandomAccessFile("F://nepalon// rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();
}
}
关于代码的解释(以区为单位):
1区中,当读取文件时,先把文件内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称"缓存字节读取方式")。
1b区中,由于想以缓存字节读取方式从标准IO(键盘)中读取数据,所以要先把标准IO(System.in)转换成字符导向的stream,再进行BufferedReader封装。
2区中,要以字符的形式从一个String对象中读取数据,所以要产生一个StringReader类型的stream。
4区中,对String对象s2读取数据时,先把对象中的数据存入缓存中,再从缓冲中进行读取;对TestIO.out文件进行操作时,先把格式化后的信息输出到缓存中,再把缓存中的信息输出到文件中。
5区中,对Data.txt文件进行输出时,是先把基本类型的数据输出屋缓存中,再把缓存中的数据输出到文件中;对文件进行读取操作时,先把文件中的数据读取到缓存中,再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble(),所以为了正确显示。也要以基本类型的形式进行读取。
6区是通过RandomAccessFile类对文件进行操作。
讲解部分:
Input和Output
  1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:
    1.1 以字节为导向的stream
      以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:
      1) input stream:
 1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
 2) StringBufferInputStream:把一个String对象作为InputStream
 3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
 4) PipedInputStream:实现了pipe的概念,主要在线程中使用
 5) SequenceInputStream:把多个InputStream合并为一个InputStream
      2) Out stream
 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
 2) FileOutputStream:把信息存入文件中
 3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
 4) SequenceOutputStream:把多个OutStream合并为一个OutStream
  1.2 以Unicode字符为导向的stream
    以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:
    1) Input Stream
 1) CharArrayReader:与ByteArrayInputStream对应
 2) StringReader:与StringBufferInputStream对应
 3) FileReader:与FileInputStream对应
 4) PipedReader:与PipedInputStream对应
    2) Out Stream
 1) CharArrayWrite:与ByteArrayOutputStream对应
 2) StringWrite:无与之对应的以字节为导向的stream
 3) FileWrite:与FileOutputStream对应
 4) PipedWrite:与PipedOutputStream对应
  以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。
  1.3 两种不现导向的stream之间的转换
    InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
  2. stream添加属性
    2.1 "为stream添加属性"的作用
 运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。
 如果我们要往一个文件中写入数据,我们可以这样操作:
 FileOutStream fs = new FileOutStream("test.txt");
 然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现"先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中"的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类,为FileOutStream添加我们所需要的功能。
   2.2 FilterInputStream的各种类型
    2.2.1 用于封装以字节为导向的InputStream
 1) DataInputStream:从stream中读取基本类型(int、char等)数据。
 2) BufferedInputStream:使用缓冲区
 3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)
 4) PushbackInputStream:很少用到,一般用于编译器开发
    2.2.2 用于封装以字符为导向的InputStream
 1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
 2) BufferedReader:与BufferedInputStream对应
 3) LineNumberReader:与LineNumberInputStream对应
 4) PushBackReader:与PushbackInputStream对应
  2.3 FilterOutStream的各种类型
    2.2.3 用于封装以字节为导向的OutputStream
 1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
 2) BufferedOutStream:使用缓冲区
 3) PrintStream:产生格式化输出
    2.2.4 用于封装以字符为导向的OutputStream
 1) BufferedWrite:与对应
 2) PrintWrite:与对应
3. RandomAccessFile
 1) 可通过RandomAccessFile对象完成对文件的读写操作
 2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
 3) 可以直接跳到文件中指定的位置
 
 
原理:BufferedReader会一次性从物理流中读取8k(默认数值,可以设置)字节内容到内存,如果外界有请求,就会到这里存取,如果内存里没有才到物理流里再去读。即使读,也是再8k。  
  而直接读物理流,是按字节来读。  
  对物理流的每次读取,都有IO操作。IO操作是最耗费时间的。    
  BufferedReader就是减少了大量IO操作,而为你节省了时间。  
   简单的说,一次IO操作,读取一个字节也是读取,读取8k个字节也是读取,两者花费时间相差不多。而一次IO的来回操作却要耗费大量时间。  
  好比是一辆大型汽车(设装100人),要去车站接人到公司,接一个人也是接,接100个人也是接,而时间一样。显然,接100个人最划算。
  物理流就是一次一个字节(一个人)  
  Buffered就是一次8k个字节(100个人)  
  对于读取定长字节文件,当然BufferedReader更快了!



Java代码 复制代码 收藏代码
  1.   
  2.   
  3. import java.io.*;   
  4. public class Test11 {   
  5.     private static BufferedReader br = null;   
  6.     private static File file = null;   
  7.     private static BufferedWriter bw = null;   
  8.     public static void main(String[] args) {   
  9.         String b = null;   
  10.         file = new File("D:\\abc.txt");   
  11.         if (!file.exists() != false) {   
  12.             try {   
  13.                 file.createNewFile();   
  14.                    
  15.             } catch (IOException e) {   
  16.                 e.printStackTrace();   
  17.             }   
  18.           }   
  19.          try {   
  20.             bw = new BufferedWriter(new FileWriter(file));   
  21.             FileReader fr = new FileReader("D:\\Log.txt");   
  22.             br = new BufferedReader(fr);   
  23.             while ((b = br.readLine()) != null) {   
  24.                 System.out.println(b);   
  25.                 bw.write(b);//输出字符串   
  26.                 bw.newLine();//换行   
  27.                 bw.flush();   
  28.             }   
  29.         } catch (Exception e) {   
  30.             e.printStackTrace();   
  31.         }finally {   
  32.             try {   
  33.                 br.close();   
  34.                 //bw.close();   
  35.             } catch (IOException e) {   
  36.                 e.printStackTrace();   
  37.             }   
  38.         }   
  39.     }   
  40.   
  41.   
  42. }  
 
 
 
 
  1. import java.io.*;   
  2.   
  3. public class test {   
  4.   
  5.     /**  
  6.      * @param args  
  7.      */  
  8.     public static void main(String[] args) {   
  9.         String path="e://a.txt";   
  10.         try {   
  11.             FileWriter fw=new FileWriter(path,true);   
  12.             PrintWriter pw=new PrintWriter(fw);   
  13.             pw.println("世界");   
  14.             pw.close();   
  15.             //bw.close();   
  16.             fw.close();   
  17.         } catch (IOException e) {   
  18.             // TODO Auto-generated catch block   
  19.             e.printStackTrace();   
  20.         }   
  21.        }   
  22. }  
import java.io.*;public class test { /** * @param args */public static void main(String[] args) { String path="e://a.txt"; try {FileWriter fw=new FileWriter(path,true);PrintWriter pw=new PrintWriter(fw); pw.println("世界"); pw.close();//bw.close(); fw.close(); } catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace(); } }}
 
2.以BufferedWriter来实现写入
 
Java代码 复制代码 收藏代码
  1. import java.io.*;    
  2.   
  3. public class test {    
  4.     /** * @param args */    
  5.    public static void main(String[] args) {    
  6.            String path="e://a.txt";    
  7.            try {    
  8.                 FileWriter fw=new FileWriter(path,true);    
  9.                 BufferedWriter bw=new BufferedWriter(fw);    
  10.                 bw.newLine();    
  11.     bw.write("Hello");    
  12.     bw.newLine();    
  13.     bw.write("世界");    
  14.     bw.close();   
  15.      fw.close();    
  16.          } catch (IOException e) {    
  17.               // TODO Auto-generated catch block    
  18.              e.printStackTrace();    
  19.           }    
  20.   }   
import java.io.*; public class test { /** * @param args */ public static void main(String[] args) { String path="e://a.txt"; try { FileWriter fw=new FileWriter(path,true); BufferedWriter bw=new BufferedWriter(fw); bw.newLine(); bw.write("Hello"); bw.newLine(); bw.write("世界"); bw.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Java代码 复制代码 收藏代码
  1. }    
  2. 读文件用BufferedReader br = new BufferedReader( new FileReader(new File("e://a.txt")));   
  3.  br.readLine();//一行一行的读  
 
 
 
java中很多关于文件读取的工作。
操作也很平凡。
所以java的文件读取是很重要的一部分。
首先是单字节的读取工作。
见源代码:
java中很多关于文件读取的工作。
操作也很平凡。
所以java的文件读取是很重要的一部分。
首先是单字节的读取工作。
见源代码:
 
 1package ReadFile;
 2
 3import java.io.FileReader;
 4import java.io.IOException;
 5
 6public class readFile {
 7    public static void readfile(String file){
 8        try{
 9            FileReader fr = new FileReader(file);
10            int ch = 0;
11            while((ch=fr.read())!=-1){
12                System.out.println((char)ch);
13            }
14        }catch(IOException e){
15            e.printStackTrace();
16        }
17    }
18    public static void main(String[] args) {
19        readfile("e:\\dd.txt");
20    }
21}
 

这里是但读取每个自己或字符。
如果要进行按行读取的话,必须采用BufferedReader  BufferedReader中的readline();
 
 1package ReadLime;
 2
 3import java.io.BufferedReader;
 4import java.io.BufferedWriter;
 5import java.io.FileReader;
 6import java.io.FileWriter;
 7import java.io.IOException;
 8
 9public class readLine {
10    public static void readline(String file,String writerfile){
11        try{
12        FileReader fr = new FileReader(file);
13        BufferedReader br = new BufferedReader(fr);
14        
15        FileWriter fw = new FileWriter(writerfile); //写文件操作,把得到的file对应的文件中内容写入,writerfile中去。
16        BufferedWriter bw = new BufferedWriter(fw);
17        String readoneline;
18        int l;
19        while((l = br.read()) != -1){
20            readoneline = br.readLine();
21            bw.write(readoneline);
22            bw.newLine();
23            System.out.println(readoneline);
24        }
25        bw.flush();
26        br.close();
27        bw.close();
28        br.close();
29        fw.close();
30        fr.close();
31        }catch(IOException e){
32            e.printStackTrace();
33        }
34    }
35    public static void main(String [] args){
36        readline("e:\\dd.txt","e:\\aa.txt");
37    }
38}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值