小弟开始学java,今天在做文件输入输出测试的时候遇到个问题,希望各位大大帮个忙。
主要程序如下:
{ //创建文件输入流对象
              FileInputStream rf = new FileInputStream("Test.txt");
              int n=512;
              byte buffer[] = new byte[n];
              while ((rf.read(buffer,0,n)!=-1) && (n>0)) //读取输入流
              {
               String bu = new String(buffer);
               System.out.println(bu);
                for(int i=0;i<bu.length();i++){
                // if(buffer[i]>0)
                 System.out.print(" "+buffer[i]);
                 }            
              }
              System.out.println();
              rf.close(); //关闭输入流
              }
我Test.txt里内容是:
this is a
test file
可是我运行后输出结果却是:
锘縯his is a
test file
 -17 -69 -65 116 104 105 115 32 105 115 32 97 13 10 116 101 115 116 32 102 105 108 101 Process completed.开头的t怎么变成不认识的“锘縯”了,我在文件开头加空格,或者换行,还是会有多余字符,但是打开的是java文件则不会出现这种情况。
开始我还以为是字体问题,换了好几个字体都一样......

解决方案 »

  1.   

    楼主我在我机子上把你的程序运行了几遍,都没有出现你所所的问题啊!
      下面贴出在我机子上的代码---------->         import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;public class Test { /**
     * 测试I/O流
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
    FileInputStream rf = new FileInputStream("Test.txt");
    int n = 512;
    byte buffer[] = new byte[n];
    while ((rf.read(buffer, 0, n) != -1) && (n > 0)) // 读取输入流
    {
    String bu = new String(buffer);
    System.out.println(bu);
    for (int i = 0; i < bu.length(); i++) {
    // if(buffer[i]>0)
    System.out.print(" " + buffer[i]);
    }
    }
    System.out.println();
    rf.close(); // 关闭输入流
    }
    }我觉得你出现此问题的可能是JDK的编码问题!
      

  2.   

    感觉雷同……同意楼上的说法:换个JDK看看。我这里也没什么问题·!
      

  3.   

    你把int n=512;换成int n=1024;或者int n=2048;试试看。   
      

  4.   

    我把1楼的程序运行了下  我的还是和原来一样
    我的JDK是自动升级的1.6  我现在的程序是
    import java.io.*;
    import java.io.FileInputStream; 
    import java.io.FileNotFoundException; 
    import java.io.IOException; public class IOStreamDemo {
          public static  void  main(String arg[]) throws IOException {
           /** 
     * 测试I/O流 
     * @param args 
     * @throws IOException 
     */ 
        FileInputStream rf = new FileInputStream("IOStreamDemo.java"); 
        int n = 512; 
        byte buffer[] = new byte[n]; 
        while ((rf.read(buffer, 0, n) != -1) && (n > 0)) // 读取输入流 
        { 
           String bu = new String(buffer); 
           System.out.println(bu); 
           for (int i = 0; i  < bu.length(); i++) { 
    // if(buffer[i]>0) 
           System.out.print(" " + buffer[i]); 
           } 
        } 
        System.out.println(); 
         rf.close(); // 关闭输入流 
       } 把导入文件Test.txt 改成本java文件IOStreamDemo.java显示却是正确的 
      

  5.   

    你上面出现的问题主要是由于jdk版本的问题,我测试过了没有任何问题,但是有一点我要说明一下,你的这段代码很占资源,而且设计的很不好,你在while循环中分明是一个字节一个字节的读取,然后你还要在里面加上new string这样的语句,如果你的byte数组很大的话,需要new的String会很多,这样造成了很多的内存地址浪费,还有你为什么要在while加上for循环呢,为什么不能将她放到外面的,你要实现的不外乎就是打印出来buffer[i]吗?放到外面也可以完成的啊
      

  6.   

    谢谢各位,特别是7楼,让我考虑了以前很少考虑的问题,我打印的时候后面都是0,不足512个都用0给补充上了,真的很浪费资源。我还想请问下BufferedReader和FileInputStream 在使用上有什么区别和联系
      

  7.   

    我只知道BufferedReader里有个readLine方法可以逐行取出文件里的字符FileInputStream 是不是用read方法取出规定长度的数据?
      

  8.   

            FileInputStream rf = new FileInputStream("c:\\Test.txt");
            InputStreamReader isr = new InputStreamReader(rf);
            int rc;
            StringBuffer sb = new StringBuffer();  
            while((rc = isr.read() )>-1)
            {
             sb.append((char)rc);
            }
            System.out.println(sb.toString());
            isr.close();
    rf.close(); 
      

  9.   

    谢谢楼上  我想请问下各位 你们用的jdk是什么版本的
      

  10.   


    BufferedReader
    建立缓存渠道;而且是按字符读取;readLine方法;他连接的字符流(Reader);
    FileInputStream 
    文件字节流,是InputStream抽象类的子类;是用read方法来实现读取功能的;
    具体方法有3种: 
    read() 
    从此输入流中读取一个数据字节。 
    read(byte[] b) 
    从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。 
    read(byte[] b, int off, int len) 
    从此输入流中将最多 len 个字节的数据读入一个字节数组中 
      

  11.   

    readLine方法读入的不会包含行分隔符,比如windows的\r\n那个乱码我认为和jdk版本没有关系
    你的txt文件有问题,你的txt文件使用什么编码方式
    你的操作系统使用什么编码,new String()会使用操作系统默认的编码方式对
    读入的字符流解码
      

  12.   

    谢谢各位
    我用的就是jdk 1.6.04  我让它打印本java文件确能正确显示...