Java文件讀寫數據流大全(InputStream、OutputStream、FileInpuStream)


Java文件讀寫數據流大全(InputStream、OutputStream、FileInpuStream) - wolfgangkiefer的日志 - 網易博客

Java文件讀寫數據流大全(InputStream、OutputStream、FileInpuStream)   

 

2011-09-27 09:53:33|  分類:
java
|  標簽:java文件讀寫  數據流  inputstream  outputstream  fileoutputstream  

|字號  訂閱

數據流可分節點流(想象成一管子直接接文件或內存等上),處理流(套在節點流之外使用).

一、理解數據流:
流一般分為輸入流Input Stream和輸出流Output Stream.
Java的標准數據流:
指在字符方式下,程序與系統進行交互的方式.標准輸入studin,對象是鍵盤.標准輸出stdout,對象是屏幕.標准錯誤輸出stderr,對象是屏幕.

例:
本例用System.in.read(buffer)從鍵盤輸入一行字符,存儲在緩沖區buffer中,count保存實際讀入的字節個數,再以整數和字符兩種方式輸出buffer中的值.
import java.io.*;
public class Input1
{
        public static void main(String args[]) throws IOException
        {
             System.out.println("Input: ");
             byte buffer[]=new byte[512];      //輸入緩沖區
             int count=System.in.read(buffer);       //讀取標准輸入流
             System.out.println("Output: ");
             for (int i=0;i<count;i++)        //輸出buffer元素值
             {
                 System.out.print(" "+buffer[i]);
             }
             System.out.println();
             for (int i=0;i<count;i++)      //按字符方式輸出buffer
             {
                 System.out.print((char)buffer[i]);
             }
             System.out.println("count="+count);
        }
}
程序中,main方式采用throws子句拋出IOException異常交由系統處理.

字節流:
從InputStream和OutputStream派生出來的一系列類.這類流以字節byte為基本處理單位
          FileInputStream      FileOutputStream
          PipedInputStream      PipedOutputStream
          ByteArrayInputStream ByteArrayOutputStream
          FilterInputStream      FilterOutputStream
          DataInputStream      DataOutputStream
          BufferedInputStream BufferedOutputStream
字符流:
從Reader和Writer派生出來的一系列類,以16位的Unicode碼表示的字符為基本處理單位
InputStreadmReader      OutputStreadmWriter
FileReader      FileWriter
CharArrayReader CharArrayWriter
PipedReader PipedWriter
FilterReader      FilterWriter
BufferedReader BufferedWriter
StringReader      StringWriter

字節流初步:
read() 從流中讀入數據
skip() 跳過流中若干字節數
available() 返回流中可用字節數
mark() 在流中標記一個位置
reset() 返回標記過得位置
markSupport() 是否支持標記和復位操作
close()
write()      輸出到流
flush() 刷空輸出流

例:
本例以FileInpuStream的read(buffer)方法,每次從源程序文件OpenFile.java中讀取512個字節,存儲在緩沖區buffer中,再將以buffer中的值構造的字符串new String(buffer)顯示在屏幕上
import java.io.*;
public class OpenFile
{
        public static void main(String args[]) throws IOException
        {
            try
            {
                 FileInputStream rf=new FileInputStream("OpenFIle.java");
                 int n=512;
                 byte buffer[]=new byte[n];
                 while      ((rf.read(buffer,0,n)!=1)&&(n>0))
                 {
                      System.out.print(new String(buffer));
                  }
                  System.out.println();
                  rf.close();
             }
             catch(IOException ioe)
             { System.out.println(ioe); }
             catch(Exception e)
             { System.out.println(e); }
        }
}
例:寫入文件
本例用System.in.read(buffer)從鍵盤輸入一行字符,存儲在緩沖區buffer中,再以FileOutStream的writer(buffer)方法,將buffer中內容寫入文件中.
import java.io.*;
public class Writer
{
       public static void main(String args[])
       {
          try
          {
              System.out.print("Input: ");
              int count,n=512;
              byte buffer[]=new byte[n];
              count=System.in.read(buffer);
              FileOuputStream wf=new FileOutputStream("Writer.txt");
              wf.write(buffer,0,count);
              wf.close();
          }
          catch(Exception e)
          { System.out.print(e); }
}

FileInputStream、FileOutputStream綜合示例:

import java.io.*;

public class FileStream {
    public static void main(String[] args) throws Exception{
      FileOutputStream out=new FileOutputStream("Myhello.txt");
      out.write("Welcome to 香巴拉空間~".getBytes());
      out.close();
      byte [] buf=new byte[1024];
      File f=new File("Myhello.txt");
      FileInputStream in=new FileInputStream(f);
      int len=in.read(buf);
      System.out.println(new String(buf,0,len));
      in.close();
    }
}

字符流: Reader Writer

FileReader 、FileWriter應用示例:

mport java.io.*;

public class FileStream2 {
   public static void main(String[] args) throws Exception{
//     FileStream2 filestream2 = new FileStream2();
       FileWriter out=new FileWriter("File_tmp2.txt");
       out.write("歡迎來到香巴拉空間~ , FileWriter");
       out.close();
       char [] buf=new char[1024];
       FileReader in=new FileReader("File_tmp2.txt");
       int len=in.read(buf);
       System.out.println(new String(buf,0,len));      
    }
}

例: 文件編輯器
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class EditFile1 extends WindowAdapter implements ActionListener,TextListener
{
       Frame f;
       TextArea ta1;
       Panel p1;
       TextField tf1;
       Button b1,b2,b3;
       FileDialog fd;
       File file1=null;
public static void main(String args[])
{
(new EditFile1()).display();
}
public void display()
{
f = new Frame("EditFile");
f.setSize(680,400);
f.setLocation(200,140);
f.setBackground(Color.lightGray);
f.addWindowListener(this);
tf1 = new TextField();
tf1.setEnabled(false);
tf1.setFont(new Font("Dialog",0,20)); //設置文本行的初始字體
f.add(tf1,"North");
ta1 = new TextArea();
ta1.setFont(new Font("Dialog",0,20)); //設置文本區的初始字體
f.add(ta1);
ta1.addTextListener(this); //注冊文本區的事件監聽程序
p1 = new Panel();
p1.setLayout(new FlowLayout(FlowLayout.LEFT));
b1 = new Button("Open");
b2 = new Button("Save");
b3 = new Button("Save As");
p1.add(b1);
p1.add(b2);
p1.add(b3);
b2.setEnabled(false);
b3.setEnabled(false);
b1.addActionListener(this); //注冊按鈕的事件監聽程序
b2.addActionListener(this);
b3.addActionListener(this);
f.add(p1,"South");
f.setVisible(true);
}
public void textValueChanged(TextEvent e)
{ //實現TextListener接口中的方法,對文本區操作時觸發
b2.setEnabled(true);
b3.setEnabled(true);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==b1) //單擊[打開]按鈕時
{
fd = new FileDialog(f,"Open",FileDialog.LOAD);
fd.setVisible(true); //創建並顯示打開文件對話框
if ((fd.getDirectory()!=null) && (fd.getFile()!=null))
{
tf1.setText(fd.getDirectory()+fd.getFile());
try //以緩沖區方式讀取文件內容
{
file1 = new File(fd.getDirectory(),fd.getFile());
FileReader fr = new FileReader(file1);
BufferedReader br = new BufferedReader(fr);
String aline;
while ((aline=br.readLine()) != null)//按行讀取文本
ta1.append(aline+"\r\n");
fr.close();
br.close();
}
catch (IOException ioe)
{
System.out.println(ioe);
}
}
}
if ((e.getSource()==b2) || (e.getSource()==b3))
{ //單擊[保存]按鈕時
if ((e.getSource()==b3) ||(e.getSource()==b2)&&(file1==null))
{ //單擊[SaveAs]按鈕時,或單擊[Save]按鈕且文件對象為空時
fd = new FileDialog(f,"Save",FileDialog.SAVE);
if (file1==null)
fd.setFile("Edit1.txt");
else
fd.setFile(file1.getName());
fd.setVisible(true); //創建並顯示保存文件對話框

if ((fd.getDirectory()!=null) && (fd.getFile()!=null))
{
tf1.setText(fd.getDirectory()+fd.getFile());
file1 = new File(fd.getDirectory(),fd.getFile());
save(file1);
}
}
else
save(file1);
}
}
public void save(File file1)
{
try //將文本區內容寫入字符輸出流
{
FileWriter fw = new FileWriter(file1);
fw.write(ta1.getText());
fw.close();
b2.setEnabled(false);
b3.setEnabled(false);
}
catch (IOException ioe)
{
System.out.println(ioe);
}
}
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}

 

文件操作
File類:
File(String pathname)
File(File patent,String chile)
File(String patent,String child)
String getName()      得到文件名(不含路徑)
String getPath() 得到文件路徑
String getAbslutePath()      得到文件絕對路徑
String getParent()      得到文件上一級目錄名
String renameTo(File newName)       將當前文件更名為給定文件的完整路徑
boolean exists() 文件是否存在
boolean canWrite()
boolean canRead()
boolean isFile() 是否是文件(而不是目錄)
boolean isDirectory()
long lastModified()
long length()
boolean delete() 刪除當前文件
boolean mkdir()
String list()       列出當前目錄下的文件
例:自動更新文件
本例使用File類對象對指定文件進行自動更新的操作
import java.io.*;
import java.util.Data;
import java.text.SimpleDateFormat;
public class UpdateFile
{
       public static void main(String args[]) throws IOException
       {
           String fname="Write.txt";
           String childdir="backup"
           new UpdateFile().update(fname,childdir);
       }
       public void update(String fname,String childdir) throws IOException
       {
          File f1,f2,child;
          f1=new File(fname);
          child=new File(childdir)
          if (f1.exists())
             {
                if (!child.exists())child.mkdir();        //如果目錄不存在則建立
                f2=new File(child,fname);
                if (!f2.exists() || f2.exists() && (f1.lastModified()>f2.lastModified()))      //如果f2不存在,或存在但日期較f1早
                copy(f1,f2)
                getinfo(f1);
                getinfo(child);
           }
           else
                 System.out.println(f1.getName()+" file not found!");
       }
       public void copy(File f1,FIle f2) throws IOException
       {
           FileInputStream rf=new FileInputStream(f1);
           FileOutputStreadm w=new FileOutputStream(f2);
           int count,n=512;
           byte buffer[]=new byte[n];
           count=rf.read(buffer,0,n);
           while(count!=-1)
            {
                wf.write(buffer,0,count)
                count=rf.read(buffer,0,n);
            }
            System.out.println("CopyFile "+f2.getName()+" !");
            rf.close();
            wf.close();
       }
       public static void getinfo(File f1)      throws IOException
       {
          SimpleDateFormat sdf;
          sdf=new SimpleDateFormat("yyyy年MM月dd日hh時mm分);
          if (f1.isFile())
              System.out.println("<FILE>\t"+f1.getAbsolutePath()+"\t"+f1.lenght()+"\t"+f1.lenght()+"\t"+sdf.format(new Date(f1.lastModified())));
          else
               {
                  System.out.println("\t"+f1.getAbsolutePath());
                  File[] files=f1.listFiles();
                  for (int i=0;i<FILES.Lenght;i++)
                       getInfo(files[i]);
               }
         }
}

文件過濾器
類FilterInputStream和FilterOutputStream分別對其他輸入/輸出流進行特殊處理,它們在讀/寫數據的同時可以對數據進行特殊處理.另外還提供了同步機制,使得某一時刻只有一個線程可以訪問一個輸入/輸出流
要使用過濾流,首先必須把它連接到某個輸入/輸出流上: FilterInputStream(InputStream in);      FilterOutputStream(OutputStream out);
例: 列出當前目錄中帶過濾器的文件名清單
import java.io.*;
public class DirFilter implements FilenameFIlter
{
       private String prefix="",suffix=""       //文件名的前綴和后綴
       public DirFilter(String filterstr)
       {
          filterstr=filterstr.toLowerCase();
          int i=filterstr.indexOf('*');
          int j=filterstr.indexOf('.');
          if (i>0)
             prefix=filterstr.substring(0,i);
          if(j>0)
             suffix=filterstr.substring(j+1);
       }
       public static void main(String args[])
       {
          FilenameFIlter filter=new DirFilter("w*abc.txt");
          File f1=new File("");
          File curdir=new File(f1.getAbsolutePath(),"");
          System.out.println(curdir.getAbsolutePath();
          String[] str=curdir.list(filter);      //列出帶過濾器的文件名清單
          for (int i=0;i<Str.length,i++)
               System.out.println("\t"+str[i]);
       }
       public boolean accept(File dir,String filename)
       {
          boolean yes=true;
          try
          {
              filename=filename.toLowerCase();
              yes=(filename.startsWith(prefix)) & (filename.endsWidth(suffix));
          }
          catch(NullPointerExceptin e)
          { }
          return yes;
       }
}
----------------------------------------------------------------------------------
自己修改了一點,帶命令行參數的
import java.io.*;

public class DirFilter implements FilenameFilter
{
private String prefix="",suffix=""; //文件名的前綴、后綴
public DirFilter(String filterstr)
{
filterstr = filterstr.toLowerCase();
int i = filterstr.indexOf('*');
int j = filterstr.indexOf('.');
if (i>0)
prefix = filterstr.substring(0,i);
if (j>0)
suffix = filterstr.substring(j+1);
}
public static void main(String args[])
{ //創建帶通配符的文件名過濾器對象
FilenameFilter filter;
if(args.length>0)
{filter = new DirFilter(args[0]);}
else
{filter= new DirFilter("p*.class");}
File f1 = new File("");
File curdir = new File(f1.getAbsolutePath(),""); //當前目錄
System.out.println(curdir.getAbsolutePath());
String[] str = curdir.list(filter); //列出帶過濾器的文件名清單
for (int i=0;i<str.length;i++)
System.out.println("\t"+str[i]);
}
public boolean accept(File dir, String filename)
{
boolean yes = true;
try
{
filename = filename.toLowerCase();
yes = (filename.startsWith(prefix)) &
(filename.endsWith(suffix));
}
catch(NullPointerException e)
{
}
return yes;
}
}
----------------------------------------------------------------------------------
對於InputStream和OutputStream來說,它們的實例都是順序訪問流.在java中,類RandomAccessFile提供了隨機訪問文件的方法
public class RandomAccessFile extends Object implements DataInput,DataOutput
類RandomAccessFile允許對文件內容同時進行讀寫: Datainput DataOutput
int skipBytes(int n) 指針向下移動若干字節
redInt. writeDouble ...
length() 返回文件長度
long getFilePointer() 指針當前位置
void seek(long pos) 指針調到所需位置
void setLenght(long newLenght) 設置文件長度
RandomAccessFile(File file,String mode)
RandomAccessFile(String name,String mode)
r      只讀      rw 讀寫      rws 同步讀寫       rwd 數據同步讀寫

例:隨機文件操作
import java.io.*;
public class PrimesFIle
{
       RandomAccessFile raf;
       public static void main(String args[]) throws IOException
       {
          (nw PrimesFile()).createprime(100);
       }
       public void createprime(int max) throws IOException
       {
           raf=new RandomAccessFile("primes.bin","rw");
           raf.seek(0);
           raf.writeInt(2);      //寫入整形
           int k=3;
           while (k<=max)
           {
               if(isPrime(k))
                   raf.writeInt(k);
               k=k+2;
           }
           output(max);
           raf.close();
       }
       public boolean isPrime(int k) throws IOException
       {
         int i=0,j;
         boolean yes=true;
         try
         {
            raf.seek(0);
            int count=(int)(raf.lenght()/4);
            while ((i<=count) && yes)
            {
              if (k % raf.readInt()==0)
                  yes=false;
              else
                   i++;
              raf.seek(i*4);
            }
         }
         catch(EOFExcption e){}
         return yes;
       }
       public void output(int max) throws IOException
       {
          try
              {
                 raf.seek(0);
                 System.out.println("[2.."+max+"]中有 "+(raf.lenght()/4)+" 個素數:");
                 for (int i=0;i<(int)(raf.lenght()/4);i++)
                 {
                    raf.seek(i*4);
                    System.out.print(raf.readInt()+" ");
                    if ((i+1)%10==0) System.out.println();
                 }
              }
          catch(EOFExcption e){}
          System.out.println();
       }
}

 

Java文件讀寫數據流大全(InputStream、OutputStream、FileInpuStream) - wolfgangkiefer - 嘎嘎閱讀器

 

Java文件讀寫數據流大全(InputStream、OutputStream、FileInpuStream) - wolfgangkiefer - 嘎嘎閱讀器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM