这里将会写入文字:
1.java字符串:
java字符串的编码时utf-16be,不管是英文还是中文,utf-16be中,英文占两个字节,中文占两个字节,每个字符串都占两个字节。
2.DataOutString写入字符串的方法:
(1)writeBytes(String): 依次写入java字符串中的每一个字符,并且只写入字符的低8位,高字节被抛弃。
(2)writeChars(String): 依次写入java字符串中的每一个字符,字符的2个字节全部写入。
(3)wirteUTF(String) :依次写入utf-8编码的字符,utf-8编码中英文占一个字节,中文占三个字节
(4)先把字符串解析成字符数组:byte[] buf=string.getBytes(),然后使用write(byte[] buf)再写入字节数组
代码:
import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ReadAndWriteString { public static void pintfHex(String filePath) { FileInputStream in; int b; byte[] buf=new byte[20]; try { in = new FileInputStream(filePath); while((b=in.read(buf))!=-1) { for (int i=0;i<b;i++) { if((buf[i]&0xff)<=0xf) System.out.print("0"); System.out.print(Integer.toHexString(buf[i]&0xff)+" "); } System.out.println(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void printfHex(byte[] buf) { for (byte b : buf) { if((b&0xff)<=0xf) System.out.print("0"); System.out.print(Integer.toHexString(b&0xff)+" "); } // System.out.println(); } public static void main(String[] args) throws IOException { String packagePath=".\\src\\com\\lan\\dataoutputstream\\"; FileOutputStream in=new FileOutputStream(packagePath+"testString.txt"); DataOutputStream dif=new DataOutputStream(in); String string="a中"; byte[] bufUtf_16be=string.getBytes("utf-16be"); byte[] bufUtf_8=string.getBytes("utf-8"); // System.out.println(); System.out.print("string(utf-16be):"); printfHex(bufUtf_16be); System.out.println(); System.out.print("string(utf-8) :"); printfHex(bufUtf_8); System.out.println(); /* writeBytes(String) 依次写入java字符串(utf-16be)中的每一个字符,并且只写入字符的低8位,高字节被抛弃。 */ dif.writeBytes(string); /* java字符串(utf-16be)每个字符都占2个字节 riteChars(String) 依次写入java字符串中的每一个字符,字符的2个字节全部写入。 */ dif.writeChars(string); dif.writeUTF(string); dif.close(); System.out.print(" testString.txt:"); pintfHex(packagePath+"testString.txt"); } }
运行结果:
(1)分析1:writeBytes(String string):
(2)分析2:writeChars(String string):
(3)分析3:writeUTF(String string):
在上面代码的基础上加上write(byte[] buf)方法写入的字符串。:
代码:加入wirte(byte[] buf)方法写字符串之后的main函数:
public static void main(String[] args) throws IOException { String packagePath=".\\src\\com\\lan\\dataoutputstream\\"; FileOutputStream in=new FileOutputStream(packagePath+"testString.txt"); DataOutputStream dif=new DataOutputStream(in); String string="a中"; byte[] bufgbk=string.getBytes(); byte[] bufUtf_16be=string.getBytes("utf-16be"); byte[] bufUtf_8=string.getBytes("utf-8"); // System.out.println(); System.out.print("string(utf-16be):"); printfHex(bufUtf_16be); System.out.println(); System.out.print("string(utf-8) :"); printfHex(bufUtf_8); System.out.println(); System.out.print("string(gbk) :"); printfHex(bufgbk); System.out.println(); dif.writeBytes(string); dif.writeChars(string); dif.writeUTF(string); dif.write(string.getBytes()); dif.write(bufgbk); dif.close(); System.out.print(" testString.txt:"); pintfHex(packagePath+"testString.txt"); }
运行结果:
在gbk编码中 英文占一个字节,中文占两个字节。
这里顺便来说一下write(int i)和writeInt(int i)的区别:我就不自己写了
出处:Java中write(int)和writeInt(int)的区别,writeBytes(String) 和writeChars(String) 区别:
引用一下前辈的博客:
相同点
write(int)和writeInt(int) 都是接收int参数
write(int)
write(int) 继承自父类OutputStream,接收的虽然是int, 但是它只向输出流里写一个字节。我们知道,在java中,一个int 数子是4个字节组成,write(int) 只写入int的最低位的一个字节,其它3个字节被抛弃。
例如: write(-100),
int -100 的32位二进制码为: 11111111_11111111_11111111_10011100
那么, write(-100),实际上只写了最低的8位到输出流:10011100。
writeInt(int)
writeInt(int),是把整个32位都写入输出流。
那么, write(-100),写了32位到输出流:11111111_11111111_11111111_10011100。
使用DataOutPutStream的writeUTF()和DataInputStream的readUTF()来读写字符串
这里提一下基本类型和字符串之间的相互转换:
1.基本类型转换成String:
(1) 基本类型变量+“”;//基本类型加空字符串即可
(2)String.valueOf(基本类型变量);//
这两个都可以,相比加空字符串的方法,String.valueOf()效率更高。
2.String类型转成基本类型
(1) 调用包装类的parseXXX()方法,
(2) 调用包装类的valueOf()方法,先生成包装类对象,然后再赋值给基本类型(自动拆箱)。
还是直接使用包装类的parseXXX()方法比较好。
注意:char的包装类Character没有parseChar(String str);方法,String转换成char的时候可以使用String.charAt()方法。
FilePath类是我之前写的工具类,可以获取工程下的各种路劲字符串:利用反射动态获取当前工程下的文件路径_解决中文路径乱码问题
通过readUTF()和writeUTF()读写代码:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import com.lan.filepath.FilePath; public class ReadAndWriteString2 { public static void main(String[] args) throws IOException { String packagePath=FilePath.getSrcPackagePath(ReadAndWriteString2.class); System.out.println(packagePath); FileOutputStream out=new FileOutputStream(packagePath+"TestStringWR.txt"); DataOutputStream dof=new DataOutputStream(out); byte b=20;//-128~127 short s=80;// int i=40; long l=90l; float f=90.0f; double d=100.78; boolean flag=false; char ch='中'; String string="字符串1"; System.out.println(b); System.out.println(s); System.out.println(i); System.out.println(l); System.out.println(f); System.out.println(d); System.out.println(flag); System.out.println(ch); System.out.println(string); //把基本数据类型转换成String后写入文件, //String.valueOf()可以将基本类型转换成字符串, //也可以 b+"";加上一个空字符串就可 dof.writeUTF(String.valueOf(b)); dof.writeUTF(String.valueOf(s)); dof.writeUTF(String.valueOf(i)); dof.writeUTF(String.valueOf(l)); dof.writeUTF(String.valueOf(f)); dof.writeUTF(String.valueOf(d)); dof.writeUTF(String.valueOf(flag)); dof.writeUTF(String.valueOf(ch)); dof.writeUTF(string); dof.close(); out.close(); System.out.println("------------------------------"); FileInputStream in=new FileInputStream(packagePath+"TestStringWR.txt"); DataInputStream dif=new DataInputStream(in); byte btemp;//-128~127 short stemp;// int itemp; long ltemp; float ftemp; double dtemp; boolean flagtemp; char chtemp; String stringtemp; //使用包装类的paresXXX()方法可以把String转换成基本类型 btemp=Byte.parseByte(dif.readUTF()); stemp=Short.parseShort(dif.readUTF()); itemp=Integer.parseInt(dif.readUTF()); ltemp=Long.parseLong(dif.readUTF()); ftemp=Float.parseFloat(dif.readUTF()); dtemp=Double.parseDouble(dif.readUTF()); flagtemp=Boolean.parseBoolean(dif.readUTF()); //注意了char的包装类Character没有parseChar()方法 chtemp=dif.readUTF().charAt(0); stringtemp=dif.readUTF(); System.out.println(btemp); System.out.println(stemp); System.out.println(itemp); System.out.println(ltemp); System.out.println(ftemp); System.out.println(dtemp); System.out.println(flagtemp); System.out.println(chtemp); System.out.println(stringtemp); dif.close(); in.close(); } }
运行结果:
C:\Users\Administrator\Desktop\学习8\java\笔记\javaIO\coreJava\src\com\lan\dataoutputstream\ 20 80 40 90 90.0 100.78 false 中 字符串1 ------------------------------ 20 80 40 90 90.0 100.78 false 中 字符串1