Java 关于vba读写txt文件件的问题

JAVA读取文件,排序再写出文件
- 飞天奔月的java博客 - ITeye技术网站
博客分类:
今天在百度知道看到这么一个问题
原问题链接:/question/.html#here
读取TXT文件的格式为:字母 数字
如: TOM 100
然后按照数字大小排序(由大到小)
输出TXT文件格式为:
问题补充:
最后一行输出平均值=总和/人数
如:平均值=(200+150+100+50)/4=125
输出为一个新生成的TXT文件,不改变原文件
如读取文件为test.txt, 输出文件为text1.txt
觉得蛮有意思的,就动手做了个,大家也和我一起来
1.首先在D盘建了个name.txt文件,里面内容写上
2.java 读取文件内容
我新建了个FeLongIoTest.class,新建了个读取文件内容通用方法
* 读取文件内容
* @param path
* @return 文件内容string
* @author 金鑫
* @version 3.0 时间:日 14:56:44
public static String getFileContent(String path){
File file = new File(path);
//分配新的直接字节缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(186140);
StringBuffer stringBuffer = new StringBuffer(186140);
FileInputStream fileInputStream = new FileInputStream(file);
//用于读取、写入、映射和操作文件的通道。
FileChannel fileChannel = fileInputStream.getChannel();
//编码字符集和字符编码方案的组合,用于处理中文,可以更改
Charset charset = Charset.forName("GBK");
while (fileChannel.read(byteBuffer) != -1){
//反转此缓冲区
byteBuffer.flip();
CharBuffer charBuffer = charset.decode(byteBuffer);
stringBuffer.append(charBuffer.toString());
byteBuffer.clear();
fileInputStream.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
return stringBuffer.toString();
3.测试下这个方法行不行
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
System.out.println(content);
TOM 100JACK 200BILL 50CATHY 150
ok的,我上面@Test 用了junit4.7, 没用过的你们可以换成main函数
4.数据可以读到了,应为题目中要排序,那么下一步就要把这些数据转换成集合
我这里用到了泛型, 建了一个User 实体类,存放名字和数据
package mon.
* @author &a href="mailto:"&金鑫&/a&
* @version 1.0
上午10:03:47
public class User{
private String
private int
public String getName(){
public void setName(String name){
this.name =
public int getCount(){
public void setCount(int count){
this.count =
5.怎么把读到的数据转成list 呢?
讲解: 使用\r\n 把每行分割成数组
因为题目中要输出最后一句统计的字符串,所以我建了个StringBuilder 装相关数据(这地方别用+直接相连,性能不高)
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
//将内容以换行符转成数组
String[] rowsContents = content.split("\r\n");
//内容总共行数
int rowCount = rowsContents.
int sum = 0;
//最后一句话的数字
(200+150+100+50)
StringBuilder lastRowOutBuilder = new StringBuilder();
//集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段)
List&User& userList = new ArrayList&User&();
for (int i = 0; i & rowC i++){
String rowContent = rowsContents[i];
String[] nameAndCount = rowContent.split(" ");
User user = new User();
user.setName(nameAndCount[0]);
int count = Integer.parseInt(nameAndCount[1]);
user.setCount(count);
userList.add(user);
lastRowOutBuilder.append(count);
if (i != rowCount - 1){
lastRowOutBuilder.append("+");
最后一句话拼接技巧: 循环的最后不加+号
把这个list 可以输出测试下,数据已经进去了
6.这下要到排序了
按照数字大小排序(由大到小)
因为list 本身不能排序的,需要使用Collections.sort,需要list
以及Comparator
新建UserComparator 类,实现Comparator 接口
我在类里面增加了 排序枚举SortType,方便扩展(要是那一天改成从小到大,只要参数变一下就可以了)
* user 排序
* @author &a href="mailto:"&金鑫&/a&
* @version 1.0
上午10:48:13
public class UserComparator implements Comparator{
* @author &a href="mailto:"&金鑫&/a&
* @version 1.0
上午10:59:02
public enum SortType{
private SortType sortT
public UserComparator(SortType sortType){
this.sortType = sortT
/* (non-Javadoc)
* @see parator#compare(java.lang.Object, java.lang.Object)
public int compare(Object arg0,Object arg1){
User user0 = (User) arg0;
User user1 = (User) arg1;
int count0 = user0.getCount();
int count1 = user1.getCount();
switch (sortType) {
if (count0 & count1){
}else if (count0 & count1){
return -1;
case desc:
if (count0 & count1){
return -1;
}else if (count0 & count1){
Collections.sort(userList, new UserComparator(SortType.desc));
8.再把排序好了的list
以及最后一句话 拼接成字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i & userList.size(); i++){
User user = userList.get(i);
builder.append(user.getName());
builder.append(" ");
builder.append(user.getCount());
builder.append("\r");
String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + "";
builder.append(outString);
System.out.println(builder.toString());
9.最后到输出到 文件了
我新建了个write 方法
* 将字符串写到文件中
* @param filePath
* @param content
字符串内容
public static void write(String filePath,String content){
//向文本输出流打印对象的格式化表示形式
//会自动创建文件,替换覆盖文字(非追加)
PrintWriter printWriter = new PrintWriter(filePath);
printWriter.write(content);
printWriter.close();
}catch (FileNotFoundException e){
e.printStackTrace();
write("D:/2.txt", builder.toString());
10. 这段完整代码
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
//将内容以换行符转成数组
String[] rowsContents = content.split("\r\n");
//内容总共行数
int rowCount = rowsContents.
int sum = 0;
//最后一句话的数字
(200+150+100+50)
StringBuilder lastRowOutBuilder = new StringBuilder();
//集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段)
List&User& userList = new ArrayList&User&();
for (int i = 0; i & rowC i++){
String rowContent = rowsContents[i];
String[] nameAndCount = rowContent.split(" ");
User user = new User();
user.setName(nameAndCount[0]);
int count = Integer.parseInt(nameAndCount[1]);
user.setCount(count);
userList.add(user);
lastRowOutBuilder.append(count);
if (i != rowCount - 1){
lastRowOutBuilder.append("+");
Collections.sort(userList, new UserComparator(SortType.desc));
StringBuilder builder = new StringBuilder();
for (int i = 0; i & userList.size(); i++){
User user = userList.get(i);
builder.append(user.getName());
builder.append(" ");
builder.append(user.getCount());
builder.append("\r");
String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + "";
builder.append(outString);
System.out.println(builder.toString());
write("D:/2.txt", builder.toString());
所有的完整代码,我传了附件
这是用纯java自带的类做的,当然有更简单的,比如使用common-io
下载次数: 118
论坛回复 /
(9 / 4953)
简单问题复杂化
yangyi 写道其实Collections.sort最终用的也是归并,但是不支持文件归并。这题考的应该是算法吧
yang兄虽然你比较niubility,也不要总是把简单问题复杂化啊。
呵呵,这个解决方案肯定是大型机不是分布式,而且是内存特大的那种。还没有用多路归并,多线程,MapReduce。:))
其实Collections.sort最终用的也是归并,但是不支持文件归并。这题考的应该是算法吧
yang兄虽然你比较niubility,也不要总是把简单问题复杂化啊。
浏览: 64666 次
来自: 上海
多谢楼主,正好遇到了这个问题!纠结了半天不知道怎么回事,看到楼 ...
感谢楼主啊
htpasswd - Manage user files fo ...您还未登陆,请登录后操作!
java读写txt文件
共有 1 位网友向您献上回答啦, 对答案满意?赶快给出你的好评,感谢他们吧!
import java.io.BufferedR
import java.io.F
import java.io.FileR
import java.io.FileW
public class TxtFile {
public void read() {
FileReader fr =
BufferedReader br =
fr = new FileReader("F://a.txt");
br = new BufferedReader(fr);
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
} catch (Exception e) {
System.out.println(e);
} finally {
import java.io.BufferedR
import java.io.F
import java.io.FileR
import java.io.FileW
public class TxtFile {
public void read() {
FileReader fr =
BufferedReader br =
fr = new FileReader("F://a.txt");
br = new BufferedReader(fr);
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
} catch (Exception e) {
System.out.println(e);
} finally {
if (br != null)
br.close();
if (fr != null)
fr.close();// 关闭文件
} catch (Exception e) {
System.out.println(e);
public void write() {
File file =
FileWriter fw =
file = new File("F://a.txt");
fw = new FileWriter(file);
for (int i = 0; i < 20; i++) {
fw.append("第" + i + 1 + "次");
} catch (Exception e) {
System.out.println(e);
} finally {
if (fw != null)
fw.close();// 关闭文件
} catch (Exception e) {
System.out.println(e);
大家还关注java读取txt文件内容。可以作如下理解:
首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。
通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了。接下来需要解读成乙方可以理解的东西
既然你使用了FileInputStream()。那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据
解读完成后要输出呀。那当然要转换成IO可以识别的数据呀。那就需要调用字节码读取的方法BufferedReader()。同时使用bufferedReader()的readline()方法读取txt文件中的每一行数据哈。
package com.
import java.io.BufferedInputS
import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.InputStreamR
import java.io.R
* @author 码农小江
* 下午11:40:21
public class H {
* 功能:Java读取txt文件的内容
* 步骤:1:先获得文件句柄
* 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
* 3:读取到输入流后,需要读取生成字节流
* 4:一行一行的输出。readline()。
* 备注:需要考虑的是异常情况
* @param filePath
public static void readTxtFile(String filePath){
String encoding="GBK";
File file=new File(filePath);
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt =
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
read.close();
System.out.println("找不到指定的文件");
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
public static void main(String argv[]){
String filePath = "L:\\Apache\\htdocs\\res\\.txt";
readTxtFile(filePath);
阅读(...) 评论()Java 怎么读取硬盘上的D:&#92;Darren&#92;new下所有TXT文件的文件名 在线等。。_百度知道
Java 怎么读取硬盘上的D:&#92;Darren&#92;new下所有TXT文件的文件名 在线等。。
最好有详细的代码
提问者采纳
endsWith(&quot.getName().getName());;
File[] files = folder: files){
if(f;Darren&#92:&#92.println(f.listFiles().D;&#92.F)){
System.txt&)public class ListFilesDemo { public static void main(String[] args) {
File folder = new File(&new&&#92.io
只要名字 不要后面的扩展名 .txt不显示
import java.io.Fimport java.io.IOEpublic class ListFilesDemo { public static void main(String[] args) throws IOException {
File folder = new File(&D:&#92;&#92;Darren&#92;&#92;new&);
File[] files = folder.listFiles();
for (File f : files) {
String s = f.getName();
if (s.endsWith(&.txt&)) {
System.out.println(s.substring(0, s.length() - 4));
提问者评价
其他类似问题
txt文件的相关知识
其他1条回答
}).println(name);.endsWith(&quot.out.txt&quot.list(new FilenameFilter(){
public boolean accept(F), String name) {
if(D.FilenameFilter:names){
String[] names=
for(String name.io:&#47.F
new&Darren/public class FileTest { public static void main(String[] args) {
File file=new File(&quot.io
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁java读取txt文件的编程?_百度知道
java读取txt文件的编程?
一个txt格式文件地址为D:&#47;sql.txt里面的数据流为10 0 1。。。使用JAVA把。。。1、0.。。,0、1.。。,这三组数分别用三个数组表示。并输出。 我是纯新手,程序务必简明,最好能有一些必要的注释。谢谢大家了!操作成功的话可加分。(还有其他一些关于java的缉籂光饺叱祭癸熄含陇问题,如果能在线指导的话也可以大大的给加分。有时间的高手请联系我啊,谢谢!)
这个比较简单package lzu.HCH.import java.io.BufferedRimport java.io.Fimport java.io.FileInputSimport java.io.InputStreamRimport java.util.ArrayLimport java.util.Lpublic class Split {public File read(String path){return new File(path);}public List&StringBuffer& splitFile(File f){List&StringBuffer& list = new ArrayList&StringBuffer&();StringBuffer b_col1 = new StringBuffer(50);StringBuffer b_col2 = new StringBuffer(50);StringBuffer b_col3 = new StringBuffer(50);BufferedRtry {br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));String temp =while((temp=br.readLine())!=null){String [] s = temp.split(& &);b_col1.append(s[0]).append(& &);b_col2.append(s[1]).append(& &);b_col3.append(s[2]).append(& &);}list.add(b_col1);list.add(b_col2);list.add(b_col3);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {String path = &c://sql.txt&;Split split = new Split();File f = split.re缉籂光饺叱祭癸熄含陇ad(path);List&StringBuffer& list = split.splitFile(f);}}里面就两个方法一个是 读文件的。一个是分割字符的。结果放在一个容器里面了。arraylist。这个比数组好操作。有不明白的地方可以问
其他类似问题
按默认排序
其他2条回答
你的意思是不是,每一竖行,是一个数组?如果是这个意思,那我想我能帮你,到时候你就只需要foreach 。
one, two , three 这三个数组就ok了public class Test{
private List one = // 第一竖行的集合,本来想用数组,但是不知道文件具体的长度,就用集合
private List two = // 第二竖行
private List three = // 第三竖行
private File file = // 你要读取的文件
// 利用有参缉籂光饺叱祭癸熄含陇构造函数,去直接返回你要的内容集合
public Test(String filePath){
file = new File(filePath);
if(!file.exists()){
System.err.println(&文件不存在&);
one = new ArrayList();
two = new ArrayList();
= new ArrayList();
Scanner s = new Scanner(FileInputStream(file)); // 利用扫描器去读取每一行的内容
String line = // 存放每一行内容的变量
String[] temp = // 每一行拆分下来的字符
while(s.hasNext()){
line = s.nextLine();
temp = line.split(& &); // 因为你的文件使用“ ”空格来区分的,所以我用空格来拆分
if(null != temp[0])
one.add(temp);
if(null != temp[1])
two.add(temp);
if(null != temp[2])
three.add(temp);
}catch(Exception e){
System.out.println(&错误:&+e.getMessage());
2维数组怎么定义的?
txt文件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 c语言读写txt文件 的文章

 

随机推荐