A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马刘涛 中级黑马   /  2012-7-19 11:44  /  4399 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马刘涛 于 2012-7-19 14:32 编辑
  1. package com.itcast.test;
  2. import java.io.*;
  3. public class PrintDemo {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) throws Exception {
  8.                 // TODO Auto-generated method stub
  9.                 BufferedInputStream bufis =
  10.                                 new BufferedInputStream(new FileInputStream("G:\\KuGou\\周华健 - 刀剑如梦.mp3"));

  11.                         PrintStream out = new PrintStream(new FileOutputStream("C:\\Users\\shandawang\\Desktop\\a.txt"),true);

  12.                         byte[] buf = new byte[1024];
  13.                         int len = 0;
  14.                         while((len = bufis.read(buf,0,1024)) != -1)
  15.                         {
  16.                                         out.write(buf,0,len);                        
  17.                                 //out.flush();
  18.                         }
  19.                         out.close();
  20.                         bufis.close();
  21.         }
  22. }
复制代码
我要将一个音乐媒体文件的二进制数据转换成1010001这样的字符串写到一个文本文件中该怎么做?上面的代码只是做了一个复制的工作。

11 个回复

倒序浏览
你的byte数组不就是存放的二进制数据,直接循环把里面的东西打印出来应该就OK了
回复 使用道具 举报

我要将一个音乐媒体文件的二进制数据转换成1010001这样的字符串写到一个文本文件中该怎么做?上面的代码只是做了一个复制的工作。
你的想法是将计算机存储的二进制数直接用文本文档打开,让我们能看到这些1010的二进制数。

首先在物理上文本文件和二进制文件并没有区别,都是以二进制01的形式存放于存储介质中,他们的区别只是逻辑上的区别,这两种方式只是在编码层次上有差别。文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。你的一连串的二进制码,用不同的编码解析,就会产生不同的意识。这就是我们会看到乱码的原因。我们在打开一个文件时,用错了编码去解析。就会产生乱码。

其次,Java提供了很多进行文件输入输出的类,这些类可以分为文本I/O类和二进制I/O类。文本I/O将数据解释成字符的序列,二进制I/O将数据解释成原始的二进制数。文本在文件中如何存储依赖于文件的编码方式。Java对文本I/O提供自动编码与解码。在文本文件中存储的数据是以人能读懂的方式表示的,而在二进制文件中存储的数据是用二进制形式来表示的。人读不懂二进制文件,它们是为程序读取而设计的。例如,Java源程序存储在文本文件中,可以使用文本编辑器阅读,但是Java的类存储在二进制文件中,使用Java虚拟机阅读。二进制文件的好处是处理它们的效率比文本文件高。我们是看不到二进制数据的。就算我们看到一连串的10101数据也是编码解析过来的十进制数据。二进制数据是给计算机用的。我们所看到的数据都是经过计算机按某种规则解析后的数据。
所以我认为这个无法做到。你复制的这个MP3格式的文件,他也是按二进制存储的。但是他有他的解析方法,所以他就能产生声音。



评分

参与人数 1黑马币 +3 收起 理由
黑马刘涛 + 3 很给力!

查看全部评分

回复 使用道具 举报
陌花╮有意、 发表于 2012-7-19 12:05
你的byte数组不就是存放的二进制数据,直接循环把里面的东西打印出来应该就OK了 ...

没有打印byte类型数据的方法。
回复 使用道具 举报
package test;
import java.io.*;
public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
                // TODO Auto-generated method stub
             InputStream bufis = new FileInputStream("I:\\Music\\范逸臣-无乐不作.lrc");

             FileWriter out = new FileWriter("I:\\a.txt");
                                byte[] bytes=new byte[1];//因为后边的操作无法截出最后的一个数组的长度,所以这里我用了一个1,以免造成最后一个数组的重复取值。
                        int len = 0;
                        while((len = bufis.read(bytes)) != -1)
                        {
                                for(Byte byt:bytes){//这里把所有的字节取出来
                                        out.write(Integer.toBinaryString(byt.intValue()));//把字节转换成int类型,在用Integer类把其转换成二进制形式输出
                                        out.flush();
                                }
                        }
                        out.close();
                        bufis.close();
        }
}
//你的读取流已经是有缓冲区的了,其内部已经封装了一个数组了,你就不用再用数组装了。。。
//注意,把文件变成二进制占用的空间比较大,我用了一个400多k的MP3文件读出来的是一个8m的txt,打都打不开(电脑比较垃圾),所以用了一个比较小的歌词文件。。。写出来内容是二进制的。。。

点评

还是有点不妥吧,字节转换为int,1字节变为了四字节,输出就多出了3字节的数据。  发表于 2012-7-19 13:43
正解,我也这么想来着  发表于 2012-7-19 13:30
回复 使用道具 举报
本帖最后由 黑马刘涛 于 2012-7-19 13:28 编辑

  1. <P>package com.itcast.test;</P>
  2. <P>import java.io.*;</P>
  3. <P>public class ByteToStringDemo {</P>
  4. <P> /**
  5.   * @param args
  6.   */
  7. public static void main(String[] args) throws Exception {
  8.   // TODO Auto-generated method stub
  9.   byte[] buf = new byte[1024];
  10.   InputStream is = new BufferedInputStream(System.in);
  11.      PrintStream ps = new PrintStream(System.out);
  12.      is.read(buf);
  13.      for(byte b : buf) {
  14.       ps.print(Byte.toString(b));
  15.      }
  16. }
  17. }
  18. </P>
复制代码
即使转换用Byte类的toString方法,也只是将byte类型的数据转换成其十进制编码将编码打印。若将这个十进制编码值转换为二进制编码应该是可能的吧

捕获.PNG (6.27 KB, 下载次数: 32)

捕获.PNG
回复 使用道具 举报
王达 初级黑马 2012-7-19 13:33:51
7#
呵呵 这样弄出来你想干啥啊

点评

就想看看  发表于 2012-7-19 14:31
回复 使用道具 举报
王达 初级黑马 2012-7-19 13:47:50
8#
因为得出很多数值都是负数啊,负数前边都是1111啊
回复 使用道具 举报
李伟 中级黑马 2012-7-19 13:52:11
9#
import java.io.*;
public class PrintDemo {

        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
                // TODO Auto-generated method stub
                BufferedInputStream bufis =
                                new BufferedInputStream(new FileInputStream("F:\\KuGou\\郑源 - 一万个理由.mp3"));

                        //PrintStream out = new PrintStream(new FileOutputStream("F:\\Program Files\\eclipseWorkspace\\javaenhance\\src\\cn\\itcast\\test\\m.word"),true);
                          FileWriter out=new FileWriter("F:\\Program Files\\eclipseWorkspace\\javaenhance\\src\\cn\\itcast\\test\\m.word");                          
                        //byte[] buf = new byte[1024];
                        //int len = 0;
                        int ch=-1;
                        System.out.println("ok");
                        while((ch = bufis.read()) != -1)
                        {
                                //System.out.println(ch);
                                String s=Integer.toBinaryString(ch);
                                //System.out.println(s);
                                        out.write(s);
                                //out.flush();
                        }
                        
                        File f=new File("F:\\Program Files\\eclipseWorkspace\\javaenhance\\src\\cn\\itcast\\test\\m.mp3");
                        System.out.println(f.exists());
                        System.out.println("okok");
                        out.close();
                        bufis.close();
        }
}

点评

嗯,谢谢。  发表于 2012-7-19 14:26
回复 使用道具 举报
在循环里加上
  1. for(int i = 0; i < b.len; i++)   
  2. {
  3.   System.out.print(Integer.toBinaryString(buf [i] ) );
  4. }
复制代码
回复 使用道具 举报
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;

public class C{
   public static void main(String[] args) {
         copy();
}
   public static void copy(){
           try {
                   BufferedWriter bw=new BufferedWriter(new FileWriter("c:/copy.txt"));
                BufferedInputStream bi=new BufferedInputStream(new FileInputStream("c:/a.mp3"));
                byte [] b=new byte[1024];
                int len=0;
                while((len=bi.read(b))!=-1){
                        for(int x=0;x<len;x++){
                                bw.write(Integer.toBinaryString(b[x]));
                        }
                }
                bi.close();
                bw.close();
          
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        }
        catch(Exception e){
                e.printStackTrace();
        }
   }
}
回复 使用道具 举报
  1. package com.itcast.test;

  2. import java.io.BufferedInputStream;
  3. import java.io.FileInputStream;

  4. public class PrintDemo2 {

  5.         /**
  6.          * @param args
  7.          * @throws Excet
  8.          */
  9.         public static void main(String[] args) throws Exception {
  10.                 // TODO Auto-generated method stub
  11.                 BufferedInputStream bufis =
  12.                 new BufferedInputStream(new FileInputStream("G:\\KuGou\\林宥嘉 - 说谎-.krc"));
  13.                 int ch=-1;
  14.         System.out.println("ok");
  15.         /*public abstract int read()
  16.          *        throws IOException从输入流中读取数据的下一个字节。
  17.          *返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
  18.          */
  19.         while((ch = bufis.read()) != -1) {
  20.             String s=Integer.toBinaryString(ch);
  21.             System.out.println(s);      
  22.         }                        
  23.         bufis.close();
  24.         }
  25. }
复制代码
结贴。谢谢诸位。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马