黑马程序员技术交流社区

标题: 【一个神奇的事情】为什么android下的文件少一个字符 [打印本页]

作者: 黑马晓志    时间: 2014-7-4 21:26
标题: 【一个神奇的事情】为什么android下的文件少一个字符
本帖最后由 黑马晓志 于 2014-7-4 21:45 编辑

写了一个用java读取歌词文件lrc的代码,android的sdcard上的lrc是UTF-8编码的,C盘上的lrc是ANSI编码的。代码一模一样,结果读出来的时间竟然不一样。。。

歌词如下:
  1. [00:01.47]阳光下的泡沫 是彩色的
  2. [00:08.35]就像被骗的我 是幸福的
  3. [00:15.45]追究什么对错 你的谎言 基于你还爱我
  4. [00:28.79]美丽的泡沫 虽然一刹花火
  5. [00:35.76]你所有承诺 虽然都太脆弱
  6. [00:42.78]但爱像泡沫 
  7. [00:46.41]如果能够看破 有什么难过
  8. [00:57.85]早该知道泡沫 一触就破
  9. [01:04.84]就像已伤的心 不胜折磨
  10. [01:11.83]也不是谁的错 谎言再多 基于你还爱我
  11. [01:25.15]美丽的泡沫 虽然一刹花火
  12. [01:32.14]你所有承诺 虽然都太脆弱
  13. [01:39.25]爱本是泡沫 
  14. [01:42.70]如果能够看破 有什么难过
  15. [01:53.30]再美的花朵 盛开过就凋落
  16. [02:00.39]再亮眼的星 一闪过就堕落
  17. [02:07.55]爱本是泡沫 
  18. [02:11.19]如果能够看破 有什么难过
  19. [02:21.53]为什么难过 有什么难过
  20. [02:35.70]为什么难过
  21. [02:46.29]全都是泡沫 只一刹的花火
  22. [02:53.39]你所有承诺 全部都太脆弱
  23. [03:00.55]而你的轮廓 怪我没有看破 
  24. [03:07.54]才如此难过
  25. [03:14.57]相爱的把握 要如何再搜索
  26. [03:21.56]相拥着寂寞 难道就不寂寞
  27. [03:28.69]爱本是泡沫 怪我没有看破 
  28. [03:35.62]才如此难过
  29. [03:43.70]在雨下的泡沫 一触就破
  30. [03:50.79]当初炽热的心 早已沉没
  31. [03:57.67]说什么你爱我 
  32. [04:01.28]如果骗我 我宁愿你沉默
复制代码

java代码:
  1. package com.xiaozhi.test;

  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileReader;
  6. import java.io.IOException;

  7. public class Demo7 {

  8.         public static void main(String[] args) {
  9.                 try {
  10.                         BufferedReader reader=new BufferedReader(new FileReader(new File("c:\\1.lrc")));
  11.                         String line = null;
  12.                         while((line=reader.readLine())!=null){
  13.                                 String minute=""+line.charAt(1)+line.charAt(2);
  14.                                 String second=""+line.charAt(4)+line.charAt(5);
  15.                                 System.out.println(minute+":"+second);
  16.                                 Long time=Long.parseLong(minute) * 60+Long.parseLong(second);
  17.                         }
  18.                         reader.close();
  19.                 } catch (NumberFormatException e) {
  20.                         e.printStackTrace();
  21.                 } catch (FileNotFoundException e) {
  22.                         e.printStackTrace();
  23.                 } catch (IOException e) {
  24.                         e.printStackTrace();
  25.                 }
  26.         }
  27. }
复制代码

运行结果:

android下的代码:
  1. package com.example.testandroid;

  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileReader;
  6. import java.io.IOException;

  7. import android.os.Bundle;
  8. import android.app.Activity;
  9. import android.view.Menu;

  10. public class MainActivity extends Activity {

  11.         @Override
  12.         protected void onCreate(Bundle savedInstanceState) {
  13.                 super.onCreate(savedInstanceState);
  14.                 setContentView(R.layout.activity_main);
  15.                 try {
  16.                         String path="/sdcard/1.lrc";
  17.                         BufferedReader reader=new BufferedReader(new FileReader(new File(path)));
  18.                         String line = null;
  19.                         while((line=reader.readLine())!=null){
  20.                                 String minute=""+line.charAt(1)+line.charAt(2);
  21.                                 String second=""+line.charAt(4)+line.charAt(5);
  22.                                 System.out.println(minute+":"+second);
  23.                         }
  24.                         reader.close();
  25.                 } catch (FileNotFoundException e) {
  26.                         // TODO Auto-generated catch block
  27.                         e.printStackTrace();
  28.                 } catch (IOException e) {
  29.                         // TODO Auto-generated catch block
  30.                         e.printStackTrace();
  31.                 }
  32.         }

  33.         @Override
  34.         public boolean onCreateOptionsMenu(Menu menu) {
  35.                 // Inflate the menu; this adds items to the action bar if it is present.
  36.                 getMenuInflater().inflate(R.menu.main, menu);
  37.                 return true;
  38.         }

  39. }
复制代码


运行结果:



将文件改成这样就行了,去掉一个字符。
  1. 00:01.47]阳光下的泡沫 是彩色的
  2. [00:08.35]就像被骗的我 是幸福的
  3. [00:15.45]追究什么对错 你的谎言 基于你还爱我
  4. [00:28.79]美丽的泡沫 虽然一刹花火
  5. [00:35.76]你所有承诺 虽然都太脆弱
  6. [00:42.78]但爱像泡沫 
  7. [00:46.41]如果能够看破 有什么难过
  8. [00:57.85]早该知道泡沫 一触就破
  9. [01:04.84]就像已伤的心 不胜折磨
  10. [01:11.83]也不是谁的错 谎言再多 基于你还爱我
  11. [01:25.15]美丽的泡沫 虽然一刹花火
  12. [01:32.14]你所有承诺 虽然都太脆弱
  13. [01:39.25]爱本是泡沫 
  14. [01:42.70]如果能够看破 有什么难过
  15. [01:53.30]再美的花朵 盛开过就凋落
  16. [02:00.39]再亮眼的星 一闪过就堕落
  17. [02:07.55]爱本是泡沫 
  18. [02:11.19]如果能够看破 有什么难过
  19. [02:21.53]为什么难过 有什么难过
  20. [02:35.70]为什么难过
  21. [02:46.29]全都是泡沫 只一刹的花火
  22. [02:53.39]你所有承诺 全部都太脆弱
  23. [03:00.55]而你的轮廓 怪我没有看破 
  24. [03:07.54]才如此难过
  25. [03:14.57]相爱的把握 要如何再搜索
  26. [03:21.56]相拥着寂寞 难道就不寂寞
  27. [03:28.69]爱本是泡沫 怪我没有看破 
  28. [03:35.62]才如此难过
  29. [03:43.70]在雨下的泡沫 一触就破
  30. [03:50.79]当初炽热的心 早已沉没
  31. [03:57.67]说什么你爱我 
  32. [04:01.28]如果骗我 我宁愿你沉默
复制代码











作者: Geek_001    时间: 2014-7-4 23:40
思路:这应该是由于编码与解码用了不同的编码集引起的,你再反编一次试试?
作者: 黑马晓志    时间: 2014-7-5 11:27
Geek_001 发表于 2014-7-4 23:40
思路:这应该是由于编码与解码用了不同的编码集引起的,你再反编一次试试? ...

android平台的默认编码是UTF-8,咱用的windows默认编码是ANSI,应该不会有错啊。再说如果解码错了,应该歌词都错了,不至于就少一个字符,读出来的歌词还是对的。。。
作者: Geek_001    时间: 2014-7-6 07:42
黑马晓志 发表于 2014-7-5 11:27
android平台的默认编码是UTF-8,咱用的windows默认编码是ANSI,应该不会有错啊。再说如果解码错了,应该歌 ...

我把问题记录下来了,有时间思考思考吧!




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