黑马程序员技术交流社区

标题: 关于字节流的问题 [打印本页]

作者: string1    时间: 2015-5-26 08:55
标题: 关于字节流的问题
请问字节流如何只读和只写中文?

作者: zouzouzou    时间: 2015-5-26 08:55
字节流只写: fos.write(“字符串”.getBytes);只要将字符串变成字符数组就OK了
字节流只读:1。将文件上的所有的字节数据都读到缓冲区中,然后在转换成字符串ByteArrayOutputStream
2.可以定一个大的缓冲区,然后将读取的中文放在字节数组中,然后在读取。
作者: zhuchangbao    时间: 2015-5-26 09:02
  1. /*
  2. 第二种方式:通过字符数组进行读取。
  3. */

  4. import java.io.*;

  5. class FileReaderDemo2
  6. {
  7.         public static void main(String[] args) throws IOException
  8.         {
  9.                 FileReader fr = new FileReader("demo.txt");       

  10.                 //定义一个字符数组。用于存储读到字符。
  11.                 //该read(char[])返回的是读到字符个数。
  12.                 char[] buf = new char[1024];//一个字符两个字节,1024个字符,就是2K(一般读取超大数据时,设置为1024)

  13.                 int num = 0;
  14.                 while((num=fr.read(buf))!=-1)
  15.                 {
  16.                         System.out.println(new String(buf,0,num));
  17.                 }
  18.                
  19.                 fr.close();
  20.         }
  21. }
复制代码

作者: 半世心修    时间: 2015-5-26 10:31
不是有getBytes方法么。楼上两位说的很清楚了
作者: hui1107464497    时间: 2015-5-26 18:46
学习了,赞一个
作者: 开弓没有回头箭    时间: 2015-5-26 21:40
本帖最后由 开弓没有回头箭 于 2015-5-26 23:02 编辑

要指定只输入输出中文,就得比较字节流方式获取二进制码,然后去和编码表比较判断是否是中文,这得查编码表,javaJDK默认应该是GBK表
这得直到编码表示怎么编码的,这个我还没学到,具体代码就帮不了你了。就多一个判断,其他的正常的输入输出流是一样的。
还有我很好奇,你这个-4分黑马币值怎么弄出来的
作者: adkai    时间: 2015-5-27 11:32
创建com包,在com包下创建GetTxt.java。直接复制下面的代码,就可以了。希望可以帮助到你。

package com;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class GetTxt {
        /**
            * 创建指定文件名与文件内容的文件(字符串)————只写文件(中文、字符串方法)
            * @param fileName
            * @param conter
            * @throws IOException
            */
           public static void writerText(String fileName,String conter)  throws IOException{
                   FileWriter fw=new FileWriter(fileName);                 //获取文件
                   fw.write(conter);                                                        //文件信息写入
                   fw.close();                                                                        //文件关闭
           }
           /**
            * 返回读取到文件的字符串————只读文件(中文、字符串方法)
            * @param fileName
            * @return
            * @throws Exception
            */
           public static String readerText(String fileName) throws IOException{
                   String msg="";                                                        //定义返回的字符串
                   FileReader fr=new FileReader(fileName);  //获取该文件(地址+文件名)
                   int i=fr.read();                                                        //读取文件流
                   while(i!=-1){                                                        //判断文件流获取是否结束
                           msg=msg+(char)i;                                                //循环获取每一个文件流的字符(把所读取到的文件流转化为字符)
                           i=fr.read();                                                        //继续读取下一个字符流
                   }                       
                   fr.close();                                                                //关闭文件流
                   return msg;                                                                //返回所读取到的字符串
           }
           public static void main(String args[]) throws IOException
           {     
                     String asg="";                                                //创建一个字符串,用来你存放读取文件内的信息
                     try {                                                               
                                asg=readerText("c:abc\\abc.txt");        //假如c盘的adc文件夹下有一个abc.txt文件,这样获取文件的文件流
                     } catch (Exception e) {
                            e.printStackTrace();
                         }
                     //把读取的字符串放到这个刚才写的方法中,把字符串写到一个新的文件里面
                     writerText("c:abc\\abc(1).txt", asg);  
           }
}

作者: 君子无醉    时间: 2015-5-28 08:50
zhuchangbao 发表于 2015-5-26 09:02

到控制台打印的时候 应该不加换行,只用print就可以吧?否则就是认为的改变了读取的内容了。。
作者: 君子无醉    时间: 2015-5-28 09:00
字节流可以复制文本文件  也就是包括中文文件,也就是说不管是中文 英文 还是数学,字节流都可以都可以将这些内容复制到另一个文件 原封不动。 但是字节流不可以打印中文文件 原因是一个中文是两个字节表示  如果字节流打印的话 是一个字节一个字节的打印(用字节数组也会出现这个问题  因为没法确定数组长度 ) 本来一个中文是两个字节表示,现在变成把每个字节都输出在控制台 就会出现乱码。所以输出打印的话 用字符流,一次直接读取一个字节。  我用手机回复的,不方便给你打代码 ,如果你觉得我说的对你有帮助,想看具体代码的话,扣1,我用电脑发给你
作者: 东东嘿嘿    时间: 2015-5-28 10:54
InputStream is = new FileInputStream("D:\\Work_beiruan\\source\\1.txt");

        int c;
        while ((c = is.read()) != -1) {
            System.out.print((char) c);
        }
        System.out.println();
每次只读1个字节,而汉字需要3个字节。换个流读取。如果非要用字节流读取可以把每次读到的c放入一个数组,然后转换。在数组中每读取3个数,分别放入3个int型的变量t1 t2 t3里,然后然后t1左移8位、t2左移4位,最后相加就得到中文的编码,打印就出汉字了
作者: yq582321562    时间: 2015-5-30 21:50
有.getBytes()方法可以用,如果要读的话一个中文占两个字节,弄不好会乱码
作者: lucien_he    时间: 2015-6-2 23:39
正在学这段  学习一下
作者: 南山忆    时间: 2015-6-8 01:56
可以用字节转换流InputStreamReader





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