您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第12章:JAVA IO】_数据操作流
发布时间:2020-12-29 19:31:49编辑:雪饮阅读()
DataOutputStream类也是一个输出流,也可以像文件中输出内容。
其中实例的writeChars方法用于写入字符串、writeChar方法用于写入字符、writeFloat方法用于写入浮点型数据、writeInt方法用于写入int型数据。
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
public class Hello{
public static void main(String args[]) throws Exception{
File f = new File("d:" + File.separator + "kasumi.txt");
DataOutputStream dos = new DataOutputStream(new FileOutputStream(f)) ;
String names[] = {"kasumi","ayane","momiji"};
float prices[] = {98.3f,30.3f,50.5f};
int nums[] = {3,2,1};
for(int i=0;i<names.length;i++){
dos.writeChars(names[i]) ;
dos.writeChar('\t') ;
dos.writeFloat(prices[i]) ;
dos.writeChar('\t') ;
dos.writeInt(nums[i]) ;
dos.writeChar('\n') ;
}
dos.close() ;
}
};
只是这样混合写入的数据会导致乱码,具体原因可能是因为各种数据类型的字节数不同。
DataInputStream输入流
DataInputStream输入流一般与DataOutputStream输出流是搭配使用的,DataOutputStream输出流写入到文件中以一种类似table的结构(仅条目,不包含头尾等额外附加部分),然后DataInputStream输入流则可以根据这个结构来进行读取。
对于上面写入的kasumi.txt的数据流则读取如:
import java.io.File;
import java.io.FileInputStream ;
import java.io.DataInputStream ;
public class Hello{
public static void main(String args[]) throws Exception{
File f = new File("d:" + File.separator + "kasumi.txt") ;
DataInputStream dis = new DataInputStream(new FileInputStream(f)) ;
try{
while(true){
//取本行所有写入在文件中的字符(\t与name)
char temp[] = new char[200] ;
int len = 0 ;
char c = 0 ;
while((c=dis.readChar())!='\t'){
temp[len] = c ;
len ++ ;
}
String name = new String(temp,0,len) ;
//取本行价格
float price = dis.readFloat();
//\t读取
dis.readChar() ;
//取本行行号
int num = dis.readInt() ;
//\n读取
dis.readChar() ;
System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;
}
}catch(Exception e){}
dis.close() ;
}
};
D:\>javac Hello.java
D:\>java Hello
名称:kasumi;价格:98.30;数量:3
名称:ayane;价格:30.30;数量:2
名称:momiji;价格:50.50;数量:1
其实这个代码还有待优化
import java.io.File;
import java.io.FileInputStream ;
import java.io.DataInputStream ;
public class Hello{
public static void main(String args[]) throws Exception{
File f = new File("d:" + File.separator + "kasumi.txt") ;
DataInputStream dis = new DataInputStream(new FileInputStream(f)) ;
try{
while(dis.available()!=0){
//取本行所有写入在文件中的字符(\t与name)
char temp[] = new char[200] ;
int len = 0 ;
char c = 0 ;
while((c=dis.readChar())!='\t'){
temp[len] = c ;
len ++ ;
}
String name = new String(temp,0,len) ;
//取本行价格
float price = dis.readFloat();
//\t读取
dis.readChar() ;
//取本行行号
int num = dis.readInt() ;
//\n读取
dis.readChar() ;
System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;
}
}catch(Exception e){
e.printStackTrace();
}
dis.close() ;
}
};
DataInputStream输入流读取的时候虽然也是基于文件逐行读取,但是循环条件最好还是不要用true这种死循环式的,DataInputStream输入流有自己的判断是否读取结束的方法。
只要DataInputStream实例的available方法返回值不为0,则表示该流还可以继续读取。
另外一个需要注意的就是这里会发现readChar方法总共用了3次,其中在取name字段的时候有循环的调用readChar,那么一般认为既然是逐行读取,那么第一层while循环中若再次循环则就是按当前行逐列进行读取,那么按说一个循环结束后整个列应该都是读取完了的。
其实这里把任意一行展开解析就可以看的很清楚了。比如第一行原数据大概是这样:
kasumi\t98.3f\t3
内层while循环也是逐个字符循环,”\t”虽然是转义字符,拥有两个字符,但是实际读取的时候则是一起读取出来了(个人看法)
所以实际内层的while循环结束后也就只是读取到第一个\t之前,虽然说\t也读取了,只是没有显示出来,那么下一位就是\t之后的float了,即这里的98.3f,那么98.3f再下一位就又是一个\t了,所以又readChar(这里和循环里面隐式读取作用一样,就是为了消耗偏移值,递增游标位置),那么再接下来就是int型的行号和最后的char型的换行符了。
最后就是在格式化价格的浮点型的时候这里格式符号为%5.2f,目的是数字一共5位,其中两位是小数,实际上这里%5.2f和%.2f是相同的输出结果。
关键字词:java,流