java上传1g文件_java读取大文件1G+

正常读取大文件,可能会想到用缓存

如:

package base;

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.UnsupportedEncodingException;

import java.math.BigInteger;

public class ReadBigFile {

public static void readBigFile(String path) {

BigInteger sum;

try {

File file = new File(path);

BufferedInputStream fis = new BufferedInputStream(

new FileInputStream(file));

BufferedReader reader = new BufferedReader(new InputStreamReader(

fis, "utf-8"), 5 * 1024 * 1024);// 用5M的缓冲读取文本文件

String line = "";

sum = BigInteger.ZERO;

while ((line = reader.readLine()) != null) {

sum = sum.add(BigInteger.ONE);

}

System.out.println(sum);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* @param args

* @throws IOException

*/

public static void main(String[] args) {

readBigFile("H:/TDDOWNLOAD/TEST.txt");

}

}

但是为了统计等,更加有效率,采用流的方式

public class ReadBigFile2 {

// 统计指定文件中的字符的总数,其中:fileName指的是文件的全路径     public static long xermote(String fileName) {         FileReader reader = null;         try {             reader = new FileReader(fileName);             // 创建分析给定字符流的标记生成器             StreamTokenizer stn = new StreamTokenizer(                     new BufferedReader(reader));// 根据给定的字符流创建标记生成器stn             // 下面指定单引号、双引号和注释的转义字符在此标记生成器中是普通字符,不代表其他的特殊的含义             stn.ordinaryChar('\'');             stn.ordinaryChar('\"');             stn.ordinaryChar('/');             // 创建可以统计字符总数的各个变量             String str;             int num_sum = 0;// 用于统计数字字符总数的变量             int word_sum = 0;// 用于统计字母、汉字等字符总数的变量             int sym_sum = 0;// 用行统计标点符号等字符总数的变量             int sum = 0;// 用于计算全部种类字符总数的变量             // 当生成器的下一个标记不是流末尾的常量             while (stn.nextToken() != StreamTokenizer.TT_EOF) {                 switch (stn.ttype) {// 来判断当前获取的流的标记类型                 // TT_EOL指示已读到行末尾的常量。                 case StreamTokenizer.TT_EOL:                     break;                 // TT_NUMBER指示已读到一个数字标记的常量                 case StreamTokenizer.TT_NUMBER:                     str = String.valueOf((stn.nval));// stn.nval表示此数字标记的值                     num_sum += str.length();                     break;                 // TT_WORD指示已读到一个文字标记的常量                 case StreamTokenizer.TT_WORD:                     // str = stn.sval;// stn.sval表示此文字标记的值                     str = "\\x01\\x02";                     word_sum += str.length();                     break;                 default:                     // 如果以上3中类型都不是,则为英文的标点符号                     str = String.valueOf((char) stn.ttype);                     sym_sum += str.length();                 }             }             System.out.println("数字标记的和为:" + num_sum);             System.out.println("文字标记的和为: " + word_sum);             System.out.println("标点符号标记的和为: " + sym_sum);             sum = sym_sum + num_sum + word_sum;             System.out.println("此文件中的字符总数为: " + sum);             return sum;         } catch (Exception e) {             e.printStackTrace();             return -1;         } finally {             if (reader != null) {                 try {                     reader.close();                 } catch (IOException e1) {                 }             }         }     }     public static void main(String[] args) {         String fileName = "H:/TDDOWNLOAD/迅雷相关/迅雷网邻/P2P Seacher/movie/test.txt";         System.out.println("统计文件" + fileName + "中的字符数的结果如下:");         ReadBigFile2.xermote(fileName);     } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值