1

我在服务器中有一个文本文件。我正在从客户端下载该文件。我已经给出了应该保存的文件路径fi

创建的文本文件,其中包含一些难看的字符,而不是字符串。我该如何纠正它?

输出的格式是;

sNULdNULiNULdNUL

打印文本文件中的一个字符,然后是粗体NUL 。这是什么,我怎样才能摆脱它?

FileOutputStream f= new FileOutputStream(fi);

DataOutputStream d= new DataOutputStream(f);

String fc;
while((fc  = re.readLine()) !=null)  
{  
System.out.println(fc);
d.writeChars(fc);
d.flush();

}

更新

€À€À€À€À€À€À€À€À€À€À€À€À€À€À€

更新 2

InputStreamReader st= new InputStreamReader(
                    s.getInputStream());
            re= new BufferedReader(st);

s是这里socketre已初始化为BufferedReader re;

try {
            s= new Socket("localhost", "2222");
        } catch (IOException ex) {
             ex.printStackTrace();

        }
4

2 回答 2

0

字符串,当您希望将它们存储在内存中、将它们写入文件或通过 Internet 发送它们时,需要将它们编码为字节。有许多编码系统可以做到这一点。

writeChars将每个字符写为两个字节,这就是您已经看到的。

writeUTF做了一些人类不可读的事情:

使用 Java 修改的 UTF-8 编码以与机器无关的方式将字符串写入底层输出流。

首先,两个字节被写入输出流,就好像通过 writeShort 方法给出了后面的字节数。这个值是实际写出的字节数,而不是字符串的长度。在长度之后,使用修改后的 UTF-8 字符编码按顺序输出字符串的每个字符。如果没有抛出异常,则写入的计数器将增加写入输出流的字节总数。这将至少是 str 长度的两倍,最多是 str 长度的两倍。

如果您想将字符写入文件,不用大惊小怪,使用FileWriter。在大多数情况下,它会假定编写人类可读文件的正确默认值。

FileWriter fw = new FileWriter(filename);
BufferedWriter bw = new BufferedWriter(fw);

while((fc  = re.readLine()) !=null) {  
    bw.write(fc);
    bw.newLine();
    bw.flush();
}
bw.close();
于 2013-01-26T10:24:30.477 回答
0

writeChars将每个字符作为 2 字节值写入底层输出流,首先是高字节。因此,如果您的流中有多字节字符,它将导致输出中显示难看的字符。为您的流使用正确的编码

尝试用d.writeChars(fc);.Hoped.writeUTF(fc);替换

如果我让您正确使用US-ASCII输入输入流的编码。

InputStreamReader st= new InputStreamReader(
                s.getInputStream(),"US-ASCII");
        re= new BufferedReader(st);
于 2013-01-26T09:58:27.900 回答