zoukankan      html  css  js  c++  java
  • java文件处理 之 读写TXT(比之c++,重置文件头,int转string)

    一:c/c++ 处理文件的使用方法。详见博客 c++文件操作

    二:java与c++的方便之处:

    (1) java在读取文件时。能够对字符流进行处理,又一次进行编码,如 InputStreamReader reader = new InputStreamReader(new FileInputStream(file),encoding);

     (2) BufferReader bufferReader = new BufferReader(file) 进行buffer处理

    (3)java的很好用的一点就是。伸手就来,如 int 转 string  ( 如Integer.toString(intNumber) )。字符串分隔(stringStr.split(exp); ) 。字符串又一次合成,直接加就可以。很好用;

    (4)再借助于集成开发环境 IDE 缺少的依赖类,自己主动引入功能。更是如虎添翼。

    三:处理TXT问文件的演示样例

    package edu.tju.cs;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileWriter;
    import java.io.InputStreamReader;
    
    public class OriginalDevideByTime {
    	
    	String times[] = {"6:00:00","6:30:00","7:00:00","7:30:00","8:00:00","8:30:00","9:00:00","9:30:00","10:00:00","10:30:00",
    			"11:00:00","11:30:00","12:00:00","12:30:00","13:00:00","13:30:00","14:00:00","14:30:00","15:00:00","15:30:00",
    			"16:00:00","16:30:00","17:00:00","17:30:00","18:00:00","18:30:00","19:00:00","19:30:00","20:00:00","20:30:00",
    			"21:00:00","21:30:00","22:00:00","22:30:00","23:00:00","23:30:00","24:00:00"};
    	
    	// 合成输出文件名称
    	public String getFileName(int cp){
    		String fileName = "D:\tjdata_metro\results\";
    		fileName = fileName + Integer.toString(cp) + ".csv";
    		return fileName;
    	}
    	// 读取文件,并分隔数据
    	public void readTxtFile(String filePath){
    		try {
    	            String encoding="GBK";
    	            File file=new File(filePath);
    	            int cp = 1;
    	            if(file.isFile() && file.exists()){ //推断文件是否存在
    	                InputStreamReader read = new InputStreamReader(
    	                new FileInputStream(file),encoding);//考虑到编码格式
    	                BufferedReader bufferedReader = new BufferedReader(read);
    	                
    	                String originalLine = null;
    	                String newLine = null;
    	                
    	                while((originalLine = bufferedReader.readLine()) != null){
    	                	bufferedReader.mark((int)file.length()+1);// 设置文件标志位
    	                
    		                //写入文件名称处理
    	                	if(cp >= times.length)
    	                		return;
    		                String fileName = getFileName(cp);
    	                	BufferedWriter writer = new BufferedWriter(new FileWriter(new File(fileName)));
    	                	
    		                while((originalLine = bufferedReader.readLine()) != null){
    		                	// 字符串分隔
    		                	String tmp[] = originalLine.split(",");
    		                	// 假设符合又一次合成
    		                	if(tmp.length>3)
    		                		if(tmp[3].compareTo(times[cp-1])>=0&&tmp[3].compareTo(times[cp])<0){
    			                		newLine = tmp[0] + "," + tmp[1] + "," + tmp[2] + "," + tmp[3] + "," + tmp[4] + "," + tmp[5] + "," + tmp[6] + "," + tmp[7];
    			                		System.out.println(newLine);
    			                		writer.write(newLine + "
    ");
    			                	}
    			                	else
    			                		System.out.println("Not between times");
    		                }
    		                // 关闭写文件
    		                writer.close();
    		                // 重置为文件開始位置,cp自加
    		                bufferedReader.reset();
    		                cp ++;
    	                }
    	                bufferedReader.close();
    	                read.close();
    			    }
    	            else
    	            {
    			        System.out.println("OriginalDevideByTime……找不到指定的文件");
    			    }
    	            
    		    } catch (Exception e) {
    		        System.out.println("OriginalDevideByTime……读取文件内容出错");
    		        e.printStackTrace();
    		    	}
    			System.out.println("OriginalDevideByTime……Devide is over!!!");
    	}
    	
    	// main 函数入口
    	 public static void main(String argv[]){
    	        String filePath = "D:\tjdata_metro\TOKEN_ENEX_201404_20W.csv";
    	        OriginalDevideByTime devide = new OriginalDevideByTime();
    	        
    	        devide.readTxtFile(filePath);
    	    }
    	
    }
    

    四:学习心得:

    (1)JAVA中文件指针复位到文件开头

    File file = new File("temp.txt");  
    BufferedReader  reader = null;  
    reader = new BufferedReader(new FileReader(file));  
    reader.mark((int)file.length()+1);  

    // to do something

    reader.reset();  
    注意:假设文件串的最后一个字符是中文。使用mark()中的长度设为file.length()
    假设文件的最后一个字符串是英文或数字,则java.io.IOException: Mark invalid,使用mark()中的长度设为file.length()+1  

    mark用于标记当前位置。在读取一定数量的数据(小于readlimit的数据)后使用reset能够回到mark标记的位置。FileInputStream不支持mark/reset操作。BufferedInputStream支持此操作。
    mark(readlimit)的含义是在当前位置作一个标记,制定能够又一次读取的最大字节数,也就是说你假设标记后读取的字节数大于readlimit。你就再也回不到回来的位置了;通常InputStream的read()返回-1后,说明到达文件尾,不能再读取。除非使用了mark/reset

    (2)JAVA中int转String类型有三种方法
    1》String.valueOf(i)
    2》 Integer.toString(i)
    3》 i+""
    valueOf()和toString()方法能够明确,但为什么3中加上一个""引號也能够?谁有资料能够看到?

    (3)stringStr.compareTo(otherstring) ,相等返回 0 ,若是stringStr大于otherstring返回正数,若是stringStr小于otherstring返回负数

  • 相关阅读:
    C#结构体指针的定义及使用详解
    C# out和ref关键字
    CListCtrl控件主要事件及LVN_ITEMCHANGED消息和鼠标双击列表项事件的处理
    深圳职位:替朋友招聘biztalk的技术人员 无为而为
    微软出最新SQL Server 2005 累积修补程序包(版本 9.0.2153)(200684),这是SP1之后的更新 无为而为
    微软Visual Studio 2005 SDK version 3.0 发布了,TFS扩展的开发人员/DSL/VSTS Test都应该关注 无为而为
    好东西,将你的英文版TFS变为中文版?:Visual Studio 2005 Team Foundation Server 语言更改包 无为而为
    Analysis Service计算[期间增长率]的若干注意 无为而为
    亲身体验:更改 Team Foundation Server 部署的语言版本是一个复杂耗时的过程 无为而为
    各大门户调查:鄙视新浪,将博士伦的广告挂在热点新闻中间好几天了,把大众当傻瓜 无为而为
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6972418.html
Copyright © 2011-2022 走看看