写入文件为什么是乱码?

import java.io.*;
public class Test {
public static void main(String args[]){
try {
FileReader f=new FileReader( "E:\test.txt ");
BufferedReader in=new BufferedReader(f);
String s=null;
int i=0;
while ((s=in.readLine())!=null){
FileOutputStream out1 = new FileOutputStream( "E:\copytest.txt ");
BufferedOutputStream out2 = new BufferedOutputStream(out1,1);
DataOutputStream out = new DataOutputStream(out2);
out.writeUTF(s);
System.out.print(i+1+ " ");
System.out.println(s);
i++;
}
}catch(Exception e){
e.printStackTrace();
}

}

}
E:\copytest.txt 写入到这里的字符串是乱码?
另外要关那个流?

1、兄弟,你这样写是不对的
[code="java"]
while ((s=in.readLine())!=null){
FileOutputStream out1 = new FileOutputStream("E:\copytest.txt");
BufferedOutputStream out2 = new BufferedOutputStream(out1,1);
DataOutputStream out = new DataOutputStream(out2);
...
}
[/code]
每次进循环都将copytest.txt文件清空了new FileOutputStream("E:\copytest.txt");
应该把while里面前三行放在循环外面

2、关闭流一般是从后往前关, 可以关的都关了最好, 顺序如out>out2>out1

3、一般DataOutputStream是用于读取DataInputStream写进的文件

4、另外,我用你的程序倒不会出现乱码

5、一般的用法是,效率高,不会有乱码
[code="java"]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class TestCopyFile {

/**
 * @param args
 */
public static void main(String[] args) {
    FileInputStream fis = null;
    FileOutputStream fos = null;
    BufferedReader br = null;
    BufferedWriter bw = null;

    try {
        fis = new FileInputStream("E:/test.txt");
        fos = new FileOutputStream("E:/copytest.txt");
        br = new BufferedReader(new InputStreamReader(fis));
        bw = new BufferedWriter(new OutputStreamWriter(fos));

        String str;
        while ((str = br.readLine()) != null) {
            bw.write(str);
            bw.newLine();
        }
    } catch (Exception e) {
        System.out.println(e);
    } finally { // 从最后使用的关闭到最先使用的
        if (bw != null) {
            try {
                bw.close();
            } catch (IOException e) {
                bw = null;
            }
        }
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                br = null;
            }
        }
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                fos = null;
            }
        }
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                fis = null;
            }
        }
    }
}

}
[/code]

[code="java"]import java.io.*;

public class Test {

public static void main(String args[]){ 
    try {
        BufferedReader br = new BufferedReader(new FileReader("E:\\test.txt"));
        String s = null; 

        PrintWriter pw = new PrintWriter(new FileOutputStream("E:\\copytest.txt"));
        int i = 0;
        while ((s=br.readLine())!=null){ 
            pw.println(s);
            System.out.print(i+1+ "   "); 
            System.out.println(s); 
            i++; 
        }
        pw.close();
        br.close();
    }catch(Exception e){ 
        e.printStackTrace(); 
    }
} 

}[/code]
这样试一下,关流的话关最外层就可以了

1、Java语言中按照基本数据类型进行读/写的是: DataInputStream和DataOutputStream类,这两个类的对象是过滤流。将基本字节输入/输出流,自动转成基本数据类型进行读/写的过滤流。

2、给个例子
[code="java"]
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**

  • @author zhanjia
    *
    */
    public class DataInputStreamTest1 {

    public static void main(String[] args) {
    DataInputStream dis = null;
    DataOutputStream dos = null;
    int v = 0;
    float f = 0;

    try {
        // 写入数据
        dos = new DataOutputStream(new FileOutputStream("E:/test.txt"));
        for (int k = 1; k <=5; k++) {
            dos.writeInt(k);
        }
        dos.writeFloat(1);
        dos.close();
    
        // 读出数据
        dis = new DataInputStream(new FileInputStream("E:/test.txt"));
        for (int k = 1; k <=5; k++) {
            v = dis.readInt();
            System.out.println(v + " ");
        }
    
        try {
            while (true) {
                f = dis.readFloat();
                System.out.println(f + " ");
            }
        } catch (EOFException e) {
        }
        dis.close();
    } catch (Exception e) {
    
    } finally {
        try {
            dos.close();
        } catch (IOException e) {
            dos = null;
        }
        try {
            dis.close();
        } catch (IOException e) {
            dis = null;
        }
    }
    

    }

}
[/code]

3、由于是按基本类型进行读写,所以如上面例子,int占4个字节,因而写到文件里面自然为乱码。所以它的读取是有规定的,怎样写就要怎样写,否则会出乱子。
读取内容没问题,查看文件有乱码是正常的