关于java的IO流出现一点奇怪的事情,求高人解答一下?

拎干的毛巾 2013-06-08 09:04:40
这是我用来读一段数据的代码,并且把每列用"\t"分隔。
public class ParseFileTxt {

FileInputStream fi = null;
BufferedReader br = null;
String newFilePath = "";
File newFile = null;
FileWriter fw = null;
BufferedWriter bw = null;
public ParseFileTxt() throws Exception {

fi = new FileInputStream("D:\\file\\wttick.txt");
br = new BufferedReader(new InputStreamReader(fi,"GB2312"));
newFilePath = "D:\\file\\NewFile\\newWttick.txt";
newFile = new File(newFilePath);
fw = new FileWriter(newFile, true);
bw = new BufferedWriter(fw);
}
public static void main(String[] args) throws Exception{
ParseFileTxt parseFile = new ParseFileTxt();
parseFile.parseFile();
}
private void parseFile()throws Exception {
String temp = "";
while(true){
String line ="";
byte[] cbuf = new byte[1024 * 256];
//首先读取数据241个字节
int num = fi.read(cbuf, 0, 272);
if(num<0){
break;
}
//首先读取数据241个字节
String str1 = new String(cbuf,0,15 , "GB2312").trim();
String str2 = new String(cbuf,17,20, "GB2312").trim();
String str3 = new String(cbuf,38,10 , "GB2312").trim();
String str4 = new String(cbuf,49,10 , "GB2312").trim();
String str5 = new String(cbuf,60,12 , "GB2312").trim();
String str6 = new String(cbuf,80,17 , "GB2312").trim();
String str7 = new String(cbuf,101,11 , "GB2312").trim();
String str8 = new String(cbuf,113,9 , "GB2312").trim();
String str9 = new String(cbuf,124,13 , "GB2312").trim();
String str10 = new String(cbuf,143,9 , "GB2312").trim();
String str11 = new String(cbuf,155,7, "GB2312").trim();
String str12 = new String(cbuf,164,8 , "GB2312").trim();
String str13 = new String(cbuf,174,16 , "GB2312").trim();
String str14 = new String(cbuf,195,15 , "GB2312").trim();
String str15 = new String(cbuf,215,27 , "GB2312").trim();

line = str1 + "\t" + str2 + "\t" +str3 + "\t" +str4 + "\t" +str5 + "\t" +str6
+ "\t" +str7 + "\t" +str8 + "\t" +str9 + "\t" +str10 + "\t" +str11 + "\t" +str12
+ "\t" +str13 + "\t" +str14 + "\t" + str15 ;

bw.write(line);
bw.newLine();
System.out.println(line);
bw.flush();
}
}


这里是数据
112.5.235.135     其他客户端           20130513   00:03:14   13075997362          取得预设帐号         00:03:14   处理成功                                                                                                                                                      
112.5.235.135 Gphone手机 20130513 00:03:22 6097976 客户校验 00:03:22 处理成功 13075997362
117.136.17.56 其他客户端 20130513 00:03:29 13908517304 取得预设帐号 00:03:29 处理成功
117.136.17.56 Gphone手机 20130513 00:03:37 66155 客户校验 00:03:37 处理成功 13908517304
211.139.92.12 其他客户端 20130513 00:06:03 18293613691 取得预设帐号 00:06:03 处理成功
211.139.92.12 Gphone手机 20130513 00:06:11 10071877 客户校验 00:06:11 处理成功 18293613691
117.136.39.65 其他客户端 20130513 00:06:49 15012745498 取得预设帐号 00:06:49 处理成功
117.136.39.65 Gphone手机 20130513 00:07:19 80040879 客户校验 00:07:19 处理成功 15012745498
202.100.77.210 Gphone手机 20130513 00:08:12 10037730 委托买入 00:08:12 处理成功 15309475358 600609 3.84 2000 A553975592 1746 1746
117.136.9.60 mobile手机 20130513 00:09:45 15910136780 取得预设帐号 00:09:45 处理成功 15910136780
117.136.9.60 mobile手机 20130513 00:09:46 15910136780 取得预设帐号 00:09:46 处理成功 15910136780 00:12:45 处理成功


这些数据不是以tab分隔的,每一行的bytes都是272个。就是这里的num 肯定是272个,这个没有疑问。
并且我把当中的核心代码抽出来,一行一行的读,都能得到我想要的效果,如果一起读,从第二行开始就出现错误了,我不知道哪里错了 ,暂时还没找出原因来!!!
错误是这样的:
112.5.235.135	其他客户端	20130513	00:03:14	13075997362	取得预设帐号	00:03:14	处理成功							
112.5.235.135 Gphone手机 2013051 00:03:2 6097976 客户校验 00:03:2 处理成 1307599736
117.136.17. 其他客户端 20130 13 00:03 29 1390851 取得预设帐? 00:03 29 处理 功
117.136.1 56 Gphone手机 201 0513 00: 3:37 66155 客户校验 00: 3:37 处 成功 139085
211.139 2.12 其他客户端 2 130513 0 :06:03 182 取得预? ? 0 :06:03 理成功
211.1 .92.12 Gphone手? 20130513 00:06:11 1 客户? 00:06:11 处理成功 18 691
117 36.39.65 其他客? 端 20130513 00:06:49 5498 取? 枵屎? 00:06:4 处理成功
1 .136.39.65 Gphon 手机 201305 3 00:07:19 879 ? Q? 00:07 9 处理成功 2745498


从第二行开始 很多地方都已经不对了,不知道什么情况,找了半天没找出来。。
...全文
279 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fei1710 2013-06-09
  • 打赏
  • 举报
回复
int num = fi.read(cbuf, 0, 272); 每行结束有行结束符,你没计算在内。
n27741 2013-06-09
  • 打赏
  • 举报
回复
引用 9 楼 Henry_YQH 的回复:
[quote=引用 6 楼 N27741 的回复:] 把272改成274即可。因为末尾有一个换行符没有读。 所以每次 read,都算到下一个buf里面,造成定位不准确。 一个换行符,占2个bye readLine,会忽略换行符,而采用null结尾。所以看到长度是272

int num = fi.read(cbuf, 0, 274);
我知道是这个问题 查了一下"\n"是占一个字符,所以我改成了273 ,发现还是有问题,不知道为什么是274。 然道"\n"占了2个字符?[/quote] 嗯,\n 是一个 char,占2个字节。注意是byte! 你是按byte来读的不是按char来读的。
拎干的毛巾 2013-06-09
  • 打赏
  • 举报
回复
引用 6 楼 N27741 的回复:
把272改成274即可。因为末尾有一个换行符没有读。 所以每次 read,都算到下一个buf里面,造成定位不准确。 一个换行符,占2个bye readLine,会忽略换行符,而采用null结尾。所以看到长度是272

int num = fi.read(cbuf, 0, 274);
我知道是这个问题 查了一下"\n"是占一个字符,所以我改成了273 ,发现还是有问题,不知道为什么是274。 然道"\n"占了2个字符?
拎干的毛巾 2013-06-09
  • 打赏
  • 举报
回复
引用 6 楼 N27741 的回复:
把272改成274即可。因为末尾有一个换行符没有读。 所以每次 read,都算到下一个buf里面,造成定位不准确。 一个换行符,占2个bye readLine,会忽略换行符,而采用null结尾。所以看到长度是272

int num = fi.read(cbuf, 0, 274);
大神 正解!!!!!
forgetsam 2013-06-09
  • 打赏
  • 举报
回复
引用 楼主 Henry_YQH 的回复:
这些数据不是以tab分隔的,每一行的bytes都是272个。就是这里的num 肯定是272个,这个没有疑问。
那是你自认为没有疑问,数据“位移”,问题明摆着就在这里。
n27741 2013-06-09
  • 打赏
  • 举报
回复
把272改成274即可。因为末尾有一个换行符没有读。 所以每次 read,都算到下一个buf里面,造成定位不准确。 一个换行符,占2个bye readLine,会忽略换行符,而采用null结尾。所以看到长度是272

int num = fi.read(cbuf, 0, 274);
书断华 2013-06-08
  • 打赏
  • 举报
回复
字节应该都读出来了 就是你在拆分字节的时候可能出错了。
ZHXDD 2013-06-08
  • 打赏
  • 举报
回复
你读文本文件应该用字符流一次读一行来解决这问题,建议你用BufferedReader,每行如果是以某种符号分隔就用split,如果不是你只能用正则解决这个问题了。 这段代码中: byte[] cbuf = new byte[1024 * 256]; //首先读取数据241个字节 int num = fi.read(cbuf, 0, 272); fi.read(cbuf, 0, 272)读本地文件有可能是272个字节,但如果读的是网络流他就不一定是272个字节,num才是真实读多少个字节的数量。
拎干的毛巾 2013-06-08
  • 打赏
  • 举报
回复
引用 1 楼 xue08161981 的回复:
顶,我把当中的核心代码抽出来,一行一行的读,都能得到我想要的效果
什么意思??
xue08161981 2013-06-08
  • 打赏
  • 举报
回复
顶,我把当中的核心代码抽出来,一行一行的读,都能得到我想要的效果

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧