java IO处理

java IO常用的很多,这个文章是总结,而不是介绍。

部分代码及说法参考...好吧,已经找不到出处了。

字节流

以二进制为基础进行处理

注:java提供的方法很多,个人觉得也很杂, 甚至连将对象与变量数据写入文件都有提供对应的类,但是个人觉得不用学。创建文件时,可以没有文件,但是一定要有目录,没有就用File类自己创,或者想别的办法。

字符流

以一个一个字符进行处理(有时也直接一行一行的读)


总结常用如下:

字节流(输入&输入都有例子)

我一般用两种,一种是有缓存,一种是没缓存的。
1 无缓存: InputStreamstreamReader

package com.hxw.io;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.InputStream;  
public class FileCount {  
   /** 
    * 我们写一个检测文件长度的小程序,别看这个程序挺长的,你忽略try catch块后发现也就那么几行而已。 
    */  
   publicstatic void main(String[] args) {  
      //TODO 自动生成的方法存根  
             int count=0;  //统计文件字节长度  
      InputStreamstreamReader = null;   //文件输入流  
      try{  
          streamReader=newFileInputStream(new File("D:/David/Java/java 高级进阶/files/tiger.jpg"));  
          /*1.new File()里面的文件地址也可以写成D:\\David\\Java\\java 高级进阶\\files\\tiger.jpg,前一个\是用来对后一个 
           * 进行转换的,FileInputStream是有缓冲区的,所以用完之后必须关闭,否则可能导致内存占满,数据丢失。 
          */  
          while(streamReader.read()!=-1) {  //读取文件字节,并递增指针到下一个字节  
             count++;  
          }  
          System.out.println("---长度是: "+count+" 字节");  
      }catch (final IOException e) {  
          //TODO 自动生成的 catch 块  
          e.printStackTrace();  
      }finally{  
          try{  
             streamReader.close();  
          }catch (IOException e) {  
             //TODO 自动生成的 catch 块  
             e.printStackTrace();  
          }  
      }  
   }  
   
}

2 有缓存

package com.hxw.io;  
import java.io.*;  
   
public class FileCopy {  
   
  public static void main(String[] args) {  
     // TODO自动生成的方法存根  
     byte[] buffer=new byte[512];   //一次取出的字节数大小,缓冲区大小  
     int numberRead=0;  
     FileInputStream input=null;  
     FileOutputStream out =null;  
     try {  
        input=new FileInputStream("D:/David/Java/java 高级进阶/files/tiger.jpg");  
        out=new FileOutputStream("D:/David/Java/java 高级进阶/files/tiger2.jpg"); //如果文件不存在会自动创建  
         
        while ((numberRead=input.read(buffer))!=-1) {  //numberRead的目的在于防止最后一次读取的字节小于buffer长度,  
           out.write(buffer, 0, numberRead);       //否则会自动被填充0  
        }  
     } catch (final IOException e) {  
        // TODO自动生成的 catch 块  
        e.printStackTrace();  
     }finally{  
        try {  
           input.close();  
           out.close();  
        } catch (IOException e) {  
           // TODO自动生成的 catch 块  
           e.printStackTrace();  
        }  
         
     }  
  }  
   
}

3 还有一种特殊的,随机流,用来随意的移动指针位置,代码我在网上抄了一段
出处:IBM 中国

/**
   * 随机读取文件内容
   * @param fileName 文件名
   */
public static void readFileByRandomAccess(String fileName){
   RandomAccessFile randomFile = null;
   try {
    System.out.println("随机读取一段文件内容:");
    // 打开一个随机访问文件流,按只读方式
    randomFile = new RandomAccessFile(fileName, "r");
    // 文件长度,字节数
    long fileLength = randomFile.length();
    // 读文件的起始位置
    int beginIndex = (fileLength > 4) ? 4 : 0;
    //将读文件的开始位置移到beginIndex位置。
    randomFile.seek(beginIndex);
    byte[] bytes = new byte[10];
    int byteread = 0;
    //一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
    //将一次读取的字节数赋给byteread
    while ((byteread = randomFile.read(bytes)) != -1){
     System.out.write(bytes, 0, byteread);
    }
   } catch (IOException e){
    e.printStackTrace();
   } finally {
    if (randomFile != null){
     try {
      randomFile.close();
     } catch (IOException e1) {
     }
    }
   }
}

随意移动并写,只要改成下例子中A方法的 randomFile.seek(fileLength)即可。
定位到尾部,追加操作
查了下,是覆盖原有内容。

import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
* 将内容追加到文件尾部
*/
public class AppendToFile {

/**
   * A方法追加文件:使用RandomAccessFile
   * @param fileName 文件名
   * @param content 追加的内容
   */
public static void appendMethodA(String fileName, String content){
   try {
    // 打开一个随机访问文件流,按读写方式
    RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
    // 文件长度,字节数
    long fileLength = randomFile.length();
    //将写文件指针移到文件尾。
    randomFile.seek(fileLength);
    randomFile.writeBytes(content);
    randomFile.close();
   } catch (IOException e){
    e.printStackTrace();
   }
}
/**
   * B方法追加文件:使用FileWriter
   * @param fileName
   * @param content
   */
public static void appendMethodB(String fileName, String content){
   try {
    //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
    FileWriter writer = new FileWriter(fileName, true);
    writer.write(content);
    writer.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
}

public static void main(String[] args) {
   String fileName = "C:/temp/newTemp.txt";
   String content = "new append!";
   //按方法A追加文件
   AppendToFile.appendMethodA(fileName, content);
   AppendToFile.appendMethodA(fileName, "append end. /n");
   //显示文件内容
   ReadFromFile.readFileByLines(fileName);
   //按方法B追加文件
   AppendToFile.appendMethodB(fileName, content);
   AppendToFile.appendMethodB(fileName, "append end. /n");
   //显示文件内容
   ReadFromFile.readFileByLines(fileName);
}
}

字符流

说实话,java的这里我觉得设计的并不好,我的用法总结如下(我会总结各个类的继承关系):
1 坚持用UTF-8
BufferedWriter writer=new OutputStreamWriter(new FileOutputStream(new File("you path")),"UTF-8")
BufferedReader reader=new InputStreamReader(new FileIntputStream(new File("you path")),"UTF-8")

2 对UTF-8没要求
BufferedWriter writer=new BufferedWriter(new FileWriter(new File("you path")))
BufferedReader reader=new BufferedReader(new FileReader("you path"))

注1:这里要补充两点,一个是File类,这是个很实用的类,一个是他们的继承关系
注2:在下面的例子,只要替换BufferedWriter的构造方式就可改写为UTF-8格式,所以不再举第一种用UTF-8的例子了 ,不懂UTF-8,,,,,百度去吧(搜了就懂,都是这么过来的)。
注3:追加操作的话,如下所示:
FileWriter writer = new FileWriter(fileName, true); //第二个参数为即为true即为追加

1 file 类

//一些功能:
File f=new File("E:/电脑桌面/jar/files/create.txt");  
f.createNewFile();  //当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空
System.out.println("该分区大小"+f.getTotalSpace()/(1024*1024*1024)+"G"); //返回由此抽象路径名表示的文件或目录的名称。  
f.mkdirs();  //创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。  
// f.delete(); //  删除此抽象路径名表示的文件或目录  

System.out.println("文件名  "+f.getName());  //  返回由此抽象路径名表示的文件或目录的名称。  
System.out.println("文件父目录字符串 "+f.getParent());// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。  


//获得 path文件夹下的 *.java文件 示例
ArrayList<String> filelist=new ArrayList<String>();
private void filter()
    {
        File root= new File(path1);
        File[] files=root.listFiles();
        
        for(File file:files)
        {
            String name=file.getName();
            if(name.endsWith(".java")||name.endsWith(".JAVA"))
            {
                filelist.add(name);
            }
        }
        
        
        
    }
  

2 继承关系
fileoutputstream<-outputstreamwriter<-bufferedwriter
最左为最小的子类


总结常用如下:

字符流(输入&输入都有例子)


用户名+换行
密码+换行
写入并读

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class dosomething {

    
    ArrayList<user> userlist=new ArrayList<user>();
    

    public dosomething()
    {
        loading();
    }
    
    
    
    
    //读
    private void loading() {
        // TODO Auto-generated method stub
        //userlist.add(new user("liu","123"));
        try {
            BufferedReader reader=new BufferedReader(new FileReader("user.txt"));
            String line;
            while ((line=reader.readLine())!=null) 
            {  
                String name=line;
                String pass=reader.readLine();  
                
                userlist.add(new user(name,pass));
            }
            
            reader.close();
        }
        catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block

            e1.printStackTrace();
        }  
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        
    }





    public boolean login(String username,String password)
    {
    
        user u=null;
        for(Object i:userlist)
        {
            boolean flag=((user)i).login(username, password);
            if(flag)
                u=(user)i;

        }
        if(u!=null)
            return true;
        
        
        
        return false;
    }
    
    public boolean register(String username,String password)
    {
        user u=null;
        for(Object i:userlist)
        {
            boolean flag=username.equals(      
                    
                    ((user)i).getusername()
                    
                    );
            if(flag)
                u=(user)i;
            
            
            
            
            
        }
        if(u!= null)
            return false;
        
        
        userlist.add(new user(username,password));
        
        save(username,password);
        
        return true;
    }




      //写
    private void save(String username, String password) {
        // TODO Auto-generated method stub
        try {
            BufferedWriter writer=new BufferedWriter(new FileWriter("user.txt"));
            for(user i:userlist)
            {
                writer.write(i.getusername());
                writer.newLine();
                writer.write(i.getpassword());
                writer.newLine();
                writer.flush();
            }
            
            writer.close();
            
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序运行的过程中,可能需要对一些设备进...
    征程_Journey阅读 905评论 0 1
  • 概述 计算机并不区分二进制文件与文本文件。所有的文件都是以二进制形式来存储的,因此,从本质上说,所有的文件都是二进...
    奋斗的老王阅读 1,275评论 0 51
  • 一、IO流整体结构图 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称...
    慕凌峰阅读 1,116评论 0 12
  • Java 语言支持的类型分为两类:基本类型和引用类型。整型(byte 1, short 2, int 4, lon...
    xiaogmail阅读 1,320评论 0 10
  • 花瓣儿成了行船……
    石竹阅读 140评论 4 6