黑马程序员技术交流社区

标题: 今天晚上考试,出了BUG联想到的IO流和String类下的一些知识... [打印本页]

作者: danlyalex    时间: 2015-6-9 23:23
标题: 今天晚上考试,出了BUG联想到的IO流和String类下的一些知识...
本帖最后由 danlyalex 于 2015-6-20 07:04 编辑

楼主是 基础班的,今天 第一次考试,然后晚上老师让我们提交答案,格式为(我们班的大神们别来和我对答案啊!!我已经检查出来三四道错误了..)
1-5:d,acd,b,c,bc
6-10:ab,d,b,c,bc
11-15:bd,d,d,c,b
16-20:b,ad,c,d,b
21-25:a,d,ad,c,b
26-30:ac,a,bc,c,d
31-35:b,ac,d,d,a
36-40:a,c,b,c,a
这种类型的..之前,就一直做,然后做完了,就把答案往里面填,....完了后我们提交答案,,显示总分只有35分.我只打了6.5分..完了完了.这数据太坑爹啊.

   一问,,我们美丽动人伶牙俐齿落落大方的班主任,,她解释说是要我们重新 改,,把小写 都改成大写的..此时同学们就抱怨要一个一个改.眼睛都花了..
我就捉摸着不是刚好自学到了IO流和String类么,,于是就写了一串代码.
    完了一运行,咔咔就给改成大写了.把我这新手给激动的

  1. /*

  2. * 将文本文档里的大写字母全部转换成小写

  3. *         思路:A,用高效字符输入流读取文本文档里的数据

  4. *              B,将他们存入ArrayList集合中来,然后将集合转成字符串数组,将每一句字符串改为小写的然后用stringbuilder拼接起来再转为字符串赋值到数组中来

  5. *              C,用高效字符输出流读取数组中的数据,然后输出到文本文档

  6. */

  7. import java.io.BufferedReader;

  8. import java.io.BufferedWriter;

  9. import java.io.File;

  10. import java.io.FileReader;

  11. import java.io.FileWriter;

  12. import java.io.IOException;

  13. import java.util.ArrayList;


  14. public class Test {

  15.         public static void main(String[] args) throws IOException {

  16.                 //封装源文件,将桌面上的考试题封装进来..你们如果要运行的话拿去把路径给改了.如果放在桌面上的话,只要把下面的XXX改成你自己名字就行

  17.                 File file = new File("C:\\Users\\Administrator\\Desktop\\XXX.txt");            
  18.       //将源文件用高效字符流读取,然后存储到旧arraylist集合中来.,因为ArrayList集合是有序的,可重复的.

  19.                 BufferedReader br = new BufferedReader(new FileReader(file));

  20.                 ArrayList<String> arr = new ArrayList<String>();

  21.                 String line = null;

  22.                 while ((line = br.readLine()) != null) {

  23.                         arr.add(line);

  24.                 }

  25.                 br.close();

  26.                 // 将集合变成字符串数组然后变成小写后再调回来使用

  27.                 ArrayList<String> arr2 = changeArr(arr);            
  28.     //将接收回来的新集合写入之前的文件当中.

  29.                 BufferedWriter bw = new BufferedWriter(new FileWriter(file));

  30.                 for (String line2 : arr2) {

  31.                         bw.write(line2);

  32.                         bw.newLine();

  33.                         bw.flush();

  34.                 }

  35.                 bw.close();

  36.         }

  37.          //这是一个将旧集合作为形式参数接收,返回一个新集合的方法.方法里将集合中的字符串转为大写.

  38.         public static ArrayList<String> changeArr(ArrayList<String> arr) {               
  39.         //创建新的集合.arr2

  40.                 ArrayList<String> arr2 = new ArrayList<String>();

  41.                 StringBuilder sb=new StringBuilder();               
  42.     //定义一个字符数组str.长度为 旧集合arr的长度,即为 arr.size().

  43.                 String[] str = new String[arr.size()];              
  44.     //遍历旧集合,将里面的元素依次赋值给字符数组str

  45.                 for (int i = 0; i < arr.size(); i++) {

  46.                         str[i] = arr.get(i);                       
  47.       //将接收到的字符串转为大写,然后用StringBuilder对象来接收拼接.

  48.                         sb.append(str[i].toUpperCase()).append("\r\n");

  49.                 }              
  50.     //最后把拼接好的sb转为字符串再存入到新的集合arr2中来.

  51.                 arr2.add(sb.toString());

  52.                 //返回新集合arr2.

  53.                 return arr2;

  54.         }

  55. }

复制代码

...

我之前知识点不是很牢固.所以做的时候还是有点晕
现在把这代码中的思路写一下.
首先,我先用高效字符输入流读取文本文档,然后把里面的数据存入到旧集合中来.
这里用到的就是BufferedReader 啊 ArrayList啊之类的.很基础的东西
其次, 再自定义方法,将旧集合作为形参给到这个方法里,返回一个新的集合.方法里的代码就是
将集合中的数据依次赋值给字符数组..然后创建一个新的集合,接收字符数调用toUpperCase()后就是大写后,存入StringBuilder 里再toString()后的内容..
最后,调用该方法,将变大写后的数据输出到文本文件中来.
..我写的有点乱..就是刚好遇到这么个情况,就写了这么一段小代码,,和大家交流下新手 心得..顺便复习一下一些重要的方法.
A: IO流的读写: 如果是文本文件就考虑高效字符流,如果是非文本就考虑高效字节流,,如果要获取一个文件夹中的所有文件(包括子文件夹),那么还得用到递归.
B: 集合转字符串数组的方法:  可以用ArrayList集合遍历的方式,把每个元素依次赋值给字符串数组.
C:字符串变大写,小写的方法: toUpperCase(),toLowerCase().如果要改大小写只要把代码中的这一块改变就行.
D:用StringBuilder里的append()接收字符串,然后用toString()方法再转成字符串的方法.
    这个十分重要.因为我没用StringBuilder接收直接toString(),打印出来的就是地址值..
综上..就是觉得好玩..然后运行了下.没出错了.
       代码写的比较复杂,,望小伙伴们多多指点下!
  1. package stringApi;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileReader;
  6. import java.io.FileWriter;
  7. import java.io.IOException;
  8. import java.util.ArrayList;

  9. /**
  10. * 需求,把所有小写的答案改成大写
  11. * @author danlyalex
  12. *
  13. */
  14. public class ChangeDaXiaoXie {

  15.         public static void main(String[] args) throws IOException {
  16.                 //封装数据源
  17.                 File srcFile=new File("C:\\Users\\Administrator\\Desktop\\xpy.txt");
  18.                 //高效字符流读取源文件的内容
  19.                 BufferedReader br=new BufferedReader(new FileReader(srcFile));
  20.                 //定义一个集合.将源文件内容存入集合
  21.                 ArrayList<String> arr=new ArrayList<String>();
  22.                 String line=null;
  23.                 while((line=br.readLine())!=null){
  24.                         //添加元素时,直接改为大写
  25.                         arr.add(line.toUpperCase());
  26.                 }
  27.                 br.close();
  28.                 //高效字符流写入集合的内容到之前的文件中来.
  29.                 BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));
  30.                 for (String line2 : arr) {
  31.                         bw.write(line2);
  32.                         bw.newLine();
  33.                         bw.flush();
  34.                 }
  35.                 bw.close();
  36.         }

  37. }
复制代码

!
6.20日更新编辑.
昨天我们上课学到了String类的API..之前由于自学知识掌握不牢固!所以用了这么麻烦的方法...现在改进一个最简单的..
思路:由于文本文档里的东西,除了数字就是字母..所以直接可以在line上改为大小写..多谢楼下的大神指点....



作者: 一米阳光abc    时间: 2015-6-10 23:17
谦虚的谢大神,诚意之帖,赞赞赞!!!
作者: wyw    时间: 2015-6-10 23:44
谢大神不要谦虚~你要顶起大梁~带起我们的节奏啊。前面不能老被压制啊~
作者: danlyalex    时间: 2015-6-10 23:57
wyw 发表于 2015-6-10 23:44
谢大神不要谦虚~你要顶起大梁~带起我们的节奏啊。前面不能老被压制啊~

万年吊车尾就是在下.  duo zuo you re shi ku.wu guo za yi ma si
作者: danlyalex    时间: 2015-6-11 00:10
wyw 发表于 2015-6-10 23:44
谢大神不要谦虚~你要顶起大梁~带起我们的节奏啊。前面不能老被压制啊~

万年吊车尾就是在下.  duo zuo you re shi ku.wu guo za yi ma si
作者: qian0217wei    时间: 2015-6-11 00:37
我来个谢大神点个赞!顶礼膜拜!
作者: pizhihui    时间: 2015-6-11 00:40
学以致用啊
作者: vic0001    时间: 2015-6-11 00:49
这速度够快的
作者: 小乎乎    时间: 2015-6-11 00:52
渣表示看不懂,但有种不明觉厉个赶脚
作者: lizhi1817    时间: 2015-6-11 01:06
大神学以致用好屌 ,我等学渣情何以堪!
作者: danlyalex    时间: 2015-6-11 08:31
qian0217wei 发表于 2015-6-11 00:37
我来个谢大神点个赞!顶礼膜拜!

求黑马币!!
作者: 林豹    时间: 2015-6-11 10:11
这个必须点赞 不错
作者: 一米阳光abc    时间: 2015-6-17 22:46
大神考试都考出bug了
作者: DAN66    时间: 2015-6-17 23:05
太棒了,得向楼主学习才行
作者: SHISY    时间: 2015-6-17 23:08
大神啊,赞一个:)
作者: wx_uKgDjEiS    时间: 2015-6-17 23:10
刚开始学IO,看不懂
作者: wenxueaaa555    时间: 2015-6-17 23:22
我就要学到这了,先看一下做个准备
作者: 谢永烽    时间: 2015-6-18 13:35
好像麻烦了,记得还有种简单的做法
作者: 一口老郭    时间: 2015-6-18 21:56
好复杂的感觉,可以直接把line给转成大写再写出去吗
作者: heima591046495    时间: 2015-6-18 22:53
同是基础班为何你这么强大..
作者: danlyalex    时间: 2015-6-20 06:50
一口老郭 发表于 2015-6-18 21:56
好复杂的感觉,可以直接把line给转成大写再写出去吗

..我之前写这里时还没学到String类..所以用的不熟..昨天学完String类的API后.我再改进一下试试.
作者: danlyalex    时间: 2015-6-20 06:52
heima591046495 发表于 2015-6-18 22:53
同是基础班为何你这么强大..

..我是很菜的菜鸟..我们班那些大神们讨论的算法题压根看不懂..
作者: danlyalex    时间: 2015-6-20 07:05
谢永烽 发表于 2015-6-18 13:35
好像麻烦了,记得还有种简单的做法

改进了..
作者: 杰可可    时间: 2015-6-20 08:59
向楼主学习才行
作者: zuopiezi    时间: 2015-6-20 10:04
不错不错。。。。
作者: danlyalex    时间: 2015-6-20 10:19
杰可可 发表于 2015-6-20 08:59
向楼主学习才行

互相学习
作者: 乔栋    时间: 2015-6-20 11:33
一米阳光abc 发表于 2015-6-10 23:17
谦虚的谢大神,诚意之帖,赞赞赞!!!

恩有道理
作者: 乔栋    时间: 2015-6-20 11:34
很厉害啊 加油。。。
作者: hw3296416    时间: 2015-6-20 11:38
不错,谢谢分享…
作者: 谢永烽    时间: 2015-6-25 17:41
啊哈,映像中的就是改进后的代码
作者: micro_hx    时间: 2015-6-25 17:56
ctrl + shift + x
ecplise 上的快捷键,
作者: danlyalex    时间: 2015-6-25 22:27
micro_hx 发表于 2015-6-25 17:56
ctrl + shift + x
ecplise 上的快捷键,

:funk:你那个是把 整个界面的字母变大写么....我是要把文本文档的内容变为大写..你确定eclipse快捷键能做到咩..
作者: micro_hx    时间: 2015-6-26 20:20
danlyalex 发表于 2015-6-25 22:27
你那个是把 整个界面的字母变大写么....我是要把文本文档的内容变为大写..你确定eclipse快捷键能做 ...

毫无问题。。。首先你得明白大小写的意义,比如“1”的大写,还是“1”。。。
作者: danlyalex    时间: 2015-6-28 08:28
micro_hx 发表于 2015-6-26 20:20
毫无问题。。。首先你得明白大小写的意义,比如“1”的大写,还是“1”。。。 ...

我跟你讨论的不在一个点上...我的意思是要把外面txt文档里的东西用IO流复制进来.然后改成大写后用IO流再弄出去替代之前的文档...你用eclipse快捷键怎么能改动外面的文档内容?
作者: micro_hx    时间: 2015-6-29 23:02
好吧,也就是一个Uppertocase()方法而已,我只是想说的是ecplise太强大了,我自己也写程序内部实现过Uppertocase方法,使用C写的,感觉java太难了。。。唉




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2